自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

面試官:React中的Key有什么作用?

開發(fā) 前端
跟Vue一樣,React 也存在diff算法,而元素key屬性的作用是用于判斷元素是新創(chuàng)建的還是被移動的元素,從而減少不必要的Diff。

[[409483]]

本文轉(zhuǎn)載自微信公眾號「JS每日一題」,作者灰灰。轉(zhuǎn)載本文請聯(lián)系JS每日一題公眾號。

一、是什么

首先,給出react組件中進行列表渲染的一個示例:

  1. const data = [ 
  2.   { id: 0, name'abc' }, 
  3.   { id: 1, name'def' }, 
  4.   { id: 2, name'ghi' }, 
  5.   { id: 3, name'jkl' } 
  6. ]; 
  7.  
  8. const ListItem = (props) => { 
  9.   return <li>{props.name}</li>; 
  10. }; 
  11.  
  12. const List = () => { 
  13.   return ( 
  14.     <ul> 
  15.       {data.map((item) => ( 
  16.         <ListItem name={item.name}></ListItem> 
  17.       ))} 
  18.     </ul> 
  19.   ); 
  20. }; 

然后在輸出就可以看到react所提示的警告信息:

  1. Each child in a list should have a unique "key" prop. 

根據(jù)意思就可以得到渲染列表的每一個子元素都應(yīng)該需要一個唯一的key值

在這里可以使用列表的id屬性作為key值以解決上面這個警告

  1. const List = () => { 
  2.   return ( 
  3.     <ul> 
  4.       {data.map((item) => ( 
  5.         <ListItem name={item.namekey={item.id}></ListItem> 
  6.       ))} 
  7.     </ul> 
  8.   ); 
  9. }; 

二、作用

跟Vue一樣,React 也存在diff算法,而元素key屬性的作用是用于判斷元素是新創(chuàng)建的還是被移動的元素,從而減少不必要的Diff

因此key的值需要為每一個元素賦予一個確定的標識

如果列表數(shù)據(jù)渲染中,在數(shù)據(jù)后面插入一條數(shù)據(jù),key作用并不大,如下:

  1. this.state = { 
  2.     numbers:[111,222,333] 
  3.  
  4. insertMovie() { 
  5.   const newMovies = [...this.state.numbers, 444]; 
  6.   this.setState({ 
  7.     movies: newMovies 
  8.   }) 
  9.  
  10. <ul> 
  11.     { 
  12.         this.state.movies.map((item, index) => { 
  13.             return <li>{item}</li> 
  14.         }) 
  15.     } 
  16. </ul> 

前面的元素在diff算法中,前面的元素由于是完全相同的,并不會產(chǎn)生刪除創(chuàng)建操作,在最后一個比較的時候,則需要插入到新的DOM樹中

因此,在這種情況下,元素有無key屬性意義并不大

下面再來看看在前面插入數(shù)據(jù)時,使用key與不使用key的區(qū)別:

  1. insertMovie() { 
  2.   const newMovies = [000 ,...this.state.numbers]; 
  3.   this.setState({ 
  4.     movies: newMovies 
  5.   }) 

當擁有key的時候,react根據(jù)key屬性匹配原有樹上的子元素以及最新樹上的子元素,像上述情況只需要將000元素插入到最前面位置

當沒有key的時候,所有的li標簽都需要進行修改

同樣,并不是擁有key值代表性能越高,如果說只是文本內(nèi)容改變了,不寫key反而性能和效率更高

主要是因為不寫key是將所有的文本內(nèi)容替換一下,節(jié)點不會發(fā)生變化

而寫key則涉及到了節(jié)點的增和刪,發(fā)現(xiàn)舊key不存在了,則將其刪除,新key在之前沒有,則插入,這就增加性能的開銷

三、總結(jié)

良好使用key屬性是性能優(yōu)化的非常關(guān)鍵的一步,注意事項為:

  • key 應(yīng)該是唯一的
  • key不要使用隨機值(隨機數(shù)在下一次 render 時,會重新生成一個數(shù)字)
  • 避免使用 index 作為 key

react判斷key的流程具體如下圖:

參考文獻

https://zh-hans.reactjs.org/docs/lists-and-keys.html#gatsby-focus-wrapper

 

https://segmentfault.com/a/1190000017511836

 

責任編輯:武曉燕 來源: JS每日一題
相關(guān)推薦

2024-08-28 11:58:02

2021-07-05 11:06:11

組件React通信

2021-06-29 09:47:34

ReactSetState機制

2021-08-02 08:34:20

React性能優(yōu)化

2021-07-01 07:51:45

React事件綁定

2021-07-02 07:06:20

React組件方式

2025-03-05 02:10:00

2020-04-23 14:09:13

URI挖坑前端

2023-10-12 07:35:45

面試線程通信

2021-07-14 08:00:13

reactCss模塊

2025-04-01 00:00:00

項目CRUD單例模式

2021-07-08 06:51:29

React函數(shù)組件

2021-03-01 12:40:02

JavaserialVersi代碼

2023-02-17 08:10:24

2021-12-20 10:30:33

forforEach前端

2021-11-30 07:44:50

FinalFinallyFinalize

2024-04-03 15:33:04

JWTSession傳輸信息

2024-09-19 08:42:43

2021-12-10 12:01:37

finalfinallyfinalize

2024-09-09 08:30:56

代碼
點贊
收藏

51CTO技術(shù)棧公眾號