反应,反应路由器和异步数据加载

时间:2016-06-30 21:11:16

标签: reactjs react-router alt.js

我使用react,alt.js和react-router,并使用基本CRUD构建应用程序。有一个菜单项为"创建项目",它会调出一个模态(使用react-bootstrap ...)并在提交时触发一个动作在后端创建一些模型,然后执行browserHistory.push(在react-router docs中推荐)完成后,转到新创建项目的项目页面。

所以在基本情况下,这是有效的。例如,如果我在主应用页面上工作。但是,如果我已经在其他项目的项目详情页面上(让我们说我在/item/1并且我刚刚创建了/item/2,那么我尝试重定向到来自第/item/2页的/item/1)。

我的异步加载逻辑(至少,fetchItem的动作调用)位于componentDidMount反应组件的ItemViewPage中,根据所有示例,这似乎很典型我可以在网上找到。

问题是,如果页面当前已经呈现,则永远不会调用componentDidMount,因为该组件已经挂载(!)。因此,我的网页网址更新为/item/2,但内容仍为/item/1

所以,我的问题是....是的。从componentDidMount启动数据加载是错误的吗?我应该做一些其他的生命周期方法(比如componentWillReceiveProps,因为反应路由器会设置一个新的id)?或者是否还有一些其他地方完全可以解决数据加载问题(例如,反应路由器是否具有某些功能我不知道处理此问题)?

1 个答案:

答案 0 :(得分:2)

由于React很聪明,并且知道您为路径重新使用该组件,因此该组件将保持挂载状态。您选择的生命周期方法将无法处理该作业,因为它会在初始安装组件时调用一次。

我建议您使用componentWillReceiveProps,然后在那里,您可以检查项目的id字段是否已更改。这意味着您应该更新,因为要呈现新的不同数据。