reactjs - 路由参数更改时组件不会重新加载新数据
问题描述
我注意到,当我在 /users/:id1 链接上尝试访问新的用户个人资料页面 /users/:id2 时,它不会重新加载我要访问的新用户 ID 的数据,但是如果我来自 /forums 或 /search 等其他页面,它将加载正常
我已经尝试过componentWillReceiveProps
,但我不确定我是否正确实施了它,也不知道它是否可以安全使用 b/c 现在可能已弃用???
我也试过用 withRouter 包装我的 UserProfile 但似乎更糟,因为当我刷新页面时没有数据加载
应用程序.js
<BrowserRouter onUpdate={() => window.scrollTo(0, 0)} >
<div>
<Switch>
<Route exact path="/search" component={Search}/>
<Route exact path="/forum" component={Forum}/>
<Route exact path="/user/:id" component={UserProfile} currentUserId={this.state.currentUserId}/>
</Switch>
</div>
</BrowserRouter>
我的链接看起来如何
<Link className="pt-button pt-minimal" to={"/user/"+this.props.currentUserId}>My Profile</Link>
我对 componentWillReceiveProps 的尝试
if (nextProps.match.params.id !== this.props.match.params.id) {
this.setState({
userId: nextProps.match.params.id,
})
this.componentWillMount();
}
预期:单击指向另一个用户配置文件的链接时,它会重定向到具有该新用户配置文件数据的新用户配置文件
实际:网址更改但没有数据重新加载。
解决方案
我认为您非常接近,但是误解生命周期方法以及何时/如何调用它们会导致一些问题。
您可能应该使用componentDidUpdate
. 我也会避免将道具存储在状态中,因为它们需要保持同步。
componentDidUpdate(prevProps) {
if (prevProps.match.params.id !== this.props.match.params.id) {
this.setState({ user: null });
fetchUserData(this.props.match.params.id)
.then((user) => {
this.setState({ user: user });
})
}
}
另外,不要手动触发生命周期方法(如评论中所述)
推荐阅读
- r - 将未命名的规则结构化 R 列表转换为命名 R 列表
- python - 这似乎不起作用。没有错误消息或任何东西,“时间”只是不打印。now 和 decisecond 都显示正确的值。
- javascript - 如果数组中任何元素的总和等于给定值,则检查数组
- python - 如何修复 TypeError:不支持的操作数问题
- mysql - 创建一个红移表 ddl 以匹配镶木地板文件
- php - 将 laravel 5.7 中的项目上传到共享服务器时出现错误 500
- git - 如果我自己重新设置 git 分支怎么办?
- java - Java 子类使用来自同一超类的另一个子类的数据
- bash - 将标准输入重定向几行,然后返回键盘输入
- php - 重新创建 CakePHP 1.2 项目以升级