国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > JavaScript > 正文

React key值的作用和使用詳解

2019-11-19 13:10:42
字體:
來源:轉載
供稿:網友

在react項目中總會遇到這樣一個的坑

這是警告數組遍歷子元素要有一個唯一的key值,但是key到底是什么,在代碼中到底起了什么作用?

key概述

react中的key屬性,它是一個特殊的屬性,它的出現不是給開發者用的(例如你為一個組件設置key之后,也仍無法獲取這個組件的key值),而是給react自己用的。

簡單來說,react利用key來識別組件,它是一種身份標識標識,就像我們的身份證用來辨識一個人一樣。每個key對應一個組件,相同的key react認為是同一個組件,這樣后續相同的key對應組件都不會被創建。

key的使用場景

在項目開發中,key屬性的使用場景最多的還是由數組動態創建的子組件的情況,需要為每個子組件添加唯一的key屬性值。那會有的人就會自然而然想到,key和動態渲染的子元素獲取的index位置的值很接近,那不是可以直接用index附上key的值呢key={index}?

例如:

{dataList.map((item,index)=>{    return <div style={mystyle} key={index}>{item.name}</div>    })}

在你嘗試過后會發現,報錯沒了,渲染也沒問題不是很正常嘛?!但是強烈不推薦用數組index來作為key。
如果數據更新僅僅是數組重新排序或在其中間位置插入新元素,那么視圖元素都將重新渲染。

例如:

本來index=2的元素向前移動后,那該元素的key不也同樣發生了改變那這樣會改變的Key就沒有任何的存在意義,既然是作為“身份證”一樣的存在,那就不容有失。當然,在你用key值創建子組件的時候,若數組的內容只是作為純展示,而不涉及到數組的動態變更,其實是可以使用index作為key的。

key的值必須保證唯一且穩定

我在與Key值打過幾次交道過后,覺得key值就類似于數據庫中的主鍵id一樣,有且唯一。

//this.state.users內容。注意:李四和王五的id相同!!!this.state = { users: [{id:1,name: '張三'}, {id:2, name: '李四'}, {id: 2, name: "王五"}], ....//省略}render() return( <div>  <h3>用戶列表</h3>  {this.state.users.map(u => <div key={u.id}>{u.id}:{u.name}</div>)} </div> ));

注意以上范例中,動態渲染的數據中,key以數據的id來定,而李四、王五的id相同而導致Key的雷同,最后的渲染結果為張三和李四,王五并沒有展示出來。主要是因為 react根據key認為李四和王五是同一個組件(李四和王五的key值相同),導致第一個被渲染,后續的會被丟棄掉。

這樣,有了key屬性后,就可以與組件建立了一種對應關系,react根據key來決定是銷毀重新創建組件還是更新組件。

并且,Key也要保證值的穩定性,例如:

{dataList.map((item,index)=>{    return <div style={mystyle} key={Math.random()}>{item.name}</div>    })}

尤其如以上范例中所示,key的值以Math.random()隨機生成而定,這使得數組元素中的每項都重新銷毀然后重新創建,有一定的性能開銷;另外可能導致一些意想不到的問題出現。

所以,Key的值必須保證其唯一和穩定性

所以,在不能使用random隨機生成key時,我們可以像下面這樣用一個全局的localCounter變量來添加穩定唯一的key值。

var localCounter = 1;this.data.forEach(el=>{el.id = localCounter++;});//向數組中動態添加元素時,function createUser(user) {return {...user,id: localCounter++}}

key其它注意事項

當然除了為數據元素生成的組件要添加key,且key要穩定且唯一之外,還需要注意以下幾點:

key屬性是添加到自定義的子組件上,而不是子組件內部的頂層的組件上。

//MyComponent...render() {//error<div key={{item.key}}>{{item.name}}</div>}...//right<MyComponent key={{item.key}}/>

key值的唯一是有范圍的,即在數組生成的同級同類型的組件上要保持唯一,而不是所有組件的key都要保持唯一

不僅僅在數組生成組件上,其他地方也可以使用key,主要是react利用key來區分組件的,相同的key表示同一個組件,react不會重新銷毀創建組件實例,只可能更新;key不同,react會銷毀已有的組件實例,重新創建組件新的實例。

{this.state.type ? <div><Son_1/><Son_2/></div>: <div><Son_2/><Son_1/></div>}

例如上面代碼中,this.state.type的值改變時,原Son_1和Son2組件的實例都將會被銷毀,并重新創建Son_1和Son_2組件新的實例,不能繼承原來的狀態,其實他們只是互換了位置。為了避免這種問題,我們可以給組件加上key。

{this.state.type ? <div><Son_1 key="1"/><Son_2 key="2"/></div>: <div><Son_2 key="2" /><Son_1 key="1"/></div>}

這樣,this.state.type的值改變時,Son_1和Son2組件的實例沒有重新創建,react只是將他們互換位置。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 莫力| 西吉县| 永州市| 宽甸| 松阳县| 新兴县| 阳城县| 宜城市| 翁牛特旗| 蒲江县| 惠来县| 扶风县| 申扎县| 大埔县| 凯里市| 通榆县| 靖远县| 米泉市| 陵川县| 根河市| 莱州市| 潮安县| 静乐县| 永丰县| 马龙县| 乐业县| 柳河县| 沾益县| 增城市| 龙陵县| 遵义市| 田阳县| 包头市| 策勒县| 龙山县| 县级市| 改则县| 正宁县| 泽普县| 长宁区| 寿宁县|