使用 JS 中的 map() 方法来遍历数组,可以把数组中的每个元素都映射成 标签或者其他组件
可以将以下内容插入到jsx里:
- ///let arr=[1,2,3,4,5,6]
-
- <ul>
- {
- arr.map((ele,idx)=>
- <li key={ele.toString()}>{ele}</li>
-
- )
- }
- </ul>
key可以省略,如果省略的话,React会默认将元素的索引作为列表项的key值
但是!!!一般不推荐将索引值作为列表项的key,因为React使用过key这个唯一标识来区分不同的列表项,哪些是新添加进来的,哪些是已经删除的;
如果将索引作为key值,因为当我们删除数组中的某一个元素时,其他元素对应的索引都有可能改变,因此就不能保证唯一标识列表项了!
另外,元素的 key 只有放在就近的数组上下文中才有意义
也就是说,当把某个元素渲染成组件(里面可能会嵌套多个子组件)时,我们需要将key属性添加到这个组件的最外层组件!!
- function ListItem(props) {
- // 正确!这里不需要指定 key:
- return <li>{props.value}</li>;
- }
-
- function NumberList(props) {
- const numbers = props.numbers;
- const listItems = numbers.map((number) =>
- // 正确!key 应该在数组的上下文中被指定
- <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')
- );
还有,数组元素中使用的 key 在其兄弟节点之间应该是独一无二的。然而,它们不需要是全局唯一的。当我们生成两个不同的数组时,我们可以使用相同的 key 值:
最后,key 会传递信息给 React ,但不会传递给你的组件。如果你的组件中需要使用 key
属性的值,请用其他属性名显式传递这个值:
- const content = posts.map((post) =>
- <Post
- key={post.id}
- id={post.id}
- title={post.title} />
- );
上面的Post
组件可以读出 props.id
,但是不能读出 props.key