使用 Redux Saga 簡化 React/React Native 專案中的 API 工作流程
本文並非專家級指南,但將盡力解釋如何利用 Redux Saga 在你的 React 或 React Native 專案中處理副作用。如果你的應用程式涉及大量 API 調用,Redux Saga 能簡化流程,讓程式碼更容易管理。
為什麼選擇 Redux Saga?
Redux Saga 是一款中間件,能以清晰可預測的方式管理副作用(如 API 呼叫)。無需在元件或 reducer 中塞滿 API 邏輯,你可以將這些任務委託給 saga。 Saga 允許你寫一個看起來同步的非同步程式碼,使用名為生成器的特殊 JavaScript 函數。
設定資料夾結構
在深入研究 saga 之前,請務必為專案組織好結構,以便擴展。以下是我遵循的基本結構:
- Services: 包含 API 端點和呼叫它們的函數。
- Reducers: 根據 API 回應管理狀態變化。
- Sagas: 處理副作用(如 API 呼叫)並與 reducer 協調工作。
- Services:處理 API 端點
Services 資料夾包含可重複使用的 API 呼叫函數。以下是一個「更改密碼」API 的範例:
// ChangePasswordService.js import {Constants} from '../../Config'; import Ajax from './base'; const BASE_URL = Constants.IS_DEVELOPING_MODE ? Constants.BASE_URL.DEV : Constants.BASE_URL.PROD; export default { ChangePassword: async params => { return fetch(`${BASE_URL}api/change-password`, { method: 'POST', body: params, headers: { Accept: 'multipart/form-data', }, }) .then(response => Ajax.handleResponse(response)) .then(data => { console.log('Data', data); return data; }); }, };
此處,我們定義了一個 ChangePassword 函數來進行 API 呼叫。它使用 fetch 發送 POST 請求到端點,並使用輔助函數 (Ajax.handleResponse) 處理回應。
- Reducers:更新狀態
Reducers 監聽分發的 action 並相應地更新狀態。下面是一個用來管理密碼變更的 reducer:
// PasswordChangeSlice.js import {createSlice} from '@reduxjs/toolkit'; const passwordChangeSlice = createSlice({ name: 'passwordChange', initialState: { data: null, isChangeSuccess: null, error: null, message: null, }, reducers: { changePassword: state => { state.isChangeSuccess = null; state.error = null; state.message = ''; }, changePasswordSuccess: (state, action) => { state.data = action.payload; state.message = 'Password changed successfully'; state.isChangeSuccess = true; }, changePasswordFail: (state, action) => { state.error = action.payload; state.message = 'Something went wrong'; state.isChangeSuccess = false; }, }, }); export const {changePassword, changePasswordSuccess, changePasswordFail} = passwordChangeSlice.actions; export default passwordChangeSlice.reducer;
此 reducer 有三個 action:
-
changePassword
:請求開始時重置狀態。 -
changePasswordSuccess
:使用成功資料更新狀態。 -
changePasswordFail
:使用錯誤訊息更新狀態。
- Sagas:管理副作用
現在進入重點! Saga 處理實際的 API 調用,並根據回應分發 action。這是一個「更改密碼」API 的 saga:
import {all, call, put, takeEvery} from 'redux-saga/effects'; import API from '../Services/ChangePasswordService'; import { changePasswordFail, changePasswordSuccess, } from '../Reducers/PasswordChangeSlice'; function* changePasswordSaga({payload}) { try { const response = yield call(API.ChangePassword, payload); if (response?.data) { yield put(changePasswordSuccess(response.data)); } else if (response?.errors) { yield put(changePasswordFail(response.errors)); } } catch (error) { yield put(changePasswordFail(error.message)); } } function* passwordSaga() { yield all([ takeEvery('passwordChange/changePassword', changePasswordSaga), ]); } export default passwordSaga;
-
call
:呼叫 API 函數 (API.ChangePassword) 並等待結果。 -
put
:分發 action 來更新狀態。 -
takeEvery
:監聽特定 action (changePassword
) 並觸發對應的 worker saga (changePasswordSaga
)。
如果 API 呼叫成功,saga 將分發 changePasswordSuccess
;如果失敗,則分發 changePasswordFail
。
- Hooks:連接組件
為了觸發流程,我們建立一個自訂 hook 來分發 changePassword
action:
// useChangePasswordActions.js import {useDispatch, useSelector} from 'react-redux'; import {changePassword} from '../Reducers/PasswordChangeSlice'; export const useChangePasswordActions = () => { const dispatch = useDispatch(); const passwordState = useSelector(state => state?.changePassword); const changePasswordCall = params => { dispatch(changePassword(params)); }; return { passwordState, changePasswordCall, }; };
工作原理
-
Action 分發: 元件呼叫自訂 hook 中的
changePasswordCall
。 -
Reducer:
changePassword
action 更新狀態以指示正在進行請求。 -
Saga: watcher saga 監聽
changePassword
並觸發 worker saga。 - API 呼叫: worker saga 呼叫 ChangePassword API 並處理回應。
- 狀態更新: saga 分發成功或失敗 action,透過 reducer 更新狀態。
總結
這個設定將你的 API 工作流程組織成清晰且易於管理的步驟:
- Services 處理 API 邏輯。
- Reducers 更新狀態。
- Sagas 處理副作用並將所有內容黏合在一起。
記住,這只是組織專案的一種方式。如果你有更多經驗或想法,請隨時評論你的策略。我將在以後的文章中隨著學習和改進而涵蓋更多關於 saga 的內容。
祝程式設計愉快! ?
以上是如何為 API 呼叫製作 Redux Saga 流程?的詳細內容。更多資訊請關注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 無盡。

熱門文章

熱工具

SecLists
SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。

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

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

SAP NetWeaver Server Adapter for Eclipse
將Eclipse與SAP NetWeaver應用伺服器整合。

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