React 使用 useState 來管理陣列和物件狀態

更新於 發佈於 閱讀時間約 14 分鐘

基本介紹

在 React 中,使用 useState 來管理陣列和物件狀態時,需要遵循不變性原則

  • 不可直接修改原本的陣列或物件(例如直接改變某個索引或屬性),
  • 必須產生一個新的陣列或物件,再透過 setState 更新。

下面提供大量範例,分別展示如何更新陣列和物件。

新增項目到陣列

import React, { useState } from 'react';

function ArrayAddExample() {
// 初始為空陣列
const [items, setItems] = useState([]);

// 函式:新增項目
const addItem = () => {
const newItem = `Item ${items.length + 1}`;
// 使用展開運算子複製舊陣列,加上新項目
setItems(prevItems => [...prevItems, newItem]);
};

return (
<div>
<button onClick={addItem}>Add Item</button>
<ul>
{items.map((item, index) => (
// index 作為 key(僅供示範,真實專案建議使用獨特 id)
<li key={index}>{item}</li>
))}
</ul>
</div>
);
}

export default ArrayAddExample;
  • 使用展開運算子 [...] 產生新陣列,確保不改變原有陣列。
  • 每次點擊按鈕,將新的項目加到陣列末端。

效果:

raw-image

移除陣列中的項目

import React, { useState } from 'react';

function ArrayRemoveExample() {
const [items, setItems] = useState(["Apple", "Banana", "Cherry"]);

// 根據索引移除項目
const removeItem = (indexToRemove) => {
setItems(prevItems =>
prevItems.filter((item, index) => index !== indexToRemove)
);
};

return (
<div>
<ul>
{items.map((item, index) => (
<li key={index}>
{item}
<button onClick={() => removeItem(index)}>Remove</button>
</li>
))}
</ul>
</div>
);
}

export default ArrayRemoveExample;
  • 使用 filter 方法產生一個不包含指定索引的新陣列,並重新渲染。

現在你可以移除項目清單:

效果:

raw-image

更新物件

更新物件的單一屬性

import React, { useState } from 'react';

function ObjectUpdateExample() {
const [user, setUser] = useState({
name: "John",
age: 25,
email: "john@example.com",
});

// 更新名稱
const updateName = () => {
// 使用展開運算子複製原有物件,並更新 name 屬性
setUser(prevUser => ({ ...prevUser, name: "Jane" }));
};

return (
<div>
<p>Name: {user.name}</p>
<p>Age: {user.age}</p>
<p>Email: {user.email}</p>
<button onClick={updateName}>Change Name</button>
</div>
);
}

export default ObjectUpdateExample;
  • 使用展開運算子 { ...prevUser } 產生新物件,然後覆蓋 name 屬性,確保其他屬性保持不變。

更新嵌套物件中的值

當物件中包含嵌套物件時,同樣需要保持不變性,逐層展開。

import React, { useState } from 'react';

function NestedObjectUpdateExample() {
const [profile, setProfile] = useState({
name: "Alice",
contact: {
phone: "123-456-7890",
address: "123 Main St",
},
});

// 更新聯絡資訊中的電話
const updatePhone = () => {
setProfile(prevProfile => ({
...prevProfile,
contact: {
...prevProfile.contact,
phone: "987-654-3210"
},
}));
};

return (
<div>
<p>Name: {profile.name}</p>
<p>Phone: {profile.contact.phone}</p>
<p>Address: {profile.contact.address}</p>
<button onClick={updatePhone}>Update Phone</button>
</div>
);
}

export default NestedObjectUpdateExample;
  • 對於嵌套物件 contact,先展開 prevProfile,然後針對 contact 屬性再次使用展開運算子,覆蓋 phone 屬性。

同時更新物件中的多個屬性

import React, { useState } from 'react';

function MultipleUpdateExample() {
const [settings, setSettings] = useState({
theme: "light",
language: "en",
notifications: true,
});

const updateSettings = () => {
setSettings(prevSettings => ({
...prevSettings,
theme: "dark",
language: "zh",
}));
};

return (
<div>
<p>Theme: {settings.theme}</p>
<p>Language: {settings.language}</p>
<p>Notifications: {settings.notifications ? "On" : "Off"}</p>
<button onClick={updateSettings}>Update Settings</button>
</div>
);
}

export default MultipleUpdateExample;
  • 同時更新多個屬性時,使用單一 setSettings 呼叫,將新值與原有值合併。

添加新的物件屬性

import React, { useState } from 'react';

