Reactjs react、react路由器和异步数据加载

Reactjs react、react路由器和异步数据加载,reactjs,react-router,alt.js,Reactjs,React Router,Alt.js,我正在使用react、alt.js和react路由器,并使用基本CRUD构建一个应用程序。“创建项目”有一个菜单项,它会打开一个模式(使用react bootstrap…)并在提交时触发一个操作以在后端创建一些模型,然后执行浏览器历史记录。完成后按(react router docs中的建议)转到新创建项目的项目页面 所以在基本情况下,这是可行的。例如,如果我在主应用程序页面上,它就会工作。但是,如果我已经在另一个项目的项目详细信息页面上(假设我在/item/1上,并且我刚刚创建了/item/2

我正在使用react、alt.js和react路由器,并使用基本CRUD构建一个应用程序。“创建项目”有一个菜单项,它会打开一个模式(使用react bootstrap…)并在提交时触发一个操作以在后端创建一些模型,然后执行
浏览器历史记录。完成后按
(react router docs中的建议)转到新创建项目的项目页面

所以在基本情况下,这是可行的。例如,如果我在主应用程序页面上,它就会工作。但是,如果我已经在另一个项目的项目详细信息页面上(假设我在
/item/1
上,并且我刚刚创建了
/item/2
,因此我尝试从
/item/1
页面重定向到
/item/2


我的异步加载逻辑(至少对于
fetchItem
)位于
ItemViewPage
react组件的
componentDidMount
,从我在网上找到的所有示例来看,这似乎是非常典型的


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


所以,我的问题是……是的。从
componentDidMount
启动数据加载是否错误?我是否应该使用其他生命周期方法(例如,
组件将接收props
,因为react路由器将设置一个新id)?或者,是否有其他完全应该从中释放数据负载的地方(例如,react路由器是否有一些我不知道的处理此问题的功能)?

由于react是智能的,并且知道您在路由中重复使用组件,因此组件将保持安装状态。您选择的生命周期方法将无法处理该作业,因为它在组件的初始装载时被调用一次


我建议您使用
component willreceiveprops
,在那里您可以检查物品的
id
字段是否更改。这意味着您可能应该更新,因为有新的、不同的数据要呈现。

我猜,但最好是发布一些代码。可能会有很多代码!但无论如何,只要输入这个问题,我就会尝试
componentWillReceiveProps
,并在那里测试
if(this.props.params.id!==newProps.params.id){this.props.fetchItem(newProps.params.id);}
,这似乎有效。我想这是有道理的,但它让我吃惊的是,它不能开箱即用。在不知道您的
参数的情况下,它如何“开箱即用”?不管怎么说,很高兴你能成功。也许下次,在发布问题之前做更多的研究;)
componentDidMount
仅在第一次装入组件时触发。因此,
componentWillReceiveProps
实际上是正确的选择。大多数在线示例都没有提到这一点。这有点奇怪(至少我认为),您必须在两种不同的生命周期方法中复制您的负载逻辑。