最近2018中文字幕在日韩欧美国产成人片_国产日韩精品一区二区在线_在线观看成年美女黄网色视频_国产精品一区三区五区_国产精彩刺激乱对白_看黄色黄大色黄片免费_人人超碰自拍cao_国产高清av在线_亚洲精品电影av_日韩美女尤物视频网站

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
Reactkey值的作用和使用詳解

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

創(chuàng)新互聯(lián)建站是專業(yè)的鋼城網(wǎng)站建設(shè)公司,鋼城接單;提供成都網(wǎng)站制作、網(wǎng)站建設(shè),網(wǎng)頁設(shè)計,網(wǎng)站設(shè)計,建網(wǎng)站,PHP網(wǎng)站建設(shè)等專業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進行鋼城網(wǎng)站開發(fā)網(wǎng)頁制作和功能擴展;專業(yè)做搜索引擎喜愛的網(wǎng)站,專業(yè)的做網(wǎng)站團隊,希望更多企業(yè)前來合作!

React key值的作用和使用詳解

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

key概述

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

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

key的使用場景

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

例如:

{dataList.map((item,index)=>{
    return 
{item.name}
}) }

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

例如:

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

key的值必須保證唯一且穩(wěn)定

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

//this.state.users內(nèi)容。注意:李四和王五的id相同?。?!
this.state = {
 users: [{id:1,name: '張三'}, {id:2, name: '李四'}, {id: 2, name: "王五"}],
 ....//省略
}
render()
 return(
 

用戶列表

{this.state.users.map(u =>
{u.id}:{u.name}
)}
) );

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

這樣,有了key屬性后,就可以與組件建立了一種對應(yīng)關(guān)系,react根據(jù)key來決定是銷毀重新創(chuàng)建組件還是更新組件。

并且,Key也要保證值的穩(wěn)定性,例如:

{dataList.map((item,index)=>{
    return 
{item.name}
}) }

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

所以,Key的值必須保證其唯一和穩(wěn)定性

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

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

key其它注意事項

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

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

//MyComponent
...
render() {//error
{{item.name}}
} ... //right

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

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

{
this.state.type ? 
:
}

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

{
this.state.type ? 
:
}

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

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持創(chuàng)新互聯(lián)。


分享文章:Reactkey值的作用和使用詳解
標題URL:http://fisionsoft.com.cn/article/pjsjpg.html