成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

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

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

[[409483]]

本文轉載自微信公眾號「JS每日一題」,作者灰灰。轉載本文請聯系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. 

根據意思就可以得到渲染列表的每一個子元素都應該需要一個唯一的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屬性的作用是用于判斷元素是新創建的還是被移動的元素,從而減少不必要的Diff

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

如果列表數據渲染中,在數據后面插入一條數據,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算法中,前面的元素由于是完全相同的,并不會產生刪除創建操作,在最后一個比較的時候,則需要插入到新的DOM樹中

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

下面再來看看在前面插入數據時,使用key與不使用key的區別:

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

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

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

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

主要是因為不寫key是將所有的文本內容替換一下,節點不會發生變化

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

三、總結

良好使用key屬性是性能優化的非常關鍵的一步,注意事項為:

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

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

參考文獻

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

 

https://segmentfault.com/a/1190000017511836

 

責任編輯:武曉燕 來源: JS每日一題
相關推薦

2024-08-28 11:58:02

2021-07-05 11:06:11

組件React通信

2021-08-02 08:34:20

React性能優化

2021-06-29 09:47:34

ReactSetState機制

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函數組件

2021-03-01 12:40:02

JavaserialVersi代碼

2021-12-20 10:30:33

forforEach前端

2023-02-17 08:10:24

2021-06-30 07:19:36

React事件機制

2021-12-10 12:01:37

finalfinallyfinalize

2024-04-03 15:33:04

JWTSession傳輸信息

2021-11-30 07:44:50

FinalFinallyFinalize

2024-09-19 08:42:43

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产一区二区三区在线 | 国产一区视频在线 | 中文字幕一区二区三区不卡 | 日韩中文在线 | 亚洲va欧美va天堂v国产综合 | 国产aⅴ爽av久久久久久久 | 男人天堂视频在线观看 | 男人的天堂avav | 国产一区二区三区 | 日韩中文字幕av | 亚洲精品视频在线播放 | 天堂一区二区三区 | 盗摄精品av一区二区三区 | 国产精品区一区二 | 奇米四色影视 | 国产精品久久久久国产a级 欧美日韩国产免费 | 国产精久久久 | 99精品视频在线观看 | 久久久久久成人 | 国产成人精品一区二区 | 一区二区三区在线 | 欧 | 国产日韩精品视频 | 国产伦精品一区二区三毛 | 国产一区二区在线91 | 中文字幕久久精品 | 日韩免费高清视频 | 中文字幕在线视频精品 | 欧美日韩在线一区 | 欧美在线观看网站 | 亚洲免费一区二区 | 午夜精品三区 | 日韩亚洲视频 | 国产成人精品一区二区三区在线观看 | 国产九九九九 | 一本岛道一二三不卡区 | 日本人做爰大片免费观看一老师 | 中文字幕国产日韩 | 天天影视亚洲综合网 | 精品一二三 | 久久精品亚洲精品国产欧美 | 黄色免费网站在线看 |