React JSX中的陣列

更新 發佈閱讀 7 分鐘

基本介紹

當我們需要渲染多筆資料時,通常會使用陣列的 map() 方法將資料轉換成一系列 React 元件。在這過程中,key 屬性的使用非常重要,原因如下:

為什麼需要 key?

  • 唯一標識: key 幫助 React 識別哪些項目發生了變更、增加或刪除。當列表數據更新時,透過 key,React 可以更有效率地進行重新渲染。
  • 效能優化: 正確使用 key可以降低 DOM 更新的開銷,因為 React 能夠精確地知道哪些元素需要被更新而不是全部重新渲染。

如何選擇 key?

  • 穩定且唯一: key 應該是穩定且唯一的,常見的選擇有資料庫中的 id。如果沒有穩定的 id,則不得不使用索引,但這只適用於靜態列表或不會重新排序的情況。
  • 避免使用索引: 在大部分情況下,使用陣列索引作為 key 可能會導致不正確的元件狀態更新,尤其是在列表項目可能增刪或重新排序時。

範例

假設我們有一個待辦事項列表,可以這樣使用key:

function TodoList({ todos }) {
return (
<ul>
{todos.map(todo => ( // todo 該參數代表陣列中的每一筆資料
// 假設 todo.id 為唯一識別碼
<li key={todo.id}>
{todo.text}
</li>
))}
</ul>
);
}
export default TodoList;

我們再演示其它示範:

假設你有一個包含數字或字串的陣列,你可以使用 map() 方法將每個項目轉換成一個 JSX 元素:

function NumberList() {
const numbers = [1, 2, 3, 4, 5];
return (
<ul>
{numbers.map(number => (
<li key={number}>{number}</li>
))}
</ul>
);
}
export default NumberList;
  • 使用 numbers.map() 將每個數字變為 <li> 元素。
  • 每個列表項都需要有一個唯一的 key 屬性,這裡使用數字本身作為 key。
  • 最後,整個陣列表達式被包在大括號 {} 內,讓 JSX 能夠正確解讀並插入結果。

而通常資料來源並非單純數字,而是一組物件,例如待辦事項清單:

function TodoList({ todos }) {
return (
<ul>
{todos.map(todo => (
<li key={todo.id}>
<h3>{todo.title}</h3>
<p>{todo.description}</p>
</li>
))}
</ul>
);
}
export default TodoList;
// App.jsx

import TodoList from "./TodoList.jsx"

function App() {
// 使用範例
const todosData = [
{ id: 1, title: "學習 React", description: "閱讀官方文件和範例程式碼" },
{ id: 2, title: "實作專案", description: "開始一個小型的 React 專案" },
{ id: 3, title: "進階學習", description: "了解 Hooks 和 Context API" }
];
return (
<>
// 在應用中渲染 TodoList
<TodoList todos={todosData} />
</>
);
}

export default App
  • 每個 todo 物件都有獨一無二的 id 作為 key,這有助於 React 追蹤每個項目的狀態。

有時候陣列可能是空的,你可以透過條件渲染來提示使用者:

function MessageList({ messages }) {
if (messages.length === 0) {
return <p>目前沒有訊息</p>;
}

return (
<ul>
{messages.map((message, index) => (
<li key={index}>{message}</li>
))}
</ul>
);
}

陣列的複雜操作

有時候你可能需要對資料進行過濾、排序或其他變換,再渲染到 JSX 中。例如,假設你要只顯示已完成的任務:

function CompletedTodos({ todos }) {
// 過濾出已完成的任務
const completed = todos.filter(todo => todo.completed);

return (
<ul>
{completed.map(todo => (
<li key={todo.id}>
<span style={{ textDecoration: "line-through" }}>{todo.title}</span>
</li>
))}
</ul>
);
}
export default CompletedTodos
// App.jsx

import CompletedTodos from "./CompletedTodos.jsx"

