React中的狀態管理Dva總結

在 React 開發中,隨著應用的復雜度增加,如何高效地管理應用狀態成為了一個非常重要的問題。為了解決這一問題,很多開發者選擇了 Redux,然而 Redux 的學習曲線較陡,且需要配置較多的樣板代碼。為此,Ant Design 團隊基于 Redux 開發了 DVA(Data-View-Action),一個輕量級的、基于 Redux 和 redux-saga 的狀態管理框架,旨在簡化開發流程,提高開發效率。

DVA 的設計靈感來源于?Model-View-Action(MVA)?模式,與 React 的組件化思想類似。它把數據流、視圖渲染、業務邏輯封裝成一個個模型,每個模型包含了數據、操作和副作用。DVA 的核心概念包括以下幾個部分:

DVA 的核心概念包括以下幾個部分:

  1. Model(模型) :DVA 中的 Model 是一個用于管理業務數據的對象,包含了該模塊的狀態(state)、同步操作(reducers)、異步操作(effects)等。每個 Model 都是獨立的,負責某一業務模塊的狀態和邏輯。
  2. View(視圖) :通常是 React 組件,負責渲染用戶界面,展示從 Model 獲取的數據。
  3. Action(動作) :Action 通過 dispatch 觸發,向 Model 發送指令以更新狀態。
  4. Effect(副作用) :處理副作用邏輯,通常用來做異步操作,如 API 請求、定時任務等,DVA 內置了 redux-saga 來處理副作用。

DVA 是建立在 Redux 的基礎上的,因此它的工作原理與 Redux 類似,具有以下幾個關鍵步驟:

  1. 初始化:DVA 會初始化一個 Redux store,使用 dispatch 派發 action 來更新應用的狀態。
  2. Model 管理:每個 Model 包含 state(應用的狀態)、reducers(同步操作)和 effects(異步操作)。當 dispatch 被觸發時,DVA 會調用相應的 reducereffect
  3. 異步處理(redux-saga) :DVA 使用 redux-saga 來處理異步操作。在 effects 中,開發者可以通過 yield 來觸發異步操作(例如,發起 API 請求),并通過 put 來觸發 action,從而更新 state。
  4. 視圖更新:在 React 組件中,通過 connectuseSelector 獲取 state,并將 state 渲染到視圖中。任何 state 的更新都會導致視圖的重新渲染。

為什么要使用Dva?

大家應該都能理解 redux 的概念,并認可這種數據流的控制可以讓應用更可控,以及讓邏輯更清晰。但隨之而來通常會有這樣的疑問:概念太多,并且 reducer, saga, action 都是分離的(分文件)。

這帶來的問題是:

  • 編輯成本高,需要在 reducer, saga, action 之間來回切換
  • 不便于組織業務模型 (或者叫 domain model) 。比如我們寫了一個 userlist 之后,要寫一個 productlist,需要復制很多文件。

還有一些其他的:

  • saga 書寫太復雜,每監聽一個 action 都需要走 fork -> watcher -> worker 的流程
  • entry 書寫麻煩
  • ...

而 dva 正是用于解決這些問題。

什么時候需要使用 dva?

在 react hooks 上線之后。在 Umi 項目中,我們建議輕量的使用 dva。僅僅在以下幾種場景下推薦使用 dva:

  1. 父子組件之間的數據互通
  2. 多頁面之間的數據傳遞(即,公共數據)
  3. 非 react 組件的場景

Dva使用方式

要開始使用 DVA,我們首先需要安裝它:

npm install dva

當你使用Umi時會內置dva只需要安裝插件和配置即可,以全局state為例

