iT邦幫忙

2024 iThome 鐵人賽

DAY 13
0
Modern Web

從 0 到 1:30 篇文章帶你玩轉 Electron 與 React系列 第 13

Redux 狀態管理:在 Electron 中管理應用狀態

  • 分享至 

  • xImage
  •  

Redux 是一個非常流行的狀態管理工具,通常用於 React 應用中。它採用單一的狀態樹,所有應用狀態存在一個地方,並通過單向資料流進行管理。當我們使用 Electron 來構建桌面應用時,隨著應用的增長,我們也需要一個統一的方式來管理應用狀態,這時候就可以考慮引入 Redux。


為什麼要在 Electron 中使用 Redux?

  1. 統一管理應用狀態:Electron 應用可能有多個視窗,每個視窗可能會修改全局狀態,使用 Redux 可以將這些狀態統一存放,確保各個視窗狀態一致。
  2. 可預測的資料流:Redux 的單向資料流讓狀態變更變得可追蹤,幫助開發者更容易地處理和狀態變更。
  3. 擴展性強:Redux 的中間件系統可以輕鬆擴展功能,如支持異步操作和複雜的業務邏輯。

基本架構與流程

Electron 中使用 Redux,我們的應用會有兩個主要部分:

  • 主程序 (Main Process):Electron 的主程序負責控制視窗創建、文件系統操作等。
  • 渲染程序 (Renderer Process):每個視窗都有一個渲染程序,它負責處理用戶界面,通常使用 React 來構建。

Redux 狀態管理會主要集中在渲染程序中,不過,我們可以通過 Electron IPC (Inter-Process Communication) 來實現跨程序的狀態同步。


如何在 Electron 中使用 Redux

我們將通過以下步驟,展示如何在 Electron 中設置並使用 Redux 來管理應用狀態。

1. 初始化項目並安裝依賴

首先,我們需要創建一個 Electron 項目並安裝所需的依賴,包括 ElectronReduxReact 等庫。

mkdir electron-redux-app
cd electron-redux-app

# 初始化 npm 項目
npm init -y

# 安裝 Electron
npm install electron --save-dev

# 安裝 React、Redux 及相關套件
npm install react react-dom redux react-redux

2. 配置 package.json 文件

我們需要配置 Electron 的入口點。main 指定主程序的代碼,start 命令用於運行應用。

{
  "name": "electron-redux-app",
  "version": "1.0.0",
  "main": "src/main.js",
  "scripts": {
    "start": "electron ."
  },
  "devDependencies": {
    "electron": "^25.2.0"
  },
  "dependencies": {
    "react": "^18.0.0",
    "react-dom": "^18.0.0",
    "redux": "^4.0.0",
    "react-redux": "^8.0.0"
  }
}

3. 設置主程序 (main.js)

主程序負責創建視窗並加載我們的前端頁面,這裡我們設置一個簡單的視窗來渲染 React 組件。

// src/main.js
const { app, BrowserWindow } = require('electron');
const path = require('path');

function createWindow() {
  const win = new BrowserWindow({
    width: 800,
    height: 600,
    webPreferences: {
      preload: path.join(__dirname, 'preload.js'),
      nodeIntegration: true,
      contextIsolation: false,
    },
  });

  win.loadFile('src/index.html');
}

app.whenReady().then(() => {
  createWindow();

  app.on('activate', () => {
    if (BrowserWindow.getAllWindows().length === 0) {
      createWindow();
    }
  });
});

app.on('window-all-closed', () => {
  if (process.platform !== 'darwin') {
    app.quit();
  }
});

4. 設置 React 和 Redux 結構

接下來,我們設置 Redux 的 store 和 React 組件來顯示應用的狀態。首先,我們需要創建一個 Redux store 並將它提供給 React 應用。

(1) 創建 Redux store

// src/store.js
import { createStore } from 'redux';

// 初始狀態
const initialState = {
  counter: 0,
};

// 定義 reducer
const counterReducer = (state = initialState, action) => {
  switch (action.type) {
    case 'INCREMENT':
      return { counter: state.counter + 1 };
    case 'DECREMENT':
      return { counter: state.counter - 1 };
    default:
      return state;
  }
};

// 創建 store
const store = createStore(counterReducer);

export default store;

(2) 創建 React 組件並連接 Redux

我們使用 React-Redux 來將 Redux store 提供給 React 應用,並使用 useSelectoruseDispatch 來讀取和修改狀態。

// src/App.jsx
import React from 'react';
import { useSelector, useDispatch } from 'react-redux';

function App() {
  const counter = useSelector((state) => state.counter);
  const dispatch = useDispatch();

  return (
    <div>
      <h1>Counter: {counter}</h1>
      <button onClick={() => dispatch({ type: 'INCREMENT' })}>Increment</button>
      <button onClick={() => dispatch({ type: 'DECREMENT' })}>Decrement</button>
    </div>
  );
}

export default App;

(3) 根組件設置

最後,我們將 Redux store 提供給整個 React 應用。

// src/index.js
import React from 'react';
import ReactDOM from 'react-dom';
import { Provider } from 'react-redux';
import store from './store';
import App from './App';

ReactDOM.render(
  <Provider store={store}>
    <App />
  </Provider>,
  document.getElementById('root')
);

(4) HTML 文件

確保你的 HTML 文件能夠渲染 React 應用。

<!-- src/index.html -->
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Electron Redux App</title>
  </head>
  <body>
    <div id="root"></div>
    <script src="index.js" type="module"></script>
  </body>
</html>

5. 運行應用

完成這些設置後,你可以運行應用來測試。

npm start

你會看到一個帶有 增減按鈕的計數器應用,並且每次點擊按鈕時,Redux store 中的狀態會更新並顯示在視圖上。


在多視窗間共享狀態

Electron 應用中經常會有多個視窗,這些視窗需要共享同一個狀態。Redux 可以與 IPC (Inter-Process Communication) 協同工作來實現多視窗的狀態同步。

  1. 在主程序中管理 Redux store:你可以在主程序中創建 Redux store,並通過 IPC 向各個渲染程序分發狀態變更。
  2. 在渲染程序中監聽狀態變更:各個渲染程序通過 IPC 接收主程序中的狀態變更,並更新界面。

這樣可以確保多個視窗共享同一份狀態,並且狀態變更可以在視窗之間即時同步。


總結

Electron 中使用 Redux 可以幫助你更好地管理應用狀態,尤其是當應用需要多窗口協作時,Redux 能夠保證狀態的統一性和可預測性。通過 IPC,你可以實現跨程序


上一篇
狀態管理:原理及工具介紹
下一篇
與後端 API 整合:用 Axios 發送請求
系列文
從 0 到 1:30 篇文章帶你玩轉 Electron 與 React30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言