function AddNewPropExample() {
// 初始狀態只有 name 和 age
const [user, setUser] = useState({
name: 'Alice',
age: 30,
});

// 點擊按鈕時,添加新的屬性 address
const addNewProperty = () => {
setUser(prevUser => ({
...prevUser, // 複製原有屬性
address: '123 Main Street', // 添加新的 address 屬性
}));
};

return (
<div>
<h2>User Information</h2>
<p>Name: {user.name}</p>
<p>Age: {user.age}</p>
<p>Address: {user.address ? user.address : 'Not provided'}</p>
<button onClick={addNewProperty}>Add Address</button>
</div>
);
}

export default AddNewPropExample;
  • 使用展開運算子 (...prevUser) 複製現有的 user 物件,然後再添加新的屬性 address
  • 條件渲染
    在畫面上,使用三元運算子判斷 user.address 是否存在,若存在則顯示地址,否則顯示「Not provided」。

更新陣列中某個項目的值

假設陣列中每個項目都是一個物件,我們需要更新特定項目的屬性。

import React, { useState } from 'react';

function ArrayUpdateExample() {
const [products, setProducts] = useState([
{ id: 1, name: "Laptop", price: 1000 },
{ id: 2, name: "Phone", price: 500 },
]);

// 更新特定產品的價格
const updatePrice = (id, newPrice) => {
setProducts(prevProducts =>
prevProducts.map(product =>
product.id === id ? { ...product, price: newPrice } : product
)
);
};

return (
<div>
{products.map(product => (
<div key={product.id} style={{ marginBottom: "10px" }}>
<span>
{product.name} - ${product.price}
</span>
<button onClick={() => updatePrice(product.id, product.price + 100)}>
Increase Price
</button>
</div>
))}
</div>
);
}

export default ArrayUpdateExample;

使用 map() 方法遍歷陣列,對符合條件的項目使用展開運算子複製原有屬性,再覆蓋掉指定屬性(此處為 price)。

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

































