// global.ts
import { cloneDeep } from 'lodash'
...interface userInfo {avatar: string; // 頭像avatarStatus: string | number; // 頭像審核狀態。1 正常,2 審核中avatarPending: string; // 正在審核中的頭像gender: number;       // 姓名 未知countryCode: ''; // 國家地區代碼countryName: ''; // 地區名字uid: number;// 用戶iduuid: string; // 用戶uuid
}
const defaultUserInfo: userInfo = {avatar: '',       // 頭像avatarStatus: '', // 頭像狀態。1 正常,2 審核中avatarPending: '', // 正在審核中的頭像gender: -1,       // 姓名 未知countryCode: '', // 國家地區代碼countryName: '', // 地區名字uid: 0, // 用戶iduuid: '', // 用戶uuid
}const GlobalStore = {namespace: 'global',state:{userInfo: cloneDeep(defaultUserInfo),},effects:{// 獲取用戶信息* getUserInfo ({ callback, errorCallback }, { call, put }) {const res: userInfo = yield call(getUserInfo)if (!res.code) {yield put({type: 'setData',payload: {accessToken: '',userInfo: defaultUserInfo,isLogin: false,},})if (typeof errorCallback === 'function') {errorCallback()}window.location.href = '/'return}...if (typeof callback === 'function') {callback(res.data)}},},reducers:{setData(state,{payload}){return {...state,...payload,}}}
}

在組件中使用

import { connect, FormattedMessage, useIntl } from 'umi'
...const NavBar = (props)=>{const {global,dispatch} = propsconst { userInfo } = globalconst getUserProfile = (uuid?: string) => {if (!uuid) {return}dispatch({type: 'userInfo/getUserInfo',payload: {visible: true,uuid,},})}...
}...export default connect((state) =>({global:state.global
}))(NavBar )

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/79796.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/79796.shtml
英文地址,請注明出處:http://en.pswp.cn/web/79796.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

數據結構中的高級排序算法

希爾排序 你可以將希爾排序理解成——先通過幾次分組的、較小的組間插入排序將原數組變得有序&#xff0c;最后再進行一次序列基本有序的完整插入排序。 #include <stdio.h>#define ARR_LEN(arr) (sizeof(arr) / sizeof(arr[0]))void print_arr(int arr[], int len) {for…

計算機視覺最不卷的方向:三維重建學習路線梳理

提到計算機視覺&#xff08;CV&#xff09;&#xff0c;大多數人腦海中會立馬浮現出一個字&#xff1a;“卷”。卷到什么程度呢&#xff1f;2022年秋招CV工程師崗位數下降了16%&#xff0c;但求職人數增加了23%&#xff0c;求職人數與招聘崗位的比例達到了恐怖的15:1&#xff0…

【Docker】Docker環境下快速部署Ollama與Open-WebUI:詳細指南

Docker環境下快速部署Ollama與Open-WebUI&#xff1a;詳細指南 在本篇文章中&#xff0c;我們將深入探討如何在Docker中高效部署 Ollama 和 Open-WebUI&#xff0c;并解決在實際使用中常見的問題&#xff0c;確保你的模型服務穩定高效地運行。 一、Ollama 和 Open-WebUI 快速部…

Vue3學習(組合式API——Watch偵聽器詳解)

目錄 一、Watch偵聽器。 &#xff08;1&#xff09;偵聽單個數據。 &#xff08;2&#xff09;偵聽多個數據。&#xff08;數組寫法&#xff1f;&#xff01;&#xff09; &#xff08;3&#xff09;immediate參數。(立即執行回調) &#xff08;3&#xff09;deep參數。(深層監…

SARIMA-LSTM融合模型對太陽黑子數量預測分析|附智能體數據代碼

全文智能體鏈接&#xff1a;https://tecdat.cn/?p41969 分析師&#xff1a;Peng Fan 本研究以太陽黑子活動數據為研究對象&#xff0c;旨在幫助客戶探索其未來走勢并提供預測分析。首先&#xff0c;通過對數據的清洗和處理&#xff0c;包括離群值的識別與處理以及時間序列的建…

簡單易懂的JavaScript中的this指針

文章目錄 默認綁定 / 隱式綁定如何調整this1.用變量固定this2.箭頭函數2.bind3.call/apply&#xff08;一次性&#xff09; 默認綁定 / 隱式綁定 要找this指針指向誰&#xff0c;我們首先要做的是&#xff1a;找到一個明確的對象&#xff0c;這個對象調用了含有this指針的函數…

Spring MVC數據綁定和響應 你了解多少?

數據綁定的概念 在程序運行時&#xff0c;Spring MVC接收到客戶端的請求后&#xff0c;會根據客戶端請求的參數和請求頭等數據信息&#xff0c;將參數以特定的方式轉換并綁定到處理器的形參中。Spring MVC中將請求消息數據與處理器的形參建立連接的過程就是Spring MVC的數據綁…

BMS工具箱用來執行貝葉斯模型平均(BMA)計算模塊

貝葉斯模型平均&#xff08;Bayesian Model Averaging&#xff0c;BMA&#xff09;是一種用于處理模型不確定性的統計方法&#xff0c;通過結合多個模型的預測結果來提高預測的準確性和魯棒性。在 MATLAB 中&#xff0c;可以使用專門的工具箱&#xff08;如 BMS 工具箱&#xf…

Java內存馬的檢測與發現

【網絡安全】Java內存馬的檢測與發現 一、Java內存馬的現象二、檢測思路三、重點關注類四、檢測方法1. 檢查方法&#xff08;FindShell&#xff09;2. 檢查方法&#xff08;sa-jdi&#xff09;3. 檢查方法&#xff08;arthas-boot&#xff09;4. 檢查方法&#xff08;cop.jar&a…

ISP有感自發

一、黑電平 由于傳感器&#xff0c;即便在無光的情況下&#xff0c;依然會產生微小的暗電流&#xff0c;這些暗電流可能是噪點會影響后期的調試。因此&#xff0c;我們便將這些電流處理為0&#xff0c;成為純黑的顏色。可以在源頭消除這些誤差。 如何矯正黑電平&#xff1a; …

數字信號處理-大實驗1.1

MATLAB仿真實驗目錄 驗證實驗&#xff1a;常見離散信號產生和實現驗證實驗&#xff1a;離散系統的時域分析應用實驗&#xff1a;語音信號的基音周期&#xff08;頻率&#xff09;測定 目錄 一、常見離散信號產生和實現 1.1 實驗目的 1.2 實驗要求與內容 1.3 實驗…

【SSL證書系列】https雙向認證中客戶端認證的原理

HTTPS雙向認證&#xff08;也稱為雙向SSL/TLS認證&#xff09;是一種增強安全性的機制&#xff0c;其中客戶端和服務器都需要驗證彼此的數字證書&#xff0c;以確保雙方身份的真實性。以下是其核心原理和步驟的詳細解析&#xff1a; 一、雙向認證的核心目標 雙向身份驗證&#…

Linux系統編程——fork函數的使用方法

在 Linux 系統編程 中&#xff0c;fork() 函數是創建新進程的關鍵系統調用。fork() 在當前進程&#xff08;父進程&#xff09;中創建一個幾乎完全相同的子進程。子進程和父進程從調用 fork() 的位置繼續執行&#xff0c;但它們是兩個獨立的進程&#xff0c;每個進程都有自己的…

LLMs之ChatGPT:《Connecting GitHub to ChatGPT deep research》翻譯與解讀

LLMs之ChatGPT&#xff1a;《Connecting GitHub to ChatGPT deep research》翻譯與解讀 導讀&#xff1a;這篇OpenAI幫助文檔全面介紹了將GitHub連接到ChatGPT進行深度代碼研究的方法、優勢和注意事項。通過連接GitHub&#xff0c;用戶可以充分利用ChatGPT強大的代碼理解和生成…

flutter 視頻通話flutter_webrtc

flutter 比較熱門的庫 flutter_webrtc | Flutter package agora_rtc_engine | Flutter package 我使用的是flutter_webrtc 下面是官方推薦的demo庫 GitHub - flutter-webrtc/flutter-webrtc-demo: Demo for flutter-webrtc 其中 https://demo.cloudwebrtc.com:8086/ 已經停…

同設備訪問php的多個接口會有先后等待問題

同設備訪問php的多個接口會有先后等待問題 這個現象的核心原因通常與 PHP 的 Session 鎖機制 有關&#xff0c;即使兩個接口表面上無關聯&#xff0c;也可能因共享 Session 導致請求排隊。以下是詳細分析&#xff1a; 關鍵背景&#xff1a;PHP 的 Session 鎖機制 PHP 的 Sessi…

【免殺】C2免殺技術(三)shellcode加密

前言 shellcode加密是shellcode混淆的一種手段。shellcode混淆手段有多種&#xff1a;加密&#xff08;編碼&#xff09;、偏移量混淆、UUID混淆、IPv4混淆、MAC混淆等。 隨著殺毒軟件的不斷進化&#xff0c;其檢測方式早已超越傳統的靜態特征分析。現代殺軟往往會在受控的虛…

【論文閱讀】Dip-based Deep Embedded Clustering with k-Estimation

摘要 近年來,聚類與深度學習的結合受到了廣泛關注。無監督神經網絡,如自編碼器,能夠自主學習數據集中的關鍵結構。這一思想可以與聚類目標結合,實現對相關特征的自動學習。然而,這類方法通常基于 k-means 框架,因此繼承了諸如聚類呈球形分布等各種假設。另一項常見假設(…

.NET8關于ORM的一次思考

文章目錄 前言一、思路二、實現ODBC>SqlHelper.cs三、數據對象實體化四、SQL生成SqlBuilder.cs五、參數注入 SqlParameters.cs六、反射 SqlOrm.cs七、自定義數據查詢八、總結 前言 琢磨著在.NET8找一個ORM&#xff0c;對比了最新的框架和性能。 框架批量操作性能SQL控制粒…

CVE-2025-31258 macOS遠程視圖服務沙箱逃逸漏洞PoC已公開

蘋果公司近日針對macOS系統中新披露的CVE-2025-31258漏洞發布補丁&#xff0c;該漏洞可能允許惡意應用程序突破沙箱限制&#xff0c;獲取未授權的系統資源訪問權限。在安全研究員Seo Hyun-gyu公開概念驗證&#xff08;PoC&#xff09;利用代碼后&#xff0c;該漏洞已在macOS Se…