function App() {
// 範例資料
const todosData = [
{ id: 1, title: "學習 React", completed: true },
{ id: 2, title: "寫作業", completed: false },
{ id: 3, title: "看影片", completed: true }
];
return (
<>
// 在應用中渲染 CompletedTodos
<CompletedTodos todos={todosData} />
</>
);
}

export default App
  • 先用 filter() 過濾出 completed 為 true 的任務。
  • 再用 map() 將結果渲染成列表,並可將已完成的任務標記為刪除線。

在一些情況下,你可能需要渲染多層次的資料,例如一個留言串中包含回覆、在TodoList中的每條代辦事項中包含可以刪除的按鈕或其它按鈕。


TodoList項目會在之後的幾章節後再做實現,目前讀者只需要知道相關的邏輯操作。

留言
avatar-img
電資鼠 - 您的學習好夥伴
21會員
242內容數
在當今數位時代,電資領域人才需求爆發式成長,不論是前端網頁設計、嵌入式開發、人工智慧、物聯網還是軟硬體整合,這些技術都在改變世界。而掌握 C/C++、Python、數位邏輯、電路學與嵌入式開發等大學電資領域的課程,正是進入這個高薪、高需求產業的關鍵!
2025/03/06
在 React 中,狀態管理是構建複雜應用的重要一環,其中 useContext 與 Redux 都提供了解決方案,但它們各有優缺點和適用場景。 有鑑於Redux以英文教學為主,網上中文的教學不多,初學者會遇到一些困難,所以本章節希望以一篇文章帶領你快速入門Redux,透過實作的方式上手這個技能!
2025/03/06
在 React 中,狀態管理是構建複雜應用的重要一環,其中 useContext 與 Redux 都提供了解決方案,但它們各有優缺點和適用場景。 有鑑於Redux以英文教學為主,網上中文的教學不多,初學者會遇到一些困難,所以本章節希望以一篇文章帶領你快速入門Redux,透過實作的方式上手這個技能!
2025/03/05
在 React 中,useContext() 是一個 Hook,用來讓你在函式元件中輕鬆地存取 context 資料,避免繁瑣的 props 傳遞。以下是一步步的教學與示例程式碼。 透過本章學習,你將掌握 如何在 React 應用中運用 useContext() 管理全域狀態,提升開發效率!
2025/03/05
在 React 中,useContext() 是一個 Hook,用來讓你在函式元件中輕鬆地存取 context 資料,避免繁瑣的 props 傳遞。以下是一步步的教學與示例程式碼。 透過本章學習,你將掌握 如何在 React 應用中運用 useContext() 管理全域狀態,提升開發效率!
2025/03/05
在本章,我們將使用 React Hooks(useState、useEffect、useRef)來 開發一個碼錶 (Stopwatch) 應用。
2025/03/05
在本章,我們將使用 React Hooks(useState、useEffect、useRef)來 開發一個碼錶 (Stopwatch) 應用。
看更多
你可能也想看
Thumbnail
債券投資,不只是高資產族群的遊戲 在傳統的投資觀念中,海外債券(Overseas Bonds)常被貼上「高資產族群專屬」的標籤。過去動輒 1 萬甚至 10 萬美元的最低申購門檻,讓許多想尋求穩定配息的小資族望而卻步。 然而,在股市波動劇烈的環境下,尋求穩定的美元現金流與被動收入成為許多投資人
Thumbnail
債券投資,不只是高資產族群的遊戲 在傳統的投資觀念中,海外債券(Overseas Bonds)常被貼上「高資產族群專屬」的標籤。過去動輒 1 萬甚至 10 萬美元的最低申購門檻,讓許多想尋求穩定配息的小資族望而卻步。 然而,在股市波動劇烈的環境下,尋求穩定的美元現金流與被動收入成為許多投資人
Thumbnail
透過川普的近期債券交易揭露,探討債券作為資產配置中「穩定磐石」的重要性。文章分析降息對債券的潛在影響,以及股神巴菲特的操作策略。並介紹玉山證券「小額債」平臺,如何讓小資族也能低門檻參與海外債券市場,實現「低門檻、低波動、固定收益」的務實投資方式。
Thumbnail
透過川普的近期債券交易揭露,探討債券作為資產配置中「穩定磐石」的重要性。文章分析降息對債券的潛在影響,以及股神巴菲特的操作策略。並介紹玉山證券「小額債」平臺,如何讓小資族也能低門檻參與海外債券市場,實現「低門檻、低波動、固定收益」的務實投資方式。
Thumbnail
解析「債券」如何成為資產配置中的穩定錨,提供低風險高回報的投資選項。 藉由玉山證券的低門檻債券服務,投資者可輕鬆入手,平衡風險並穩定財務。
Thumbnail
解析「債券」如何成為資產配置中的穩定錨,提供低風險高回報的投資選項。 藉由玉山證券的低門檻債券服務,投資者可輕鬆入手,平衡風險並穩定財務。
Thumbnail
相較於波動較大的股票,債券能提供固定現金流,而玉山證券推出的小額債,更以1000 美元的低門檻,讓學生與新手也能參與全球優質企業債投資。玉山E-Trader平台即時報價、條件式篩選與清楚的交易流程等特色,大幅降低投資難度,對於希望分散風險、建立穩定現金流的人來說,玉山小額債是一個值得嘗試的理財起點。
Thumbnail
相較於波動較大的股票,債券能提供固定現金流,而玉山證券推出的小額債,更以1000 美元的低門檻,讓學生與新手也能參與全球優質企業債投資。玉山E-Trader平台即時報價、條件式篩選與清楚的交易流程等特色,大幅降低投資難度,對於希望分散風險、建立穩定現金流的人來說,玉山小額債是一個值得嘗試的理財起點。
Thumbnail
這篇內容,將會講解什麼是陣列,以及與陣列相關的知識。包括陣列的簡介、陣列的資料限制、陣列的維度、一維陣列、二維陣列。
Thumbnail
這篇內容,將會講解什麼是陣列,以及與陣列相關的知識。包括陣列的簡介、陣列的資料限制、陣列的維度、一維陣列、二維陣列。
Thumbnail
一般在使用 TypeScript 的時候,大家都有遇過定義列舉資料的情境吧。 不過不管是 enum 和 literal 的方式其實都有些小缺點,以下推薦一個個人認為體驗更好的方式。
Thumbnail
一般在使用 TypeScript 的時候,大家都有遇過定義列舉資料的情境吧。 不過不管是 enum 和 literal 的方式其實都有些小缺點,以下推薦一個個人認為體驗更好的方式。
Thumbnail
你好,在下最近在學習開發web,學了html css js,也得出一些心得,由於網路上已有許多教學,所以我會著重在如何開發出to do List,以及解釋我寫的程式碼。相關的教學我會直接貼網址。如果我有什麼地方出錯,或者是可以寫得更好,歡迎在下方留言,討論。 首先先介紹我的開發環境: 我用了vs
Thumbnail
你好,在下最近在學習開發web,學了html css js,也得出一些心得,由於網路上已有許多教學,所以我會著重在如何開發出to do List,以及解釋我寫的程式碼。相關的教學我會直接貼網址。如果我有什麼地方出錯,或者是可以寫得更好,歡迎在下方留言,討論。 首先先介紹我的開發環境: 我用了vs
Thumbnail
在 TypeScript 中,套件是模組化代碼的集合,可以提高代碼的可重用性和可維護性。常見的套件包括各種庫和框架,如 lodash、express 等。以下是有關引用套件、自定義套件和常見套件的詳細介紹。
Thumbnail
在 TypeScript 中,套件是模組化代碼的集合,可以提高代碼的可重用性和可維護性。常見的套件包括各種庫和框架,如 lodash、express 等。以下是有關引用套件、自定義套件和常見套件的詳細介紹。
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News