前言
大家应该都知道,在 React 中 render collections 的 items 时, Keys 扮演着重要的角色, 它直接决定接下来的 rendered 和 re-rendered,下面话不多说,来一起看看详细的介绍:
React 不会 render 重复的 keys
为了彻底明白这个, 我们来声明一个这样的数组
const nums = [1, 2, 3, 5, 2]; // 它有两个元素的值是相等的
现在, 我们在 react 中来 render
<ul> {nums.map(num => <li key={num}>{num}</li>)} </ul>
这小段代码构造出的理想 element 结构, 应该是这样的
<ul> <li key="1">1</li> <li key="2">2</li> <li key="3">3</li> <li key="5">5</li> <li key="2">2</li> </ul>
然而, 实际 DOM 是这样的
<ul> <li>1</li> <li>2</li> <li>3</li> <li>5</li> </ul>
React 给出了以下warning
意思就是, 你必须为数组中的元素提供唯一的 key 值
React 会 re-render 某个 key 指向的内容发生变化的元素
我们来看一个向 users 集合添加 user 的例子
const users = [ {username:'bob'}, {username:'sue'} ]; users.map((u, i) => <div key={u.username}>{u.username}</div>);
render 的结果如下
<div key="bob">bob</div> <div key="sue">sue</div>
现在, 我们更新一下 users
const users = [ {username:'joe'}, {username:'bob'}, {username:'sue'} ];
render 的结果将会改变如下
<div key="joe">joe</div> <div key="bob">bob</div> <div key="sue">sue</div>
在上面例子中, React 调用了它的 Reconciliation 算法, 然后把返回的结果也就是一个 key 为 sue 的新元素添加到了 users 的最前面
如何选择 Key
其实, 即使内容没有发生变化, 改变对应的 key 值, React 也会触发 re-render.
使用 map 函数的 index 来作为元素的 key, 对开发者来说是常见的, 因为有时这是必要的, 然而, 有时这也会导致性能下降问题
users.map((u, i) => <div key={i}>{u.username}</div>);
还是以上的例子, 作了一点小小的改变后, React 瞬间由一个步骤变成了三个步骤:
- 将 id 为 "1" 的元素从 "bob" 更改为 "joe"
- 将 id 为 "2" 的元素从 "sue" 更改为 "bob"
- 新增一个 id 为 "3" 的元素, 他的值为 "sue"
总结
所以, 当我们使用 collections 时, 不仅不能忘了 Key, 还要学会选择好的 Key.
好了,以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对的支持。
原文链接: Why you need keys for collections in React
《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线
暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。
艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。
《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。
更新动态
- 群星《青春重置计划9新的凡人歌》[320KMP3][89.41MB]
- 苏曼《苏曼的夜晚HQII》[低速原抓WAV+CUE]
- 【电影原声】汉斯·季默《星际穿越》2014[FLAC+CUE整轨]
- 诹访内晶子AkikoSuwanai巴赫:小提琴协奏曲《J.S.BachViolinConcertos》(flac)
- 王力宏《十八般武艺》[低速原抓WAV+CUE]
- 王力宏《十八般武艺》[低速原抓WAV+CUE]
- 【爵士乐】VA-2024-ParamountJazzLoungeChillingExperience(FLAC)
- 群星《离歌 网剧原声带》[320K/MP3][249.78MB]
- 群星《离歌 网剧原声带》[FLAC/分轨][538.53MB]
- 群星《承欢记 电视剧影视原声带》[320K/MP3][109.99MB]
- 【欧美乡村】JohnnyLee-2024-13thOfJulyandEmotions(FLAC)
- 【流行爵士】PattiAustin-2024-LoveSongs(FLAC)
- 【爵士乐】VA-2024-SupremeLoungeChillSelectionJazzyVibeTunes(FLAC)
- 群星《承欢记 电视剧影视原声带》[FLAC/分轨][219.8MB]
- 群星《乘风2024 第1期》[320K/MP3][110.09MB]