我正在尝试获取要捕获的输入的值,然后使用该值更新部分URL,所有这一切都通过使用React,ES6等进行简单的单击。基本上是一个简单的搜索功能
所以我的组件看起来像这样:
class SearchInput extends Component {
constructor() {
super()
this.state = {
query: ''
}
}
componentDidMount = () => {
const handleSearchURL = window.location('/search/'+this.state.query+'/some-action')
this.setState({
handleSearch: handleSearchURL
})
}
queryChange = (evt) => {
this.setState({query: evt.target.value})
}
render() {
const { handleSearch, placeholder } = this.props
return (
<form>
<input id="site-search" type="search" placeholder={placeholder} value={this.state.query} />
<input type="submit" value="Search" onClick={this.handleSearch} />
</form>
)
}
}
但这只是给了我很多错误,似乎不喜欢window.location。实现这一目标的最佳方法是什么?我正在使用react-router,所以如果有更好的方法,我也很高兴
答案 0 :(得分:1)
您可以使用browserHistory.push
或this.context.router.push
。 componentDidMount也是一个lifeCycle函数,不需要绑定,只执行一次。您还需要一个handleSearch函数和一个关于输入查询更改的onChange
事件
class SearchInput extends Component {
constructor() {
super()
this.state = {
query: ''
}
}
static contextTypes = {
router: React.PropTypes.object
}
handleSearch = () => {
this.context.router.push(`'/search/${this.state.query}/some-action'`);
}
queryChange = (evt) => {
this.setState({query: evt.target.value})
}
render() {
const { handleSearch, placeholder } = this.props
return (
<form>
<input id="site-search" type="search" placeholder={placeholder} value={this.state.query} onChange={this.queryChange} />
<input type="submit" value="Search" onClick={this.handleSearch} />
</form>
)
}
}
&#13;
答案 1 :(得分:0)
您可以使用"browserHistory"
中的'react-router'
,然后将新网址推送到此处:
browserHistory.push('/search/{this.state.query}/some-action')
答案 2 :(得分:0)
function updateQueryStringParam(键,值,位置){
const urlQueryString = location.search;
const newParam = ${key}=${value}
;
let params = ?${newParam}
;
//如果存在“搜索”字符串,则从中构建参数
如果(urlQueryString){
const updateRegex =新的RegExp(([?&])${key}[^&]*
);
const removeRegex =新的RegExp(([?&])${key}=[^&;]+[&;]?
);
if (typeof value === 'undefined' || value == null || value === '') {
// Remove param if value is empty
params = urlQueryString.replace(removeRegex, '$1');
params = params.replace(/[&;]$/, '');
} else if (urlQueryString.match(updateRegex) !== null) {
// If param exists already, update it
params = urlQueryString.replace(updateRegex, `$1${newParam}`);
} else {
// Otherwise, add it to end of query string
params = `${urlQueryString}&${newParam}`;
}
}
///没有设置参数,所以我们不需要问号 return(参数=参数==='?'?'':参数); }
const url = updateQueryStringParam('filter',inputValue,this.props.location);
this.props.history.push(url);
答案 3 :(得分:0)
这对我来说是有效的,它带有react-hooks和react-router v5
import { useHistory } from 'react-router-dom';
const history = useHistory();
const handleSubmit = (e) => {
e.preventDefault();
history.push(`/search/${input}`);
};