React 中的 useReducer:透過兩個迷你專案簡化狀態管理
介紹
狀態管理是在 React 中建立動態和互動式應用程式的關鍵部分。雖然 useState 足以管理簡單狀態,但隨著應用程式的狀態變得越來越複雜,useReducer 提供了一種更強大、可預測的方法來處理它。受 Redux 的減速器模式的啟發,useReducer 允許您定義狀態轉換應如何發生以響應特定操作,使其成為具有多個複雜狀態更新的場景的理想選擇。
在本文中,我們將:
- 詳細解釋 useReducer、其語法以及何時使用它。
- 實作兩個小專案:
- 具有多個操作的計數器:超越基本增量/減量的範例,展示 useReducer 如何處理多個操作類型。
- 具有複雜狀態轉換的待辦事項清單:一款突出 useReducer 管理複雜狀態物件能力的待辦事項應用。
讓我們深入了解 useReducer 如何簡化 React 中的狀態管理!
理解 useReducer
什麼是 useReducer?
useReducer 是一個 React hook,專為 useState 不足的情況而設計。您不是直接更新狀態,而是指定一個減速器函數,該函數根據當前狀態和操作計算下一個狀態。這種聲明式方法可讓狀態轉換保持可預測,並允許您以集中的方式管理更複雜的狀態邏輯。
useReducer 的語法
以下是語法細分:
const [state, dispatch] = useReducer(reducer, initialState);
-
reducer:定義如何根據操作更新狀態的函數。它需要兩個參數:
- state:目前狀態。
- action:包含操作資訊的對象,通常包括類型和可選的有效負載。
initialState:態的起始值。
範例:使用 useReducer 的基本計數器
讓我們使用 useReducer 建立一個簡單的計數器來查看實際語法。
import React, { useReducer } from 'react'; function reducer(state, action) { switch (action.type) { case 'increment': return { count: state.count + 1 }; case 'decrement': return { count: state.count - 1 }; default: return state; } } function Counter() { const [state, dispatch] = useReducer(reducer, { count: 0 }); return ( <div> <p>Count: {state.count}</p> <button onclick="{()"> dispatch({ type: 'increment' })}>Increment</button> <button onclick="{()"> dispatch({ type: 'decrement' })}>Decrement</button> </div> ); } export default Counter;
守則解釋
- Reducer 函數:此函數定義如何處理動作。根據操作類型(遞增或遞減),reducer 函數傳回一個新的狀態物件。
- 調度操作:調度將一個操作傳送到reducer,reducer對其進行處理並相應地更新狀態。
何時使用 useReducer
useReducer 在以下情況下特別有用:
- 狀態邏輯複雜或涉及多個子值。
- 下一個狀態取決於前一個狀態。
- 多個元件需要存取reducer管理的狀態(可以將useReducer和useContext結合起來使用全域狀態)。
迷你項目1:多個動作的計數器
在這個專案中,我們將建立一個增強的計數器,允許多種操作(遞增、遞減、重置),以了解 useReducer 如何處理更廣泛的操作。
步驟一:定義Reducer函數
const [state, dispatch] = useReducer(reducer, initialState);
步驟2:建立計數器組件
import React, { useReducer } from 'react'; function reducer(state, action) { switch (action.type) { case 'increment': return { count: state.count + 1 }; case 'decrement': return { count: state.count - 1 }; default: return state; } } function Counter() { const [state, dispatch] = useReducer(reducer, { count: 0 }); return ( <div> <p>Count: {state.count}</p> <button onclick="{()"> dispatch({ type: 'increment' })}>Increment</button> <button onclick="{()"> dispatch({ type: 'decrement' })}>Decrement</button> </div> ); } export default Counter;
除了遞增和遞減之外,此增強型計數器現在還支援重置功能。此專案展示了 useReducer 在管理狀態更新操作方面的靈活性。
迷你專案 2:建立具有複雜狀態轉換的待辦事項列表
待辦事項清單應用程式強調了 useReducer 如何非常適合管理具有多個轉換的複雜狀態對象,例如新增、刪除和切換任務。
步驟一:定義Reducer
import React, { useReducer } from 'react'; function reducer(state, action) { switch (action.type) { case 'increment': return { count: state.count + 1 }; case 'decrement': return { count: state.count - 1 }; case 'reset': return { count: 0 }; default: throw new Error(`Unknown action: ${action.type}`); } }
第 2 步:建立待辦事項清單元件
從 'react' 匯入 React, { useReducer, useState }; 函數待辦事項清單(){ const [todos, 調度] = useReducer(todoReducer, []); const [任務,setTask] = useState(''); const handleAdd = () =>; { if (task.trim()) { 調度({ 類型:'添加',有效負載:任務 }); 設定任務(''); // 清空輸入框 } }; 返回 ( <div> <h2 id="待辦事項清單">待辦事項清單</h2> ; setTask(e.target.value)} placeholder="輸入新任務" >> <button onclick="{handleAdd}">新增任務</button> <ul> {todos.map(todo => ( <li key="{todo.id}"> <h3> 待辦事項清單代碼說明 </h3> <ol> <li> <p><strong>行動</strong>:</p> <ul> <li> <strong>新增</strong>:將新任務新增至清單中,並使用唯一 ID 並將已完成狀態設為 false。 </li> <li> <strong>刪除</strong>:根據ID過濾掉任務來刪除它。 </li> <li> <strong>切換</strong>:透過切換已完成狀態將任務標記為已完成或未完成。 </li> </ul> </li> <li><p><strong>將 useReducer 與動態資料結合使用</strong>:此範例展示了 useReducer 如何處理物件陣列中複雜的巢狀狀態更新,使其非常適合管理具有多個屬性的專案。 </p></li> </ol> <hr> <h2> 結論 </h2> <p>在本文中,您學習如何有效地使用 useReducer 在 React 應用程式中進行更複雜的狀態管理。透過我們的專案:</p> <ol> <li> <strong>增強型計數器</strong>示範了 useReducer 如何簡化多個基於操作的狀態更新。 </li> <li> <strong>待辦事項清單</strong>說明如何使用 useReducer 管理複雜的狀態對象,例如任務數組。 </li> </ol> <p>使用 useReducer,您可以為需要強大狀態管理的應用程式編寫更乾淨、更可預測且可維護的程式碼。嘗試這些項目,下次在 React 應用程式中遇到複雜的狀態邏輯時,請考慮使用Reducer! </p> </li> </ul> </div>
以上是useReducer:React Hooks的詳細內容。更多資訊請關注PHP中文網其他相關文章!

JavaScript字符串替換方法詳解及常見問題解答 本文將探討兩種在JavaScript中替換字符串字符的方法:在JavaScript代碼內部替換和在網頁HTML內部替換。 在JavaScript代碼內部替換字符串 最直接的方法是使用replace()方法: str = str.replace("find","replace"); 該方法僅替換第一個匹配項。要替換所有匹配項,需使用正則表達式並添加全局標誌g: str = str.replace(/fi

因此,在這裡,您準備好了解所有稱為Ajax的東西。但是,到底是什麼? AJAX一詞是指用於創建動態,交互式Web內容的一系列寬鬆的技術。 Ajax一詞,最初由Jesse J創造

10款趣味橫生的jQuery遊戲插件,讓您的網站更具吸引力,提升用戶粘性!雖然Flash仍然是開發休閒網頁遊戲的最佳軟件,但jQuery也能創造出令人驚喜的效果,雖然無法與純動作Flash遊戲媲美,但在某些情況下,您也能在瀏覽器中獲得意想不到的樂趣。 jQuery井字棋遊戲 遊戲編程的“Hello world”,現在有了jQuery版本。 源碼 jQuery瘋狂填詞遊戲 這是一個填空遊戲,由於不知道單詞的上下文,可能會產生一些古怪的結果。 源碼 jQuery掃雷遊戲

本教程演示瞭如何使用jQuery創建迷人的視差背景效果。 我們將構建一個帶有分層圖像的標題橫幅,從而創造出令人驚嘆的視覺深度。 更新的插件可與JQuery 1.6.4及更高版本一起使用。 下載

本文討論了在瀏覽器中優化JavaScript性能的策略,重點是減少執行時間並最大程度地減少對頁面負載速度的影響。

本文演示瞭如何使用jQuery和ajax自動每5秒自動刷新DIV的內容。 該示例從RSS提要中獲取並顯示了最新的博客文章以及最後的刷新時間戳。 加載圖像是選擇

Matter.js是一個用JavaScript編寫的2D剛體物理引擎。此庫可以幫助您輕鬆地在瀏覽器中模擬2D物理。它提供了許多功能,例如創建剛體並為其分配質量、面積或密度等物理屬性的能力。您還可以模擬不同類型的碰撞和力,例如重力摩擦力。 Matter.js支持所有主流瀏覽器。此外,它也適用於移動設備,因為它可以檢測觸摸並具有響應能力。所有這些功能都使其值得您投入時間學習如何使用該引擎,因為這樣您就可以輕鬆創建基於物理的2D遊戲或模擬。在本教程中,我將介紹此庫的基礎知識,包括其安裝和用法,並提供一


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

MantisBT
Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。

MinGW - Minimalist GNU for Windows
這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

SublimeText3 英文版
推薦:為Win版本,支援程式碼提示!

禪工作室 13.0.1
強大的PHP整合開發環境