1、回顾javascript
转换列表
- 示例
1234const numbers = [1, 2, 3, 4, 5]const doubled = numbers.map((number) => number * 2)console.log(doubled)// [2, 4, 6, 8, 10]
2、渲染多个组件
- 使用
{}
在 JSX 内构建一个元素集合 - 示例
123456789numbers = [1, 2, 3, 4, 5]const listItems = numbers.map((number) =><li>{ number }</li>)ReactDOM.render(<ul>{ listItems }</ul>,document.getElementById('root'))
3、基础列表组件
- 将
8-2
的示例重构成组件
1234567891011121314151617function NumberList (props) {const numbers = props.numbersconst listItems = numbers.map((number) =><li key={ number.toString() }>{ number }</li>)return (<ul>{ listItems }</ul>)}numbers = [1, 2, 3, 4, 5]ReactDOM.render(<NumberList numbers={ numbers } />,document.getElementById('root2'))
4、Key
- key帮助React识别哪些元素改变了
- 一个元素的 key 最好是这个元素在列表中拥有的一个独一无二的字符串
- 通常,我们使用数据中的 id 来作为元素的 key
12345const todoItems = todos.map((todo) =><li key={ todo.id }>{ todo.text }</li>) - 当元素没有确定 id 的时候,可以使用元素索引 index 作为 key
123456const todoItems = todos.map((todo, index) =>// Only do this if items have no stable IDs<li key={index}>{ todo.text }</li>)- 如果列表项目的顺序可能会变化,不建议使用索引来用作 key 值,因为这样做会导致性能变差,还可能引起组件状态的问题
- 通常,我们使用数据中的 id 来作为元素的 key
5、用 key 提取组件
- 元素的 key 只有放在就近的数组上下文中才有意义
- 经验法则:在
map()
方法中的元素需要设置 key 属性
- 经验法则:在
- 正确示例:
1234567891011121314151617181920212223function 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'))
6、key 只是在兄弟节点之间必须唯一
- 数组元素中使用的 key 在其兄弟节点之间应该是独一无二的
12345678910111213141516171819202122232425262728293031323334353637function Blog (props) {const sidebar = (<ul>{props.posts.map((post) =><li key={ post.id }>{ post.title }</li>)}</ul>)const content = props.posts.map((post) =><div key={ post.id }><h3>{ post.title }</h3><p>{ post.content }</p></div>)return (<div>{ sidebar }<hr />{ content }</div>)}const posts = [{ id: 1, title: 'Hello World', content: 'Welcome to learning React!' },{ id: 2, title: 'Installation', content: 'You can install React from npm.' }]ReactDOM.render(<Blog posts={ posts } />,document.getElementById('root3'))
- key 会传递信息给 React ,但不会传递给你的组件
- 如果你的组件中需要使用
key
属性的值,请用其他属性名显式传递这个值
123456const content = posts.map((post) =><Postkey={post.id}id={post.id}title={post.title} />)
- 如果你的组件中需要使用
7、在 JSX 中嵌入 map()
- JSX 允许在大括号中嵌入任何表达式
12345678910function NumberList(props) {const numbers = props.numbers;return (<ul>{numbers.map((number) =><ListItem key={ number.toString() } value={ number } />)}</ul>)}