列表 & Keys
在JavaScript中map()函數(shù)可以對數(shù)組中的每一項元素進行定義操作,比如對數(shù)組中的元素都翻倍:
const numbers = [1,2,3];
const doubled = numbers.map(number => number * 2);
console.log(doubled);
那么輸出的結果是[2,4,6];
在React中算色,可能需要的操作是把數(shù)組轉換成數(shù)列元素的過程窃植,可以認為是*React元素的數(shù)組狡忙。
渲染多個組件
比如說現(xiàn)在有一個數(shù)組[1,2,3],可能經(jīng)過渲染后需要的是一個元素數(shù)組闯割,如多個<li>1</li>這種曙咽,如下:
const numbers = [1,2,3];
const listItems = numbers.map(number => <li>{number}</li>);
ReactDOM.render(
<ul>{listItems}</ul>, document.getElementById('root')
);
如下圖:
基礎列表組件
如果需要渲染這種列表,最好是將列表渲染到一個組件中涤浇,進行了組件的抽象。
根據(jù)上邊的例子魔慷,其實就是將數(shù)組轉變成列表元素的過程封裝到一個組件中只锭,組件接受一個numbers數(shù)組作為參數(shù),最后渲染后輸出一個列表院尔。如下:
function NumberList(props) {
const numbers = props.numbers;
const listItems = numbers.map(number => <li>{number}</li>);
return <ul>{listItems}</ul>;
}
const numbers = [1,2,3];
ReactDOM.render(
<NumberList numbers={numbers} />, document.getElementById('root')
);
但這樣其實蜻展,在返回的列表元素中,每個元素應該指定一個key邀摆,如:
numbers.map(number => <li key="abc">{number}</li>);
key值建議是一個字符串纵顾,并且在這個列表中是唯一的。
Keys
Keys可以在DOM中的某些元素被增加或者刪除的時候幫助React識別哪些元素發(fā)生了變化栋盹。在一個列表中施逾,每個元素最好擁有唯一的字符串形式的key值。當然如果沒有具體的值來作為key值時例获,可以使用列表元素的序號索引作為key值汉额。
numbers.map((number,index) => <li key={index.toString()}>{number}</li>);
關于Keys的深度解讀和算法原理,可以參考深度解析key的必要性榨汤。
元素的key只有放在其環(huán)繞數(shù)組的上下文中才有意義蠕搜。
比如,提取了一個ListItem組件收壕,那么key應該放在<ListItem />這個元素上妓灌,而不是ListItem中的<li>元素上轨蛤。
- 不正確是使用方式
function ListItem(props) {
const value = props.value;
return (
// 錯啦!你不需要在這里指定key:
<li key={value.toString()}>
{value}
</li>
);
}
function NumberList(props) {
const numbers = props.numbers;
const listItems = numbers.map((number) =>
//錯啦虫埂!元素的key應該在這里指定:
<ListItem value={number} />
);
return (
<ul>
{listItems}
</ul>
);
}
const numbers = [1, 2, 3, 4, 5];
ReactDOM.render(
<NumberList numbers={numbers} />,
document.getElementById('root')
);
- 正確的使用方式
function ListItem(props) {
// 對啦祥山!這里不需要指定key:
return <li>{props.value}</li>;
}
function NumberList(props) {
const numbers = props.numbers;
const listItems = numbers.map((number) =>
// 又對啦!key應該在數(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')
);
一個好的大拇指法則:元素位于map()方法內(nèi)時需要設置鍵屬性告丢。
key的值需要在同一個列表中也就是兄弟元素之間保持唯一即可枪蘑,不用全局保持唯一。
不過需要注意的是岖免,key是作為給React提示的岳颇,不會傳遞給組件,也就是使用組件的props對象是拿不到key值的颅湘。如下圖:
可以看到執(zhí)行結果话侧,冒號":"后面的值并沒有輸出。
如上圖中的代碼闯参,可以將map()函數(shù)嵌入到JSX語法的大括號{}中瞻鹏。