react為什麼不推薦使用index作為key
1.舊的虛擬dom和新的虛擬dom對比,首先看他們的key是否相同
2.相同繼續對比他們的內容,不同生成新的真實dom進行替換
3.如果內容和key都相同,復用舊的真實dom 不做改變
那麼如果我們使用遍歷時候自動生成的index作為每個節點的key可能會出現什麼問題呢? 下面放個小案例
首先,初始時我們進行遍歷persons
他會是這樣一個過程,源數據
persons: [ { id: 1, name: “張三”, age: 15 }, { id: 2, name: “李四”, age: 16 }, ],
生成的真實dom節點
<ul> <li key="0">張三--15</li> <li key="1">李四--16</li> </ul>
然後我們在這個名單前面插入一個{id:3,name:‘王五’,age:14}的數據會變成這樣子
<ul> <li key="0">王五--14</li> <li key="1">張三--15</li> <li key="2">李四--16</li> </ul>
通過上面的更新可以發現 王五將之前張三的key給占用瞭
也就是說當我進行更新這一過程首先新的虛擬dom
<li key="0">王五--14</li>
和舊的虛擬dom
<li key="0">張三--15</li>
進行比較 新的dom先比較key兩人相同,在比較內容一個是王五–14 一個是張三15 ,內容發生變化瞭,這時就會進行使用新的虛擬dom生成新的真是dom重新渲染頁面,而且不僅是之前的張三受影響需要重新生成,後面的李四也要被張三進行替換在生成一個新的內容為張三的真實dom,這樣就會導致所有的dom都要重新生成重新渲染,導致性能下降
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta http-equiv="X-UA-Compatible" content="IE=edge" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <title>Document</title> </head> <body> <script src="https://unpkg.com/react@16/umd/react.development.js"></script> <script src="https://unpkg.com/react-dom@16/umd/react-dom.development.js"></script> <script src="https://unpkg.com/[email protected]/babel.js"></script> <div id="root"></div> <script type="text/babel"> let root = document.getElementById("root"); class App extends React.Component { constructor(props) { super(props); } state = { persons: [ { id: 1, name: "張三", age: 15 }, { id: 2, name: "李四", age: 16 }, ], }; handle = () => { const { persons } = this.state; const p = { id: 0, name: "王五", age: 14, }; this.setState({ persons: [p, ...persons], }); }; render() { return ( <div> <button onClick={this.handle}>點擊添加</button> <ul> {this.state.persons.map((person, index) => ( <li key={index}> {person.name}--{person.age} </li> ))} </ul> </div> ); } } ReactDOM.render(<App name="hell" />, root); </script> </body> </html>
試想一下經過上面的推導致,如果我們使用id作為唯一的key值會怎麼樣呢
更新前
<ul> <li key="1">張三--15</li> <li key="2">李四--16</li> </ul>
更新後
<ul> <li key="0">王五--14</li> <li key="1">張三--15</li> <li key="2">李四--16</li> </ul>
這次 雖然王五插入的還是張三的前面但是隻對比瞭一次 王五和上面是否有一樣的key=0的節點 ,沒有生成新的真實dom進行渲染,而張三和上面key=1的進行對比,發現上面有一個key=1的節點,然後再對比他們的內容是否相同,發現內容也相同,那麼就可以復用舊的真實dom,節約性能
到此這篇關於react為什麼不推薦使用index作為key的文章就介紹到這瞭,更多相關react index作為key內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- 一起來學習React元素的創建和渲染
- 初識React及React開發依賴詳解
- React組件實例三大屬性state props refs使用詳解
- react入門級詳細筆記
- react中props 的使用及進行限制的方法