javascript - 嵌套组件列表未正确更新
问题描述
我有一个递归定义的组件树,它是这样的:
class MyListItem extends Component {
...
componentDidMount() {
this.listener = dataUpdateEvent.addListener(event, (newState) => {
if(newState.id == this.state.id) {
this.setState(newState)
}
})
}
...
render() {
return (
<div>
<h1>{this.state.title}</h1>
<div>
{this.state.children.map( child => {
return (<MyListItem key={child.id} data={child} />)
})}
</div>
</div>
)
}
}
所以基本上这个视图渲染了一系列嵌套列表来表示树状数据结构。 dataUpdateEvent
以多种方式触发,旨在触发相关组件和所有子列表的重新加载。
但是我遇到了一些奇怪的行为。具体来说,如果一个MyListItem
组件及其子组件快速连续更新,我会看到顶级列表按预期更改,但子列表仍处于未更改状态。
有趣的是,如果我对列表项使用随机键,一切都会完美运行:
...
return (<MyListItem key={uuid()} data={child} />)
...
尽管存在一些不良的 UI 滞后。我的想法是,可能与导致此问题的基于密钥的缓存有关。
我究竟做错了什么?
解决方案
React 使用键来映射更改,因此您需要这些。如果您不使用唯一键,控制台中应该会出现警告。你有重复的id吗?还可以尝试将所有数据作为道具传递而不是设置状态,那么你根本不需要监听器。
推荐阅读
- linux - 有关 Linux 用户的登录时间和注销时间的信息
- spring - 带有选择(下拉)的表单不显示错误代码
- python - Pandas 系列中某个值的返回索引
- python - 如何提高比较列表元素的效率?
- c# - Azure DevOps - 无法从 ASP.NET 构建设置中的默认解决方案文件设置中取消链接
- excel - 比较和删除基于两列 VBA 的重复行
- javascript - Jquery正在发送多个请求
- reactjs - 如果不清除 cookie,我无法在谷歌云(应用引擎)上使用新版本
- html - Angular 8 routerLink 无法正常工作
- java - 配置 RetryTemplate 以测试除 404 之外的所有失败代码