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.mzph.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…