React — 列表渲染 (List Rendering)
📚 列表渲染 (List Rendering) 定義
- 非 JSX 的變數或函數都必須以
{ }
包起來!
- 將可辨識的JSX元素陣列,做列表渲染 ➡️
{[<> </>,<> </>,...]}
- 可以用 map() 或 filter() 導出並渲染列表
- React 規定列表渲染的Array裡每個 element 都應該要有一個 key,如此才能給予每個 element 一個固定的身份
- Key 幫助 React 分辨哪些項目被改變、增加或刪除,所以不可重複且必須是唯一
- Key 只有在周遭有 Array 的情境中才有意義
- 用 Key 抽離 Component ➡️ 如果要抽離一個 ListItem component ,應該要把 Key 放在 Array 裡的
<ListItem />
element 上,而不是把它放在 ListItem 裡面的 <li>
element 上
📝 實作並說明 Key 的正確設置位置
1 2 3 4 5 6 7
| const todos = [ { id: 0, title: "Breakfast"}, { id: 1, title: "Work"}, { id: 2, title: "Take a rest"}, { id: 3, title: "Tea time"}, { id: 4, title: "Dinner"}, ];
|
❌ 錯誤: key 不能放在 <li>
元素上
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| function ListItem(props) { return <li key={props.key}>{props.title}</li> }
function App() { return ( <div className="App"> <header className="App-header"> <MyImg /> <ul> {todos.map((todo) => { return <ListItem key={todo.id} title={todo.title} /> })} </ul> </header> </div> ) }
|
✔️ 正確: key 只在array 裡的 <ListItem />
element 上被指定
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| function ListItem(props) { return <li>{props.title}</li> }
function App() { return ( <div className="App"> <header className="App-header"> <MyImg /> <ul> // key 只在這指定即可 {todos.map((todo) => { return <ListItem key={todo.id} title={todo.title} /> })} </ul> </header> </div> ) }
|
💁♀️ React 不建議使用陣列的索引(index)作為 key,特別是在項目的順序會改變的情況。這會對效能產生不好的影響,也可能會讓 component state 產生問題!可參考 Robin Pokorny 這篇深入剖析使用索引
🔎 參考資料