React 的 state 是一個元件用於儲存動態資料的機制,當 state 變更時,React 會重新渲染元件。本文說明如何在函式元件和類別元件中使用 state,包含 useState hook 的用法,以及如何處理批次更新以避免 state 更新不一致的問題,並提供三個實例讓大家實際操作上手。
在本章節,我們將深入探討 React onClick 事件,這是 React 中最常見的 事件處理機制,允許我們在使用者點擊元素時執行特定的動作。
在本章節,我們將探討 如何在 React JSX 中處理陣列 (Arrays),這是開發動態介面時必須掌握的關鍵技術。透過陣列,我們可以輕鬆地渲染動態清單 (Lists),例如待辦事項列表、產品清單或使用者資訊等。
在 React 中,我們可以利用 JavaScript 的條件運算特性,在 JSX 中根據狀態或 props 的不同,渲染不同內容。本章節會帶你快速入門這項知識並實際使用。
在本章節,我們將探討 React Props,這是 React 組件間 傳遞數據 的核心機制。Props (Properties) 允許父組件將數據傳遞給子組件,使組件變得更具動態性與重用性。 本章將透過 實際範例,讓你深入理解 React Props 的運作方式。
在 React 中,有三種主要方式可以套用 CSS 來設計和美化應用的外觀。每種方式都有不同的適用場景,本文都有詳細介紹:
React 的 state 是一個元件用於儲存動態資料的機制,當 state 變更時,React 會重新渲染元件。本文說明如何在函式元件和類別元件中使用 state,包含 useState hook 的用法,以及如何處理批次更新以避免 state 更新不一致的問題,並提供三個實例讓大家實際操作上手。
在本章節,我們將深入探討 React onClick 事件,這是 React 中最常見的 事件處理機制,允許我們在使用者點擊元素時執行特定的動作。
在本章節,我們將探討 如何在 React JSX 中處理陣列 (Arrays),這是開發動態介面時必須掌握的關鍵技術。透過陣列,我們可以輕鬆地渲染動態清單 (Lists),例如待辦事項列表、產品清單或使用者資訊等。
在 React 中,我們可以利用 JavaScript 的條件運算特性,在 JSX 中根據狀態或 props 的不同,渲染不同內容。本章節會帶你快速入門這項知識並實際使用。
在本章節,我們將探討 React Props,這是 React 組件間 傳遞數據 的核心機制。Props (Properties) 允許父組件將數據傳遞給子組件,使組件變得更具動態性與重用性。 本章將透過 實際範例,讓你深入理解 React Props 的運作方式。
在 React 中,有三種主要方式可以套用 CSS 來設計和美化應用的外觀。每種方式都有不同的適用場景,本文都有詳細介紹:
你可能也想看
Google News 追蹤
Thumbnail
這篇內容,將會講解什麼是陣列,以及與陣列相關的知識。包括陣列的簡介、陣列的資料限制、陣列的維度、一維陣列、二維陣列。
Thumbnail
一般在使用 TypeScript 的時候,大家都有遇過定義列舉資料的情境吧。 不過不管是 enum 和 literal 的方式其實都有些小缺點,以下推薦一個個人認為體驗更好的方式。
Thumbnail
本文介紹了在網站開發中如何運用狀態機的原則和設計方法。通過具體案例分析,以及狀態和數據的區分,詳細介紹了狀態機的設計原則和應用。讀者可以通過本文瞭解如何將狀態機應用於實際的網站開發中。
setter和getter能把狀態改變時需做的事情包裝起來,讓外部只需簡單修改參數就能達到預想的效果
React Hooks 是 React 16.8 中引入的一組新的 API,允許你在函數組件中使用狀態和其他 React 特性,而不需要寫類組件。 狀態管理: useState 鉤子允許在函數組件中添加狀態。 副作用管理: useEffect 鉤子允許處理副作用,如數據獲取、訂閱和手動 DO
Thumbnail
在程式任何地方都能修改各種react組件狀態的做法分享
Thumbnail
2023 Vue直播班筆記 - 動態路由Props,接續之前的一般動態路由。分為 "寫死" 及 "彈性" 兩種。
※ ES6 變數宣告介紹: 在ES6中,推薦使用let和const取代原有的var來宣告變數。 ※ var的特點: 勢力範圍(scope)只有兩種:function、global(全域部分)。 勢力範圍(scope)指的是宣告變數的範圍,能夠被有效的使用的範圍。 可以在宣告變數之前就使用。
Thumbnail
前言 現在的前端需求已經越來越高,要考慮HTML及CSS的切版美觀程度,以及React以及Flutter所提出的元件(Componet、widget)觀念,也就是將元件模組化,使元件可以更動態的被程式運行,而不用靜態的客製化每一個介面。開發一個好的元件可以提升整體的開發速度,讓任何使用元件的開發者
Thumbnail
React Props - React 白話文運動。這一篇則會針對 React 語法進一步做講解, 前幾篇也學會了如何建立一個 React 元件,並且學會了元件之間有父子元件的關係。這篇會介紹 React Props 的概念,包含了:React 元件宣告、React Props。
Thumbnail
這篇內容,將會講解什麼是陣列,以及與陣列相關的知識。包括陣列的簡介、陣列的資料限制、陣列的維度、一維陣列、二維陣列。
Thumbnail
一般在使用 TypeScript 的時候,大家都有遇過定義列舉資料的情境吧。 不過不管是 enum 和 literal 的方式其實都有些小缺點,以下推薦一個個人認為體驗更好的方式。
Thumbnail
本文介紹了在網站開發中如何運用狀態機的原則和設計方法。通過具體案例分析,以及狀態和數據的區分,詳細介紹了狀態機的設計原則和應用。讀者可以通過本文瞭解如何將狀態機應用於實際的網站開發中。
setter和getter能把狀態改變時需做的事情包裝起來,讓外部只需簡單修改參數就能達到預想的效果
React Hooks 是 React 16.8 中引入的一組新的 API,允許你在函數組件中使用狀態和其他 React 特性,而不需要寫類組件。 狀態管理: useState 鉤子允許在函數組件中添加狀態。 副作用管理: useEffect 鉤子允許處理副作用,如數據獲取、訂閱和手動 DO
Thumbnail
在程式任何地方都能修改各種react組件狀態的做法分享
Thumbnail
2023 Vue直播班筆記 - 動態路由Props,接續之前的一般動態路由。分為 "寫死" 及 "彈性" 兩種。
※ ES6 變數宣告介紹: 在ES6中,推薦使用let和const取代原有的var來宣告變數。 ※ var的特點: 勢力範圍(scope)只有兩種:function、global(全域部分)。 勢力範圍(scope)指的是宣告變數的範圍,能夠被有效的使用的範圍。 可以在宣告變數之前就使用。
Thumbnail
前言 現在的前端需求已經越來越高,要考慮HTML及CSS的切版美觀程度,以及React以及Flutter所提出的元件(Componet、widget)觀念,也就是將元件模組化,使元件可以更動態的被程式運行,而不用靜態的客製化每一個介面。開發一個好的元件可以提升整體的開發速度,讓任何使用元件的開發者
Thumbnail
React Props - React 白話文運動。這一篇則會針對 React 語法進一步做講解, 前幾篇也學會了如何建立一個 React 元件,並且學會了元件之間有父子元件的關係。這篇會介紹 React Props 的概念,包含了:React 元件宣告、React Props。