React Redux网址更改事件/架构
我正在用React构建应用程序。如果有人想搜索会发生以下情况:React Redux网址更改事件/架构
- 状态更新:this.props.Address.selectedAddress
-
点击搜索按钮搜索事件是触发和我的网址改为:
this.props.handleSearch(address); let city = format_city(this.props.Address.selectedAddress); browserHistory.push('/searchfor/'+city);
工作正常。现在,我希望如果有人在应用程序中放入新的url,也会触发搜索事件。我做了什么至今:触发搜索和updateting selectedAddress:
class ResultsList extends React.Component {
constructor(props) {
super(props);
}
componentDidMount() {
this.unlisten = browserHistory.listen((location) => {
console.log('route changes');
if (this.selectedAdressNOTMatchUrl()){
this.handelAdressSearch()
}
});
}
componentWillUnmount() {
this.unlisten();
}
现在的单击事件的URL改变了,结果列表组件认为它必须处理此事件的问题。
我真的认为这是一个糟糕的设计,我已经做到了。当然,我可以添加一个时间戳或类似的东西来判断browserHistory.push('/ searchfor /'+ city);在URL更改事件被激发之前发生,但这有点难看。
每个想法都赞赏!
这里是我的设置:
export const store = createStore(
reducers,
window.__REDUX_DEVTOOLS_EXTENSION__ && window.__REDUX_DEVTOOLS_EXTENSION__(),
compose(
applyMiddleware(
thunkMiddleware,
promiseMiddleware()),
autoRehydrate()
)
);
const persistor = persistStore(store, {storage: localForage});
render(
<Provider store={store} persistor={persistor}>
<Router history={browserHistory}>
<Route path="/" component={Home}/>
<Route path="/searchfor/:city" component={Suche}/>
</Router>
</Provider>,
PS:还有一个备注 我试图做出反应路由器 - 终极版。它保存了url状态。但它没有解决问题。例如,如果我输入一个新的网址。然后,事件LOCATION_CHANGE被触发。但在此之后,我的persist/REHYDRATE事件被解雇。这样url就会变回来。这使得行为更加糟糕......
PPS:使其更清楚。一切正常。我想添加一个功能。如果用户自己输入一个新的url,那么如果他点击搜索按钮,应用程序应该以相同的方式处理。但它似乎是一个艰难的出价,因为在那种情况下,在我的应用程序中,重新水化事件被激发...
不知道如何减少持续(“补液”)的作品,所以也许我失去了一些至关重要的..但我想这可能是可能通过你的ResultsList
部件连接到终极版解决您的问题,以便它通过反应路由器URL参数吧,这样的事情
// ownProps is be the props passed down from the Route, including path params
const mapStateToProps = (state, ownProps) => {
return {
searchTerm: ownProps.city, // the url param
results: state.searchResults // after a manual url entry this will be undefined
}
}
const mapDispatchToProps = (dispatch) => {
return {
handleSearch: searchTerm => dispatch(searchAction(searchTerm))
};
};
(这样的代码应该是可能的according to these docs here)
然后,在ResultsList
里,你可以启动搜索H。
componentDidMount() {
const {searchTerm, handleSearch} this.props;
handleSearch(searchTerm);
}
}
render() {
const {results} = this.props;
return !results ?
<p>Loading..</p> :
<div>
{ results.map(renderResultItem) }
</div>
}
这样的组件就不必关心,如果该URL-PARAM从手动输入网址来了,或者从编程推URL从搜索页面。
非常感谢!我会尝试这个版本。我很确定补水。因为如果用户输入一个新的URL,事情会变得很难 - >搜索被触发,同时一个rehydrate事件被触发,因为用户给了浏览器重新加载和持续的命令/ Rehydrate尝试返回旧状态 – MichaelRazum
希望它能解决问题!也许组件会在用户输入手动URL之后的几毫秒内显示一些旧数据,但我猜测'componentDidMount'仍然会运行并触发新的搜索。但如果事实证明这不起作用,请随时删除“接受的答案”。 – jonahe
您使用的是什么版本的React Router? (请参阅package.json) – jonahe
我正在使用版本2.8.1。这里是我的配置的一部分: “pg-promise”:“^ 5.6.4”, “react”:“^ 15.5.4”, “react-bootstrap”:“^ 0.30.8”, “ react-debounce-input“:”^ 3.0.0“, ”react-dom“:”^ 15.4.2“, ”react-places-autocomplete“:”^ 4.1。3“, ”react-redux“:”^ 5.0.3“, ”react-responsive“:”^ 1.2.7“, ”react-router“:”^ 2.8.1“, ”react-router -bootstrap“:”^ 0.23.1“, ”react-scroll“:”^ 1.5.4“, ”redux“:”^ 3.6.0“, ”redux-persist“:”^ 4.8.0“ , “redux-promise-middleware”:“^ 4.2.0”, “redux-thunk”:“^ 2.2.0”, “winston”:“^ 2.3.1” – MichaelRazum
结果是什么时候在这个'this.props.handleSearch(address);'? – jonahe