激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務器之家:專注于服務器技術及軟件下載分享
分類導航

node.js|vue.js|jquery|angularjs|React|json|js教程|

服務器之家 - 編程語言 - JavaScript - React - 詳解React中key的作用

詳解React中key的作用

2022-02-28 16:12夏花未眠 React

這篇文章主要介紹了React中key的作用,幫助大家更好的理解和學習使用React,感興趣的朋友可以了解下

要了解react中key的作用,可以從key的取值入手,key的取值可以分為三種,不定值、索引值、確定且唯一值

在下面的代碼中,key的取值是不定值(math.random())

問題: 點擊按鈕的時候,span的顏色會變成紅色嗎?

  1. import React, { useState } from 'react'
  2.  
  3. function App() { 
  4.   const [initMap, setInitMap] = useState([1,2,3,4]); 
  5.   const handleClick = () => { 
  6.     setInitMap([1,2,3,4]) 
  7.     var spanEle = document.getElementsByTagName('span'); 
  8.     Array.from(spanEle).map(it => it.style.color = 'red'
  9.   } 
  10.    
  11.   return ( 
  12.     <div className="App" id="app"
  13.       { 
  14.         initMap.map((it,index) => <div key={Math.random()}><span>color</span></div>) 
  15.       } 
  16.       <button onClick={() => handleClick()}></button> 
  17.     </div> 
  18.   ); 
  19.  
  20. export default App; 

答案是:不會

這個問題涉及react渲染機制和diff算法

官網中對于diff有如下規則:

  • 當元素類型變化時,會銷毀重建
  • 當元素類型不變時,對比屬性
  • 當組件元素類型不變時,通過props遞歸判斷子節點
  • 遞歸對比子節點,當子節點是列表時,通過key和props來判斷。若key一致,則進行更新,若key不一致,就銷毀重建

分析上述問題:

當點擊按鈕時,setinitmap([1,2,3,4])會造成渲染,渲染時會生成新的虛擬dom,但此時獲取到的span元素是之前的元素(因為setinitmap是異步執行的),所以新舊dom會做對比

在initmap.map((it,index) => <div key={math.random()}><span>color</span></div>)這段代碼中

這里的div是列表,對比第四條diff規則,react會根據key來判斷是否更新真實dom。key= {math.random()},新舊dom的值不一致,就會重新生成div。而我們是給更新之前的元素加了紅色的樣式,所以重新創建的元素上不會有這個樣式,效果如下

詳解React中key的作用

第二種情況:key的取值為索引值

上面我們分析的結果是,因為key的變化,導致div元素在render的時候會重新生成。那如果key在render前后保持不變呢?例如,將key改為index

問題: 這段代碼在button點擊之后,span的顏色會變嗎?

  1. return ( 
  2.     <div className="App" id="app"
  3.       <Spin spinning={spin}></Spin> 
  4.       { 
  5.         initMap.map((it,index) => <div key={index}><span>color</span></div>) 
  6.       } 
  7.       <button onClick={() => handleClick()}></button> 
  8.     </div> 
  9.   ); 

答案:會

分析: 因為在render前后,index不變,所以div不會重新生成,接著對比span元素,span元素在render前后,屬性變化,因此react只會為span元素應用新的屬性,但是他們指向的還是之前的元素

詳解React中key的作用

第三種情況:key的取值確定且唯一:

在這個例子中,通過將key設置成index,span的顏色有了變化,但是在使用key時,react官網不推薦使用index

詳解React中key的作用

改造一下上面的代碼

  1.   const [initMap, setInitMap] = useState([1,2,3,4]); 
  2.   const handleClick = () => { 
  3.     setInitMap([3,2,1,4]) 
  4.   } 
  5.   return ( 
  6.     <div className="App" id="app"
  7.       { 
  8.         initMap.map((it,index) => <div key={index}><input type="radio" />{it}</div>) 
  9.       } 
  10.       <button onClick={() => handleClick()}>點擊</button> 
  11.     </div> 
  12.   ); 

在初始化的時候選中值為3的按鈕

詳解React中key的作用

點擊按鈕

詳解React中key的作用

我們預期的效果是,選中的依舊是值為3的按鈕,但此時變成了值為1的按鈕

分析:

  1. setstate之后會導致render
  2. div的index不變,所以div不會重新生成,input不受state和props控制,因此元素的狀態不變
  3. 所以變化的只有受state影響的it

如果想要達到預期效果,我們要設置唯一且確定的key

測試一:

  1.    initMap.map((it) => <div key={it}><input type="radio" />{it}</div>) 

初始化的時候選中第三個按鈕

詳解React中key的作用

點擊按鈕

詳解React中key的作用

這才是符合預期的效果

思考一下,將key設置為math.random(),會有什么效果?按鈕的狀態會保留嗎?

點擊前:

詳解React中key的作用

點擊后:

詳解React中key的作用

radio的狀態不會被保留

通過上面的例子,我們大概可以理解react中key的作用了,下面的內容是對react知識點的一些擴展

擴展內容: 文章開始的代碼還涉及react兩個其他知識點,一個是提到過的react渲染條件,一個是對真實dom的操作;

擴展一: react渲染條件

  1. import './App.css'
  2. import React, { useState } from 'react'
  3.  
  4. function App() { 
  5.   const [initMap, setInitMap] = useState([1,2,3,4]); 
  6.   const [spin, setSpin] = useState(false); 
  7.   const handleClick = () => { 
  8.     setSpin(true); //變化部分 
  9.     var spanEle = document.getElementsByTagName('span'); 
  10.     Array.from(spanEle).map(it => it.style.color = 'red'
  11.     setSpin(false); //變化部分 
  12.   } 
  13.    
  14.   return ( 
  15.     <div className="App" id="app"
  16.       <Spin spinning={spin}></Spin> 
  17.       { 
  18.         initMap.map((it,index) => <div key={Math.random()}><span>{it}</span></div>) 
  19.       } 
  20.       <button onClick={() => handleClick()}></button> 
  21.     </div> 
  22.   ); 
  23.  
  24. export default App; 

測試結果如下 點擊前:

詳解React中key的作用

點擊后:

詳解React中key的作用

在這段代碼中,div的key仍然使用的是math.random(),但initmap的state并沒有改變,所以沒有重新渲染,此時div不會銷毀重建

擴展二:是否可以對真實dom操作

在react中,虛擬dom的出現是為了減少對真實dom的操作,因為真實的dom元素是一個較復雜的對象,操作的話計算量比較大。我們上面的代碼中,都是直接操作dom節點,更改樣式,這樣并不可取。由于react是根據state和props的變化來渲染頁面,因此通過state來控制頁面渲染比較好

修改后的代碼如下:

  1. function App() { 
  2.   const [initMap, setInitMap] = useState([1,2,3,4]); 
  3.   const [spin, setSpin] = useState(false); 
  4.   const [showColor, setShowColor] = useState(false); 
  5.   const handleClick = () => { 
  6.     setInitMap([3,2,1,4]); 
  7.     setShowColor(true); 
  8.   } 
  9.    
  10.   return ( 
  11.     <div className="App" id="app"
  12.       <Spin spinning={spin}> 
  13.       { 
  14.         initMap.map((it,index) => <div key={Math.random()}><span className={showColor && 'span-color'}>color</span></div>) 
  15.       } 
  16.       </Spin> 
  17.       <button onClick={() => handleClick()}>點擊</button> 
  18.     </div> 
  19.   ); 

此時span是受控組件,可以通過showcolor的狀態控制元素的渲染

點擊前:

詳解React中key的作用

點擊后:

詳解React中key的作用

使用state控制渲染后,代碼量會變少,同時結果符合預期

總結

  1. 在使用key時,要保證key的唯一和確定性,如果key的值為math.random(),可能造成組件重新構建,使之前對元素的操作失效
  2. 在渲染頁面時,盡量不要操作真實的dom,使用state來更新頁面

以上就是詳解react中key的作用的詳細內容,更多關于react key的作用的資料請關注服務器之家其它相關文章!

原文鏈接:https://juejin.cn/post/6949420944901275655

延伸 · 閱讀

精彩推薦
  • React基于react hooks,zarm組件庫配置開發h5表單頁面的實例代碼

    基于react hooks,zarm組件庫配置開發h5表單頁面的實例代碼

    這篇文章主要介紹了基于react hooks,zarm組件庫配置開發h5表單頁面,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,...

    記憶的森林4112022-02-23
  • ReactReact State狀態與生命周期的實現方法

    React State狀態與生命周期的實現方法

    這篇文章主要介紹了React State狀態與生命周期的實現方法,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考...

    一枚小棋子10872022-02-20
  • ReactReact antd tabs切換造成子組件重復刷新

    React antd tabs切換造成子組件重復刷新

    這篇文章主要介紹了React antd tabs切換造成子組件重復刷新,需要的朋友可以參考下...

    一堆亂碼4662022-02-22
  • Reactreact獲取input輸入框的值的方法示例

    react獲取input輸入框的值的方法示例

    這篇文章主要介紹了react獲取input輸入框的值的方法示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友...

    Pinkh8082022-02-24
  • React基于Vite 的組件文檔編寫神器,又快又省心

    基于Vite 的組件文檔編寫神器,又快又省心

    翻閱 Vite 的官方庫列表,偶然發現了一款 star 數量僅 100 多的文檔解決方案 vite-plugin-react-pages。開始用試試水的心態去去體驗一把,結果發現相當好用。...

    前端星辰9382021-12-27
  • React聊一聊我對 React Context 的理解以及應用

    聊一聊我對 React Context 的理解以及應用

    這篇文章主要介紹了聊一聊我對 React Context 的理解以及應用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的...

    張國鈺6512022-02-24
  • ReactReact Hook的使用示例

    React Hook的使用示例

    這篇文章主要介紹了React Hook的使用示例,幫助大家更好的理解和學習使用React,感興趣的朋友可以了解下...

    鵬廠搬磚工7182022-02-23
  • React必須要會的50個React面試題

    必須要會的50個React面試題

    如果你是一位有抱負的前端程序員并準備面試,那么這篇文章很適合你。本文是你學習和面試 React 所需知識的完美指南。...

    瘋狂的技術宅9052022-02-23
主站蜘蛛池模板: 亚洲小视频在线 | 欧美一级美国一级 | 99精品电影 | 国产毛片毛片 | 国产一区二区在线观看视频 | 色七七网站 | 少妇一级淫片高潮流水电影 | 在线视频观看一区二区 | 国产91精品久久久久久久 | 亚洲成人免费视频在线 | 国产噜噜噜噜噜久久久久久久久 | 88xx成人永久免费观看 | 亚洲影视在线观看 | 黄网站在线免费看 | 精品国产乱码久久久久久丨区2区 | 国产视频aa | av电影在线观看网址 | 国产精品视频二区不卡 | 国产亚洲精品久久久久久久久 | 在线视频观看国产 | av电影免费在线 | 免费国产网站 | www久 | 成人免费一区二区 | 免费特黄 | 斗破苍穹在线免费 | 免费毛片电影 | 国产一级在线看 | 成人免费在线播放 | 久久网站热最新地址 | 一级成人在线 | 国产精品69久久 | 久久久涩| 91成人免费在线观看 | h视频免费观看 | 亚洲天堂成人在线 | 热久久成人 | 亚洲特黄妇女高潮 | 一级成人在线 | 看免费5xxaaa毛片 | 国产精品久久久久久久久久 |