React筆記8(列表 & Keys)

1.js中轉(zhuǎn)化列表

首先使用map()對(duì)數(shù)組進(jìn)行翻倍侍郭,得到一個(gè)新的數(shù)組doubled

const numbers = [1,2,3,4,5];
const doubled = numbers.map((current,index,arr)=>{
    return current*2
})
console.log(doubled)  //[2,4,6,8,10];

在React中莹汤,把數(shù)組轉(zhuǎn)換為數(shù)列元素的方法是相似的帝牡。

2.渲染多個(gè)組件

可以通過(guò)使用{}在jsx內(nèi)構(gòu)建一個(gè)元素集合
現(xiàn)在使用js中的map()方法遍歷numbers數(shù)組婴洼,對(duì)數(shù)組中的每個(gè)元素返回<li>標(biāo)簽距误,然后我們得到一個(gè)listItems

const numbers = [1,2,3,4,5];
const listItems = numbers.map((current,index,arr)=>{
    return (
        <li>{current*2}</li>
    )
})
//把得到的li列表插入ul中并且渲染出來(lái)
ReactDOM.render(
    <ul>{listItems}</ul>,document.getElementById('root')
)
3.基礎(chǔ)列表組件

有時(shí)候你需要渲染一個(gè)列表到組件中
我們把前面的例子重構(gòu)成一個(gè)組件喇嘱,組件接收numbers數(shù)組為參數(shù)茉贡,輸出一個(gè)無(wú)序列表

function NumberList(props){
    const numbers = props.numbers;
    const listItems = numbers.map((current,index,arr)=>{
        return <li>{current*2}</li>
    })
    return (
        <ul className="hellos">{listItems}</ul>
    )
}

const numbers = [1,2,3,4,5];
ReactDOM.render(
    <NumberList numbers={numbers} />,
    document.getElementById('root')
)

當(dāng)我們運(yùn)行這段代碼,將會(huì)看到一個(gè)警告 a key should be provided for list items者铜,意思是當(dāng)你創(chuàng)建一個(gè)元素時(shí)腔丧,必須包括一個(gè)特殊的 key 屬性。

這有點(diǎn)類似vue作烟,我們需要給每個(gè)元素一個(gè)key來(lái)解決這個(gè)警告愉粤,每個(gè)li的key必須不相同

function NumberList(props){
    const numbers = props.numbers;
    const listItems = numbers.map((current,index,arr)=>{
        return <li key={current}>{current*2}</li>
    })
    return (
        <ul className="hellos">{listItems}</ul>
    )
}
4.keys

keys可以在dom中某些元素被添加或者刪除的時(shí)候,幫助React去識(shí)別哪一些元素發(fā)生了變化拿撩,因此應(yīng)當(dāng)在 數(shù)組 中的每一個(gè)元素添加一個(gè)key

一個(gè)元素的key最好是這個(gè)元素列表中 獨(dú)一無(wú)二 的字符串衣厘,我們通常用來(lái)自數(shù)字的id,或者使用index

const test = arr.map((current,index,arr)=>{
    //當(dāng)其中有一個(gè)id的時(shí)候
    return(
        <li key={current.id}>{current.text}</li>
    )
    //沒(méi)有id 的時(shí)候可以使用index
    return(
        <li key={index}>{current.text}</li>
    )
})

如果列表可以重新排序,我們不建議使用索引來(lái)進(jìn)行排序影暴,因?yàn)檫@會(huì)導(dǎo)致渲染變得很慢错邦。如果你想要了解更多,請(qǐng)點(diǎn)擊深度解析key的必要性

5.用keys提取組件

元素的key只有在他和他的兄弟節(jié)點(diǎn)對(duì)比的時(shí)候才有意義

比如你提取一個(gè)<ListItem />組件型宙,應(yīng)該將key保存在數(shù)組中撬呢,這個(gè)ListItem這個(gè)組件上,而不是他里面的li上

function ListItem(props) {
  // 對(duì)啦妆兑!這里不需要指定key:
  return <li>{props.value}</li>;
}

function NumberList(props) {
  const numbers = props.numbers;
  const listItems = numbers.map((number) =>
    // 又對(duì)啦魂拦!key應(yīng)該在數(shù)組的上下文中被指定
    <ListItem key={number.toString()}
              value={number} />

  );
  return (
    <ul>
      {listItems}
    </ul>
  );
}

const numbers = [1, 2, 3, 4, 5];
ReactDOM.render(
  <NumberList numbers={numbers} />,
  document.getElementById('root')
);
6.元素的key在他們兄弟元素之間應(yīng)該是唯一

①在他們的兄弟間,也就是同一個(gè)數(shù)組中藥唯一
②不需要全局唯一搁嗓,就是2個(gè)數(shù)組中可以一樣

注意:
key是用來(lái)作為React的提示芯勘,如果你需要傳遞與key相同的值,需要使用屬性來(lái)傳遞腺逛。

