jinliming2
2022-04-24 03:17:40 +08:00
循环不加 key 可以理解为默认就是用 index 做 key 的。
之所以循环会报警告而你手写 10 个 li 不会报警告,是因为循环通常是对一个数组变量进行的,数组是会变动的,一旦数组发生中间插入 /删除,react 不能简单的判断出变更位置,只能全部遍历重新更新做 diff ,所以需要你提供 key 信息来辅助定位。而手写的话,你所有写出来的 Node 位置都一定是确定的,即便是你在中间有写条件语句来控制是否输出,在隐藏的时候也会保留一个空 Node ,可以利用这些信息来判断变更发生的位置。
比如:
<li>1</li>
{show && <li>2</li>} // 隐藏时是个 false
{show ? <li>3</li> : null} // 隐藏时是个 null
<li>4</li>
在 show 为 false 的时候,渲染结果是 [<li>1</li>, false, null, <li>4</li>],4 个成员,show 为 true 的时候是 [<li>1</li>, <li>2</li>, <li>3</li>, <li>4</li>],也是 4 个成员,因此 react 是完全知道你的更新位置在哪的。