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項目會在之後的幾章節後再做實現,目前讀者只需要知道相關的邏輯操作。

在當今數位時代,電資領域人才需求爆發式成長,不論是前端網頁設計、嵌入式開發、人工智慧、物聯網還是軟硬體整合,這些技術都在改變世界。而掌握 C/C++、Python、數位邏輯、電路學與嵌入式開發等大學電資領域的課程,正是進入這個高薪、高需求產業的關鍵!
留言
avatar-img
留言分享你的想法!

































































在 React 中,我們可以利用 JavaScript 的條件運算特性,在 JSX 中根據狀態或 props 的不同,渲染不同內容。本章節會帶你快速入門這項知識並實際使用。
在本章節,我們將探討 React Props,這是 React 組件間 傳遞數據 的核心機制。Props (Properties) 允許父組件將數據傳遞給子組件,使組件變得更具動態性與重用性。 本章將透過 實際範例,讓你深入理解 React Props 的運作方式。
在 React 中,有三種主要方式可以套用 CSS 來設計和美化應用的外觀。每種方式都有不同的適用場景,本文都有詳細介紹:
React(也稱為React.js或ReactJS)是一個自由及開放原始碼的前端JavaScript工具庫,用於基於UI組件構建使用者介面。本章節會帶你初步建立環境並教導如何做使用。
在 React 中,我們可以利用 JavaScript 的條件運算特性,在 JSX 中根據狀態或 props 的不同,渲染不同內容。本章節會帶你快速入門這項知識並實際使用。
在本章節,我們將探討 React Props,這是 React 組件間 傳遞數據 的核心機制。Props (Properties) 允許父組件將數據傳遞給子組件,使組件變得更具動態性與重用性。 本章將透過 實際範例,讓你深入理解 React Props 的運作方式。
在 React 中,有三種主要方式可以套用 CSS 來設計和美化應用的外觀。每種方式都有不同的適用場景,本文都有詳細介紹:
React(也稱為React.js或ReactJS)是一個自由及開放原始碼的前端JavaScript工具庫,用於基於UI組件構建使用者介面。本章節會帶你初步建立環境並教導如何做使用。
你可能也想看
Google News 追蹤
Thumbnail
這篇內容,將會講解什麼是陣列,以及與陣列相關的知識。包括陣列的簡介、陣列的資料限制、陣列的維度、一維陣列、二維陣列。
Thumbnail
一般在使用 TypeScript 的時候,大家都有遇過定義列舉資料的情境吧。 不過不管是 enum 和 literal 的方式其實都有些小缺點,以下推薦一個個人認為體驗更好的方式。
Thumbnail
你好,在下最近在學習開發web,學了html css js,也得出一些心得,由於網路上已有許多教學,所以我會著重在如何開發出to do List,以及解釋我寫的程式碼。相關的教學我會直接貼網址。如果我有什麼地方出錯,或者是可以寫得更好,歡迎在下方留言,討論。 首先先介紹我的開發環境: 我用了vs
Thumbnail
在 TypeScript 中,套件是模組化代碼的集合,可以提高代碼的可重用性和可維護性。常見的套件包括各種庫和框架,如 lodash、express 等。以下是有關引用套件、自定義套件和常見套件的詳細介紹。
React Hooks 是 React 16.8 中引入的一組新的 API,允許你在函數組件中使用狀態和其他 React 特性,而不需要寫類組件。 狀態管理: useState 鉤子允許在函數組件中添加狀態。 副作用管理: useEffect 鉤子允許處理副作用,如數據獲取、訂閱和手動 DO
Thumbnail
在程式任何地方都能修改各種react組件狀態的做法分享
※ 好用的陣列迭代器:forEach forEach 的使用時機: 需要從頭到尾把陣列中的每一個元素都印出來 ,就適合使用 forEach 方法。 forEach 的必要參數是一個函式: forEach() 的功能是把陣列的每個元素都丟進某個函式執行一次,因此必要的參數是一個函式。 語法:
Thumbnail
JavaScript 套件,頁碼 Pagination.js 搭配 axios API 請求範例
Thumbnail
前言 現在的前端需求已經越來越高,要考慮HTML及CSS的切版美觀程度,以及React以及Flutter所提出的元件(Componet、widget)觀念,也就是將元件模組化,使元件可以更動態的被程式運行,而不用靜態的客製化每一個介面。開發一個好的元件可以提升整體的開發速度,讓任何使用元件的開發者
Thumbnail
React Props - React 白話文運動。這一篇則會針對 React 語法進一步做講解, 前幾篇也學會了如何建立一個 React 元件,並且學會了元件之間有父子元件的關係。這篇會介紹 React Props 的概念,包含了:React 元件宣告、React Props。
Thumbnail
這篇內容,將會講解什麼是陣列,以及與陣列相關的知識。包括陣列的簡介、陣列的資料限制、陣列的維度、一維陣列、二維陣列。
Thumbnail
一般在使用 TypeScript 的時候,大家都有遇過定義列舉資料的情境吧。 不過不管是 enum 和 literal 的方式其實都有些小缺點,以下推薦一個個人認為體驗更好的方式。
Thumbnail
你好,在下最近在學習開發web,學了html css js,也得出一些心得,由於網路上已有許多教學,所以我會著重在如何開發出to do List,以及解釋我寫的程式碼。相關的教學我會直接貼網址。如果我有什麼地方出錯,或者是可以寫得更好,歡迎在下方留言,討論。 首先先介紹我的開發環境: 我用了vs
Thumbnail
在 TypeScript 中,套件是模組化代碼的集合,可以提高代碼的可重用性和可維護性。常見的套件包括各種庫和框架,如 lodash、express 等。以下是有關引用套件、自定義套件和常見套件的詳細介紹。
React Hooks 是 React 16.8 中引入的一組新的 API,允許你在函數組件中使用狀態和其他 React 特性,而不需要寫類組件。 狀態管理: useState 鉤子允許在函數組件中添加狀態。 副作用管理: useEffect 鉤子允許處理副作用,如數據獲取、訂閱和手動 DO
Thumbnail
在程式任何地方都能修改各種react組件狀態的做法分享
※ 好用的陣列迭代器:forEach forEach 的使用時機: 需要從頭到尾把陣列中的每一個元素都印出來 ,就適合使用 forEach 方法。 forEach 的必要參數是一個函式: forEach() 的功能是把陣列的每個元素都丟進某個函式執行一次,因此必要的參數是一個函式。 語法:
Thumbnail
JavaScript 套件,頁碼 Pagination.js 搭配 axios API 請求範例
Thumbnail
前言 現在的前端需求已經越來越高,要考慮HTML及CSS的切版美觀程度,以及React以及Flutter所提出的元件(Componet、widget)觀念,也就是將元件模組化,使元件可以更動態的被程式運行,而不用靜態的客製化每一個介面。開發一個好的元件可以提升整體的開發速度,讓任何使用元件的開發者
Thumbnail
React Props - React 白話文運動。這一篇則會針對 React 語法進一步做講解, 前幾篇也學會了如何建立一個 React 元件,並且學會了元件之間有父子元件的關係。這篇會介紹 React Props 的概念,包含了:React 元件宣告、React Props。