const content = posts.map((post) =>
  <Post
    key={post.id} //無(wú)法讀取
    id={post.id}  //可以讀取
    title={post.title} />  //可以讀取
);

以上的例子中荷愕,可以讀出props.id,但是無(wú)法讀出props.key

7.在jsx中嵌入map()

JSX允許在大括號(hào)中嵌入任何表達(dá)式屉来,所以我們可以在map()中這樣使用:

function NumberList(props) {
  const numbers = props.numbers;
  return (
    <ul>
      {numbers.map((number) =>
        <ListItem key={number.toString()}
                  value={number} />

      )}
    </ul>
  );
}

這么做有時(shí)候會(huì)使得你的代碼更加清晰路翻,但是常常這種風(fēng)格也會(huì)被濫用,如果一個(gè)map()嵌套了太多層茄靠,此時(shí)可能就是需要提取組件的時(shí)候了。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末蝶桶,一起剝皮案震驚了整個(gè)濱河市慨绳,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌真竖,老刑警劉巖脐雪,帶你破解...
    沈念sama閱讀 211,290評(píng)論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異恢共,居然都是意外死亡战秋,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門讨韭,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)脂信,“玉大人,你說(shuō)我怎么就攤上這事透硝≌粒” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 156,872評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵濒生,是天一觀的道長(zhǎng)埋泵。 經(jīng)常有香客問(wèn)我,道長(zhǎng),這世上最難降的妖魔是什么丽声? 我笑而不...
    開(kāi)封第一講書人閱讀 56,415評(píng)論 1 283
  • 正文 為了忘掉前任礁蔗,我火速辦了婚禮,結(jié)果婚禮上雁社,老公的妹妹穿的比我還像新娘浴井。我一直安慰自己,他們只是感情好歧胁,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,453評(píng)論 6 385
  • 文/花漫 我一把揭開(kāi)白布滋饲。 她就那樣靜靜地躺著,像睡著了一般喊巍。 火紅的嫁衣襯著肌膚如雪屠缭。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書人閱讀 49,784評(píng)論 1 290
  • 那天崭参,我揣著相機(jī)與錄音呵曹,去河邊找鬼。 笑死何暮,一個(gè)胖子當(dāng)著我的面吹牛奄喂,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播海洼,決...
    沈念sama閱讀 38,927評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼跨新,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了坏逢?” 一聲冷哼從身側(cè)響起域帐,我...
    開(kāi)封第一講書人閱讀 37,691評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎是整,沒(méi)想到半個(gè)月后肖揣,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,137評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡浮入,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,472評(píng)論 2 326
  • 正文 我和宋清朗相戀三年龙优,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片事秀。...
    茶點(diǎn)故事閱讀 38,622評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡彤断,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出秽晚,到底是詐尸還是另有隱情瓦糟,我是刑警寧澤,帶...
    沈念sama閱讀 34,289評(píng)論 4 329
  • 正文 年R本政府宣布赴蝇,位于F島的核電站菩浙,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜劲蜻,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,887評(píng)論 3 312
  • 文/蒙蒙 一陆淀、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧先嬉,春花似錦轧苫、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,741評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至衅胀,卻和暖如春岔乔,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背滚躯。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 31,977評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工雏门, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人掸掏。 一個(gè)月前我還...
    沈念sama閱讀 46,316評(píng)論 2 360
  • 正文 我出身青樓茁影,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親丧凤。 傳聞我的和親對(duì)象是個(gè)殘疾皇子募闲,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,490評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容

  • HTML模版 之后出現(xiàn)的React代碼嵌套入模版中。 1. Hello world 這段代碼將一個(gè)一級(jí)標(biāo)題插入到指...
    ryanho84閱讀 6,221評(píng)論 0 9
  • 本筆記基于React官方文檔愿待,當(dāng)前React版本號(hào)為15.4.0蝇更。 1. 安裝 1.1 嘗試 開(kāi)始之前可以先去co...
    Awey閱讀 7,658評(píng)論 14 128
  • 1、什么是react React.js 是一個(gè)幫助你構(gòu)建頁(yè)面 UI 的庫(kù)呼盆。React.js 將幫助我們將界面分成了...
    谷子多閱讀 2,555評(píng)論 1 13
  • 學(xué)習(xí)如何在Flow中使用React 將Flow類型添加到React組件后,F(xiàn)low將靜態(tài)地確保你按照組件被設(shè)計(jì)的方...
    vincent_z閱讀 6,330評(píng)論 4 21
  • 前些天蚁廓,《舌尖上的中國(guó)》第三季访圃,這一季在網(wǎng)上的評(píng)價(jià)顯然沒(méi)有前兩季那么高,但是我還是出于對(duì)前兩季的喜愛(ài)相嵌,看了第三季腿时。...
    繼續(xù)海闊天空閱讀 443評(píng)論 0 0