javascript - 如何更新父更改的反应组件?
问题描述
如何更新父更改的反应组件?
以下是一个功能组件。id
它从父组件(基于类)和(id 是动态的并且会发生变化)接收道具。
所以基于id
我正在做以下渲染。
const DataComp = ({ id, }: any) => {
return (
<div className="myComp">
<div className="data" >
{MY_ITEMS[id].data.map(({ id, title, body }: any) => (
<div key={id}>
<p>{title}</p>
<p>{body}</p>
</div>
))}
</div>
</div>
);
};
export default DataComp;
但我收到错误无法读取未定义的属性映射。
当我在里面做一个控制台日志时,DataComp
我可以看到MY_ITEMS[id].data
. 我假设在几分之一秒内MY_ITEMS[id].data
未定义。
所以我尝试了以下方法
MY_ITEMS[id].data?.map
(MY_ITEMS[id].data || []).map
MY_ITEMS[id].data && MY_ITEMS[id].data.map
但这些都不会导致 UI 的更新。
这是父组件(基于类)
class Parent extends Component<any, any> {
constructor() {
super(props);
this.state = {
currentId: MY_ITEMS[0].id,
};
}
componentDidMount() {
this.setId(MY_ITEMS[0].id)
}
async setId(id) {
this.setState({currentId: id})
const someOtherAPIData = await getSomeOtherAPIData()
this.setState({someOtherAPIData})
}
public render() {
return (
<div className="parent">
<DataComp id={this.state.currentId} />
</div>
);
}
}
export default Parent;
NoteMY_ITEMS
是一个对象,MY_ITEMS[id].data
也是一个数组。
解决方案
id
对于对象中未定义或无效键的任何边缘情况MY_ITEMS
,您应该保护未定义的访问/映射。在 上使用可选链接MY_ITEMS[id]
,即MY_ITEMS[id]?.data
。这假设如果MY_ITEMS[id]
定义了有一个data
属性数组然后映射。
const DataComp = ({ id }: any) => {
return (
<div className="myComp">
<div className="data" >
{MY_ITEMS[id]?.data.map(({ id, title, body }: any) => (
<div key={id}>
<p>{title}</p>
<p>{body}</p>
</div>
))}
</div>
</div>
);
};
如果有机会甚至data
属性可能未定义,那么可选链也存在,即MY_ITEMS[id]?.data?.map(....
.
推荐阅读
- reactjs - 与 Typescript 反应:类型不匹配
- c# - 如何使 Service Fabric Reliable 集合不区分大小写?
- python-3.x - 如何避免弹出窗口在不同页面上随机出现一秒钟
- python-3.x - 如何在 python3.x 中编写文本文件?
- elasticsearch - 为什么我用 not_analyzed 字段和 es 'term query' 仍然返回分数?
- javascript - 如何从 firebase 实时数据库中打印多个对象?
- gremlin - 使用来自边缘和连接顶点的数据创建“连接”查询
- mysql - 想要匹配特定日期的记录应该只检查具有最新日期的记录
- ios - 为什么选择器视图不显示属性字符串?
- python - 如何实现仅保留前 n 个值并将其余所有值归零的自定义 keras 层?