reactjs - 如果我的基本路由相同,histroy.push() 在反应路由器中不起作用
问题描述
我看到了很多问题,但没有得到答案。当我history.push('/user')
打开时'/dashboard'
,它工作得很好,因为我的基本路线不同,即user!=dashboard
。但是当我在路上'/user'
,现在我想去history.push('/user/87')
。这里发生了奇怪的事情,因为基本路由相同user===user
,我的 url 更改但我的组件没有再次呈现。我使用了<Link>
react-router-dom 提供的东西,但它也不起作用。
这是我的根本问题,
import { BrowserRouter } from 'react-router-dom'; //"^5.0.1"
ReactDOM.render((
<Provider store={store}>
<BrowserRouter>
<AppContainer />
</BrowserRouter>
</Provider>
), document.getElementById('root'));
请提供解决方案,这将是很大的帮助。
解决方案
我和我的同事发现了一个技巧,我们可以使用getDerivedStateFromProps
和componentDidUpdate
生命周期
state = {
currentUrl: this.props.match.url,
}
static getDerivedStateFromProps(props, state) {
let updatedState = {};
if (props.match.url !== state.currentUrl) {
updatedState.currentUrl = props.match.url;
}
return updatedState;
}
componentDidUpdate(prevProps) {
if (prevProps.match.url !== this.state.currentUrl) {
// re-initiate your state so that it can run your render lifecycle
this.setInitialState();
}
}
我们还可以通过提供第二个参数来使用useEffect钩子,[this.props.match.url]
这样当您的 url 更新时,您可以设置您的状态。
推荐阅读
- python - 烧瓶应用程序启动后如何使用调度程序运行方法
- xamarin - Android v10/api29 - 无法将文件写入内部存储文档
- docker - ansible dict 对象没有属性
- django - 在heroku上上传大文件需要什么?
- eclipse - 如何在单击按钮时执行处理程序
- android - 尝试在空对象引用上调用虚拟方法 'void androidx.lifecycle.LiveData.observe
- ios - Facebook 和 Google 登录后移至下一个 ViewController
- url - ckan db init 不接受 ckan.site_url 中的 IP 地址
- r - 将年份添加到列中并总结 R 中的值
- python - OCI:如何使用 oci sdk 从现有卷创建引导卷