React Redux网址更改事件/架构

问题描述:

我正在用React构建应用程序。如果有人想搜索会发生以下情况:React Redux网址更改事件/架构

  1. 状态更新:this.props.Address.selectedAddress
  2. 点击搜索按钮搜索事件是触发和我的网址改为:

    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,那么如果他点击搜索按钮,应用程序应该以相同的方式处理。但它似乎是一个艰难的出价,因为在那种情况下,在我的应用程序中,重新水化事件被激发...

+0

您使用的是什么版本的React Router? (请参阅package.json) – jonahe

+0

我正在使用版本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

+0

结果是什么时候在这个'this.props.handleSearch(address);'? – jonahe

不知道如何减少持续(“补液”)的作品,所以也许我失去了一些至关重要的..但我想这可能是可能通过你的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从搜索页面。

+1

非常感谢!我会尝试这个版本。我很确定补水。因为如果用户输入一个新的URL,事情会变得很难 - >搜索被触发,同时一个rehydrate事件被触发,因为用户给了浏览器重新加载和持续的命令/ Rehydrate尝试返回旧状态 – MichaelRazum

+0

希望它能解决问题!也许组件会在用户输入手动URL之后的几毫秒内显示一些旧数据,但我猜测'componentDidMount'仍然会运行并触发新的搜索。但如果事实证明这不起作用,请随时删除“接受的答案”。 – jonahe