Javascript 位置参数更改时,React路由器未卸载
这个问题快把我逼疯了,我得到了一个由Javascript 位置参数更改时,React路由器未卸载,javascript,reactjs,react-router,Javascript,Reactjs,React Router,这个问题快把我逼疯了,我得到了一个由create-react-app创建的简单小应用,我正在使用react-Router JSX: 在页面组件中,我在componentDidMount上有一个fetch,它在第一次加载路由时按预期工作 例如,我访问:/pages/13,然后它获取页面数据,但当我打开时:/pages/13,然后单击链接组件(从React Router导入)将我重定向到:/pages/15-然后更新页面ID属性,但它不会重新呈现 页面组件在之前从未运行过componentWil
create-react-app
创建的简单小应用,我正在使用react-Router
JSX:
在页面组件中,我在componentDidMount
上有一个fetch,它在第一次加载路由时按预期工作
例如,我访问:/pages/13
,然后它获取页面数据,但当我打开时:/pages/13
,然后单击链接组件(从React Router
导入)将我重定向到:/pages/15
-然后更新页面ID
属性,但它不会重新呈现
页面
组件在之前从未运行过componentWillUnmount
,或者在之后从未运行过componentDidMount
预期行为:
/pages/13
→ <代码>渲染()→ <代码>组件安装()→ <代码>渲染()/pages/15
→ <代码>组件将卸载()→ <代码>渲染()
→ <代码>组件安装()→ <代码>渲染()我正在使用以下版本:
- 反应:16.3.2
- 反应dom:16.3.2
- 反应路由器dom:4.2.2
我做错了什么?我还没有反应过来,所以请注意:)您的问题是,
componentDidMount
只在组件完全装入时执行,并且只发生一次。在这种情况下,更改route参数不会更改组件,我的意思是,当您更改pageId
时,您仍然在同一个组件中,因此componentDidMount
将不再执行。
那么你能做什么呢?好吧,我建议你研究一下componentWillReceiveProps(newProps)
方法,只要组件的道具即将被修改,就会执行这个方法,在这种情况下,这就是你要寻找的,因为根据:
您可以在不同的位置访问匹配对象:
将组件路由为this.props.match;
路由渲染为({match})=>();
将子项路由为({match})=>();
使用路由器作为this.props.match;
matchPath作为返回值
匹配对象(包含路由参数)通过组件的道具提供
所以,简短的回答。第一次提取使用componentDidMount
,其余所有提取调用使用componentwillreceiveprops(newProps)
查看更多信息
注意:我不知道
componentwillreceiveprops(newProps)
即将被弃用,无论如何,它建议您使用getDerivedStateFromProps(nextrops,prevState)
这基本上是相同的当参数改变时,您的路由不会重新安装组件。这是意料之中的行为。您应该通过组件WillReceiveProps
捕获参数更改,否则如果您希望强制重新安装,您应该使用
可能的重复感谢!是的,这就是为什么我避免使用ComponentWillReceiveProps(),而是研究getDerivedStateFromProps(),而最终使用componentDidUpdate()和getDerivedStateFromProps()的组合。它现在起作用了!美好的我很高兴,至少我可以为您指出解决方案:)
<Router>
<Route path="/pages/:pageId" component={Page} />
</Router>