component instance 是基於它们的 key 来决定是否更新以及重复使用。
这里示范一个数字的list:
const App = () => {
const numbers = [1, 2, 3, 4, 5];
const listItems = numbers.map((number) =><li>{number}</li>);
return(
<div>
<ul>{listItems}</ul>
</div>
)
};
ReactDOM.render(<App/>, document.getElementById("root"));
虽然成功渲染画面了,但会跳出像这样的错误讯息:
"Warning: Each child in a list should have a unique 'key' prop.
这是因为React需要藉由key来辨别项目,所以必须指定key给阵列里的元素:
const id = [11, 22, 33, 44, 55]; // 指定一个id阵列
const App = () => {
const numbers = [1, 2, 3, 4, 5];
const listItems = numbers.map((number) =>
<li key={id.toString()}>
{number}
</li>
);
return(
<div>
<ul>{listItems}</ul>
</div>
)
};
ReactDOM.render(<App/>, document.getElementById("root"));
如果阵列的项目没有被分配 key,React 预设将会使用索引作为 key。
但在项目顺序可能改变的情况下,官方并不建议使用索引作为 key。
原因是,
错误的情况可以参考重新了解React中的key (Part 1),文章里面的举例很清楚!
当使用 array 索引值作为 key 的 component 进行重新排序时,component state 可能会遇到一些问题。由於 component instance 是基於它们的 key 来决定是否更新以及重复使用,如果 key 是一个索引值,那麽修改顺序时会修改目前的 key,导致 component 的 state(例如不受控制输入框)可能相互篡改导致无法预期的变动。
在同一个阵列里,每个被指定的 key 都必须是唯一值,这样React才可以辨别他们的身分。
但不同的阵列,也可以套用相同的key值。
const id = [11, 22, 33, 44, 55];
const App = () => {
const numbers = [1, 2, 3, 4, 5];
const people = ["Winnie", "Mary", "Tina"];
const listItems = numbers.map((number) =>
<li key={id.toString()}> // 指定id为key
{number}
</li>
);
const nameList = people.map((name) =>
<li key={id.toString()}> // 指定id为key
{name}
</li>
);
return(
<div>
<ul>{listItems}</ul>
<ul>{nameList}</ul>
</div>
)
};
ReactDOM.render(<App/>, document.getElementById("root"));
由此可知,因为key是给阵列里的元素辨别用,因此两个阵列可以指定相同的key值。
Key 的功能是提示 React,但它们不会被传递到元件里。
所以如果希望key值被传进元件,可以尝试这样的做法:
const content = example.map((post) =>
<Example
key={post.id}
id={post.id}
/>
);
虽然component不能读取 props.key,但因为props.id还是会被传进元件,就可以沿用props的特性重复使用key值。
【如内文有误还请不吝指教>< 并感谢阅览至此的各位:D 】
参考资料 :
-列表与 Key – React
-Reconciliation
-React Lists | Keys - React 教学 Tutorial
---正文结束---
>>: [Day09] 第九章-Laravel 操作心得及资料来源补充
您的订阅是我制作影片的动力 订阅点这里~ 影片程序码 (延续昨天) #均值 vs 列入各群权重 fi...
记得在第十五天的时候我有提过,目前 NOJ 有其中一个问题是我们会把一些机敏资料,像是 JWT 使用...
在开始铁人赛之後才发现这个月不该比铁人赛的 这个月的事情比平常都还要多 虽然硬着头皮写完了30天的文...
Event Flow 事件流 DOM的Event flow概念,指的是「网页元素接收事件的顺序」。 ...
前情提要 就是今天 (゚∀゚) 可以很嚣张自称铁人了 (゚∀゚) ((超级膨胀 最後的终点 一路写来...