reactjs - 为什么我的 React 组件列表在使用 Index 作为 key prop 时不会弄乱?
问题描述
我在网上找了一些资料,就是说在使用地图的时候不应该把index
参数当成key
道具。例如:
{myPersonsState.map( (person, index) => {
return <Person key={index} />
})
根据我的发现,这并不好。
这样做的原因是,每当您在状态中操作数据时(例如,删除数组中的第 3 个元素),每个元素的键,从第 3 个位置开始,肯定会改变,因为每个元素的键是它的索引(肯定会改变),因此,React 会将新元素的键视为旧元素(在更改之前)。
按照这种逻辑,认为 React 将从第 3 个位置开始获取新元素并给它们旧键,这将把它们视为旧键是唯一合乎逻辑的 - 这将导致 React 认为它不需要创建它们的新实例,并使用以前的元素数据来创建它们。
那么,为什么在实际操作状态和重新渲染时我看不到呢?
为什么 React 知道它自己是一个新元素,即使它有另一个元素的先前键?
解决方案
React 的 key prop 让你能够控制组件实例。每次 React 渲染你的组件时,它都会调用你的函数来检索它用来更新 DOM 的新 React 元素。如果您返回相同的元素类型,它会保留这些组件/DOM 节点,即使所有 * 道具都已更改。
Key prop 允许您返回完全相同的元素类型,但强制 React 卸载前一个实例,并安装一个新实例。这意味着当时已存在于组件中的所有状态都将被完全删除,并且该组件已“重新初始化”以用于所有意图和目的。对于组件,这意味着 React 将对效果(或 componentWillUnmount)运行清理,然后它将运行状态初始化程序(或构造函数)和效果回调(或 componentDidMount)。
推荐阅读
- javascript - 测试字符串中的 n 位数字
- go - Golang Module问题--包xxx/xxxx不在GOROOT中
- python - 如何有效地从 Pandas 的数据框标头中提取日期年份?
- php - PHP Mysql Max+1 在同一张表中
- java - 从 Java Selenium 的下拉列表中选择一个选项
- python-3.x - 如何在 tkinter 窗口中使用带有滚动条的 .grid?
- angular - Angular 应用程序部署 IIS 自动化,例如使用 Docker/Jenkins 等
- sql - 多列匹配时转置列
- r - install.packages 函数无法识别 RStudio 中的新库路径
- android - 使用 API 获取 Android 应用程序的总下载量