【发布时间】:2019-12-20 08:31:16
【问题描述】:
我尝试在我的应用程序中使用 React Router v5 集成搜索页面。
如何使用搜索框更新网址的查询参数?
当我刷新我的应用程序时,我会丢失搜索结果和搜索字段的值。
我使用redux来管理我的搜索字段和搜索结果的值的状态,我认为通过url的参数会是一个更好的解决方案,但我不知道该怎么做。
我尝试了一个解决方案(见我的代码),但是url的查询参数与我的文本字段的值不同步
编辑:
我的组件 Routes.js
const Routes = (props) => {
return (
<div>
<Route exact path="/" component={Home} />
<Route
exact
path='/search'
component={() => <Search query={props.text} />}
/>
<Route path="/film/:id" component={MovieDetail} />
<Route path="/FavorisList" component={WatchList} />
<Route path="/search/:search" component={Search} />
<Route path="*" component={NotFound} />
</div>
)}
我的组件SearchBar.js(嵌入导航栏,Search路由显示搜索结果)
编辑:
我希望实现 Netflix 用于系列研究的方法。
我希望无论我在哪个页面都能够搜索,如果输入字段中有条目,我导航到search页面this.props.history.push (`` search /),如果输入字段为空,我导航到带有this.props.history.goBack () 的页面。
状态 inputChange 是一个标志,它阻止我在每次输入字符时推送到搜索页面。
要了解更多,我已经打开 = 此处的帖子 => How to change the route according to the value of a field
class SearchBar extends React.Component {
constructor(props) {
super(props);
this.state = {
inputValue:'',
};
}
setParams({ query }) {
const searchParams = new URLSearchParams();
searchParams.set("query", query || "");
return searchParams.toString();
}
handleChange = (event) => {
const query = event.target.value
this.setState({ inputValue: event.target.value})
if (event.target.value === '') {
this.props.history.goBack()
this.setState({ initialChange: true })
return;
}
if(event.target.value.length && this.state.initialChange){
this.setState({
initialChange:false
}, ()=> {
const url = this.setParams({ query: query });
this.props.history.push(`/search?${url}`)
this.search(query)
})
}
}
search = (query) => {
//search results retrieved with redux
this.props.applyInitialResult(query, 1)
}
render() {
return (
<div>
<input
type="text"
value={this.state.inputValue}
placeholder="Search movie..."
className={style.field}
onChange={this.handleChange.bind(this)}
/>
</div>
);
}
export default SearchBar;
组件 App.js
class App extends React.Component {
render(){
return (
<div>
<BrowserRouter>
<NavBar />
<Routes/>
</BrowserRouter>
</div>
);
}
}
export default App;
查询搜索结果(使用 Redux 管理)
export function applyInitialResult(query, page){
return function(dispatch){
getFilmsFromApiWithSearchedText(query, page).then(data => {
if(page === 1){
dispatch({
type:AT_SEARCH_MOVIE.SETRESULT,
query:query,
payload:data,
})
}
})
}
}
【问题讨论】:
-
如果你想用 react-router 改变 url,你可以在
history上使用replace方法 -
如果你想持久化一个 redux 存储,你应该查看像 github.com/rt2zz/redux-persist 这样的库
-
感谢您的回复,确实我认为 Redux 坚持。目前我正在为我的搜索组件使用 Redux,但也许我可以使用我的 URL 参数而不是 redux 从我的组件进行管理。我不确定
-
我只是尝试替换,它可以工作,但我需要使用它一次,因为我使用事件onChange,来更改页面,突然我想知道如何适应我的情况
-
@EricHasselbring
replace将销毁历史记录中的先前条目,这很少是预期的行为。它应该是push,同时确保字符串前面没有/
标签: reactjs