React 踩坑

欧雷 发表于

React.Children 的方法会替换原来的 key

在为 @zora/adapter-ant-design 基于 Ant Design 封装 Tabs 组件时,需要遍历 props.children 从自己封装的 TabPane 组件实例获取信息再传给 Ant Design 的 TabPane

一开始是用 React.Children.map 处理,发现选项卡在未点击时不会出现选中状态,通过开发者工具才发现,生成组件的 key 值不是我指定的:

组件的 key 值变了
组件的 key 值变了

在外部使用我封装的 TabPane 时传的值是:

使用我封装的 TabPane
使用我封装的 TabPane

我封装的 Tabs 组件里在 React.Children.map 中返回:

生成 Ant Design 的 TabPane
生成 Ant Design 的 TabPane

大概浏览了下 Ant Design 和 rc-tabs 的源码并断点调试后推断应该是 React 的特性引起的,将 React.Children.map 改成 props.children.map 后果然好了!

在查看 React 源码后发现 React.Children 的方法会将原来的 key 值替换掉

生成新的 key 值
生成新的 key 值

综上所述,需要遍历 props.children 并要保留外部传入的 key 值不变时使用 props.children.map 替代 React.Children.map(其他方法同理)

创作不易,若给你提供了价值,还请不吝欧雷充电

左为微信,右为支付宝;充电累计 ¥88 以上可在付款时备注或邮件告知昵称和需要被链接的网址,会列在「赞助」页。其他方式与具体规则请见「资助」。

本文采用知识共享署名-非商业性使用 4.0 国际许可协议,可自由转载、引用,但需署名作者并注明文章出处且不能用于商业用途。

目录