在 React 中,列表组件是一个高频出现的场景。通常我们会根据一个数组中的内容,来渲染出列表组件。
例如我们有如下原始数据
10export const people = [{20id: 0,30name: 'Creola Katherine Johnson',40profession: 'mathematician',50accomplishment: 'spaceflight calculations',60imageId: 'MK3eW3A'70}, {80id: 1,90name: 'Mario José Molina-Pasquel Henríquez',10profession: 'chemist',11accomplishment: 'discovery of Arctic ozone hole',12imageId: 'mynHUSa'13}, {14id: 2,15name: 'Mohammad Abdus Salam',16profession: 'physicist',17accomplishment: 'electromagnetism theory',18imageId: 'bE7W1ji'19}, {20id: 3,21name: 'Percy Lavon Julian',22profession: 'chemist',23accomplishment: 'pioneering cortisone drugs, steroids and birth control pills',24imageId: 'IOjWm71'25}, {26id: 4,27name: 'Subrahmanyan Chandrasekhar',28profession: 'astrophysicist',29accomplishment: 'white dwarf star mass calculations',30imageId: 'lrWQx8l'31}];
我们要将其渲染成如下的列表
在 React 中,我们通常会使用 array.map
来将数组中的每个元素映射成一个组件。
10import { people } from './data'20import Avatar from './avatar'3040export default function App() {50return (60<div className='space-y-4'>70{people.map(person => (80<div key={person.id} className='flex p-4 items-center gap-4 border border-gray-200 rounded-xl dark:border-0 dark:inset-ring dark:inset-ring-white/10'>90<Avatar person={person} size={70} />10<div>11<div className='font-bold'>{person.name}</div>12<div className='text-sm text-gray-500 mt-2'>{person.profession} known for {person.accomplishment}</div>13</div>14</div>15))}16</div>17)18}
这里需要解读一下为什么要用 map
来渲染列表。是因为 map
会返回一个新的数组,所以 map 之后最终得到的结果是
1[2<div key='a'>...</div>,3<div key='b'>...</div>,4<div key='c'>...</div>,5...6]
React 中支持了这种写法。可以依次渲染成组件。
需要特别注意的是,map 渲染的列表,比如给一个唯一的 key 属性。这是为了帮助 React 识别列表中的元素,从而在更新时更加快速、正确地更新和删除元素。
当我们的列表变得复杂之后,我们可以封装一个公共的列表组件。
这里比较需要重点关注的,就是我们使用 render props 的方式来传入列表项的渲染。具体的实现细节可以通过代码学习
10import List from './list'20import ListItem from './ListItem'30import { people } from './data'4050export default function App() {60return (70<List list={people} listItem={80(person) => <ListItem key={person.id} person={person} />90} />10)11}12