Redux 是一個 JavaScript 狀態管理工具,經常與 React 搭配使用,來管理複雜的應用程式狀態。Redux 基於 Flux 架構並進行改良,透過將應用程式的所有狀態集中到一個單一的資料源 (Single Source of Truth) 中,讓應用程式的狀態更容易管理與追蹤。Redux 的運作流程主要圍繞以下幾個重要的概念:Actions、Reducers、Store、Dispatch 和 Selectors。
根據 React 進階 - 導入 Redux,讓元件溝通更簡潔 文章中的說明,Redux 的運作流程可以簡要歸納如下:
Redux 操作的方式可以分為兩個主要步驟:
依照上述的流程說明,我們可以在任何地方取得state,而state也會透過預先訂定好的更新規則去更新。執行的狀況可參照下方的圖:

上圖引用自Redux官方文件
Redux 是一個功能強大的狀態管理工具,能夠幫助你在大型應用中有效管理複雜的狀態。
將一步步展示如何在 React 中整合 Redux 並進行狀態管理。
首先,讓我們在 React 應用中安裝必要的套件,使用以下命令:
npm install redux react-redux
建立一個簡單的計數器應用來示範 Redux 的使用。建立一個 reducers 資料夾後,再定義一個 counterReducer,來管理計數器的狀態:
// reducers/counterReducer.js
const initialState = {
  count: 0,
};
const counterReducer = (state = initialState, action) => {
  switch (action.type) {
    case 'INCREMENT':
      return {
        ...state,
        count: state.count + 1,
      };
    case 'DECREMENT':
      return {
        ...state,
        count: state.count - 1,
      };
    default:
      return state;
  }
};
export default counterReducer;
在這個 counterReducer 中,根據接收到的 action.type 來決定如何更新 state。INCREMENT 會將 count 增加 1,而 DECREMENT 則會將 count 減少 1。
接著,將這個 reducer 添加到 rootReducer 中:
// reducers/index.js
import { combineReducers } from 'redux';
import counterReducer from './counterReducer';
const rootReducer = combineReducers({
  counter: counterReducer,
});
export default rootReducer;
這裡使用 combineReducers 能夠將不同的 reducer 組合成一個 rootReducer。
需要建立 Redux store 並將其與 React 應用整合:
// store.js
import { createStore } from 'redux';
import rootReducer from './reducers';
const store = createStore(rootReducer);
export default store;
這裡使用 createStore 創建 Redux store,並將 rootReducer 傳入。rootReducer 是所有 reducer 的集合。
我們將 Redux store 連接到 React 應用中,使用 Provider 將 store 傳遞給應用中的所有組件:
import React from 'react';
import ReactDOM from 'react-dom/client';
import './index.css';
import App from './App';
import { Provider } from 'react-redux';
import store from './store';
const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(
  <React.StrictMode>
    <Provider store={store}>
      <App />
    </Provider>
  </React.StrictMode>
);
Provider 是 React-Redux 提供的高階元件,將應用包裹在 Provider 中後,所有子組件都能夠存取 Redux store 中的狀態。
在 React 組件中,我們需要存取 Redux store 的狀態,並發送 actions 來更新狀態。這裡會用到兩個關鍵的 React-Redux hooks:useSelector 和 useDispatch。
useSelector:用來從 Redux store 中提取需要的狀態。這個 hook 接收一個選擇器函數作為參數,這個函數定義了從 store 中提取的資料:
const count = useSelector((state) => state.counter.count);
上述程式碼中,我們從 store 的 counter 狀態中提取 count 值。
useDispatch:用來發送動作(dispatch actions)到 Redux store。透過 useDispatch,我們可以觸發 reducer 來修改狀態:
import { useDispatch } from 'react-redux';
const dispatch = useDispatch();
使用 dispatch 發送 action 來更新狀態,例如:
const increment = () => {
  dispatch({ type: 'INCREMENT' });
};
const decrement = () => {
  dispatch({ type: 'DECREMENT' });
};
當呼叫 increment 或 decrement 函數時,Redux 會根據 action type 來更新 count 的值。
最後將上述的內容結合起來,會是的計數器組件:
// components/Counter.js
import React from 'react';
import { useSelector, useDispatch } from 'react-redux';
const Counter = () => {
  const count = useSelector((state) => state.counter.count);
  const dispatch = useDispatch();
  const increment = () => {
    dispatch({ type: 'INCREMENT' });
  };
  const decrement = () => {
    dispatch({ type: 'DECREMENT' });
  };
  return (
    <div>
      <h1>{count}</h1>
      <button onClick={increment}>Increment</button>
      <button onClick={decrement}>Decrement</button>
    </div>
  );
};
export default Counter;
計數器應用可以透過點擊按鈕來增減計數,並且 Redux store 中的狀態會隨之更新。
Redux 是狀態管理工具,特別適合在大型應用中使用。Redux 能夠幫助你更好地管理複雜的應用狀態,減少開發過程中的混亂。如果你有更多需要狀態共享或需要追蹤狀態歷史的需求,Redux 會是一個不錯的選擇。
本文將會同步更新到我的部落格