原文:https://www.yuque.com/yuxuanbeishui/zog1rm/tgmgws

今天我们就来聊聊 dva 中的 effects 与 reducers以及其中涉及的关键字的使用。如果它们之间工作流程还不太熟悉,请阅读:分析models源码

为了让小伙伴们更好的理解与使用 effects 与 reducers,我们依然找现有的 models 为例:

位置:"/src/pages/Profile/models/profile.js"

<div class="lake-codeblock-content"><div class="CodeMirror"><pre class="cm-s-default"><span class="lake-preview-line"><span class="lake-preview-line-number lake-lm-pad-level-1"></span><span class="lake-preview-codeblock-content"><span class="cm-keyword">import</span> { <span class="cm-def">queryBasicProfile</span>, <span class="cm-def">queryAdvancedProfile</span> } <span class="cm-keyword">from</span> <span class="cm-string">'@/services/api'</span>;

export default { namespace: ‘profile’, state: { basicGoods: [], advancedOperation1: [], advancedOperation2: [], advancedOperation3: [], }, effects: { fetchBasic({ payload }, { call, put }) { const response = yield call(queryBasicProfile, payload); yield put({ type: ‘show’, payload: response, }); }, fetchAdvanced(_, { call, put }) { const response = yield call(queryAdvancedProfile); yield put({ type: ‘show’, payload: response, }); }, }, reducers: { show(state, { payload }) { return { state, payload, }; }, }, };

一、effects 内函数有什么特点?

1、分析 effects 函数形参

从外观上看,我们发现每个自定义函数前都有 " * " 修饰 ,函数有两个参数。

有小伙伴反映说,对( { payload } , { call, put })函数参数不太理解,这是固定写法吗?里面还有其他关键字吗?

那好,我们就一起在控制台上打印出这两个参数:(action,effects)

我先将上述的 fetchBasic 函数代码修改如下:

<div class="lake-codeblock-content"><div class="CodeMirror"><pre class="cm-s-default"><span class="lake-preview-line"><span class="lake-preview-line-number lake-lm-pad-level-1"></span><span class="lake-preview-codeblock-content"><span class="cm-meta">...</span>

*fetchBasic( action, effects ) { console.log( ‘action’, action ); console.log( ‘paramsTwo’, effects ); const { payload } = action; const { call, put } = effects; const response = yield call( queryBasicProfile, payload ); yield put( { type: ‘show’, payload: response, } ); },

如果有不懂此写法的小伙伴: const { payload } = action ,请阅读:解析赋值

在控制台上我可以观察到:

第一个参数 action:

image.png

      <span data-role="maximize" class="lake-image-editor-maximize" style="display: none;"><span class="lake-icon lake-icon-full-screen"></span></span></span></span>
</span>

这里我们可以拿到两个常用的关键字值:payload , type

既然第一个参数 action ,它也叫形参。那在哪个位置调用 fetchBasic 函数的呢?

这个时候我们就要去找 相对应的UI视图文件了,如下:



image.png

      <span data-role="maximize" class="lake-image-editor-maximize" style="display: none;"><span class="lake-icon lake-icon-full-screen"></span></span></span></span>
</span>

这个时候,我们就明白了,原来我们可以在 UI视图文件里调用 effects 中的函数,而且函数的第一个形参就是我们手动传入相关必要参数。

比如,我们要编写登陆功能代码,可以传入 “用户名”、“密码”:

<div class="lake-codeblock-content"><div class="CodeMirror"><pre class="cm-s-default"><span class="lake-preview-line"><span class="lake-preview-line-number lake-lm-pad-level-0"></span><span class="lake-preview-codeblock-content"><span class="cm-meta">...</span>

dispatch({ type:‘user/login’, payload:{ username:‘羽旋杯水’, password:‘123456’}, });

这个时候,我们就在 user.js 文件的 *login( { payload },{ call , put} ), 此时 payload = { username:'羽旋杯水', password:'123456'} ,将拿到的数据经过逻辑处理,就可以和后端进行交互了。

OK ,我现在来看第二个参数 effects ,它会在控制台打印出什么呢?

image.png

      <span data-role="maximize" class="lake-image-editor-maximize" style="display: none;"><span class="lake-icon lake-icon-full-screen"></span></span></span></span>
</span>

从打印结果看,dva 预设的默认函数还是比较多的,但是我们比较常用 3 个,分别是:call ,put ,select

2、call、put、select 用法

那它们都代表什么含义?怎么使用呢?

call:用于调用异步逻辑,支持 promise 。

<div class="lake-codeblock-content"><div class="CodeMirror"><pre class="cm-s-default"><span class="lake-preview-line"><span class="lake-preview-line-number lake-lm-pad-level-0"></span><span class="lake-preview-codeblock-content"><span class="cm-comment">//call用法:</span>

//request :代表发送ajax请求 //payload :代表发送ajax请求时,所需要的参数 const res = yield call(request,payload);

put:用于触发 action。

<div class="lake-codeblock-content"><div class="CodeMirror"><pre class="cm-s-default"><span class="lake-preview-line"><span class="lake-preview-line-number lake-lm-pad-level-0"></span><span class="lake-preview-codeblock-content"><span class="cm-comment">//put用法:</span>

//xx代表:models名 //jj代表:函数名 //res代表:所需的数据 yield put ({ type:‘xx/jj’, payload:res });

select:用于从 state 里获取数据。

<div class="lake-codeblock-content"><div class="CodeMirror"><pre class="cm-s-default"><span class="lake-preview-line"><span class="lake-preview-line-number lake-lm-pad-level-0"></span><span class="lake-preview-codeblock-content"><span class="cm-comment">//select用法:</span>

//data代表:所需要的数据 //其中state:代表所有models数据 const data = yield select(state=>state.data);

细心的小伙伴就有疑问了,每个关键字前面都有 yield ,yield的作用是什么呢?

yield作用:保证当前语句执行完毕后,再执行下面的代码。

二、reducers 内函数有什么特点?

1、分析 reducers 函数形参

<div class="lake-codeblock-content"><div class="CodeMirror"><pre class="cm-s-default"><span class="lake-preview-line"><span class="lake-preview-line-number lake-lm-pad-level-1"></span><span class="lake-preview-codeblock-content"><span class="cm-meta">...</span>

reducers: { show(state, { payload }) { return { state, payload, }; }, },

大多数情况下,我们只需要一个 show 函数就可以完成大部分业务需求了。

show 函数的第一个形参 state,就是我们的预设数据。

show 函数的第二个形参 action,就是我们传过来的参数数据。

有些小伙伴不太理解其中 return 返回内容,我们就来分析一下吧。

分析之前,推荐阅读:属性展开

这里的 return { ...state, ...payload },意思是将 payload 传过来的数据,保存到预设 state 里。所以当 state 数据发生改变后,页面也会随之重新渲染。

其实,effects 和 reducers 还是比较简单的。大家理解了吗?

聊聊 effects 与 reducers--React AntDesign Dva相关推荐

  1. React之Dva的学习

    一.创建Dva工程 我们前两篇都是用create-react-app创建工程的,但是它只能创建一个最基本的空程序.在前两篇中,我们自己用npm装上了router,redux等依赖包,并自己手动写了很多 ...

  2. React Create-React-App DVA 的后台管理UI

    dva-boot-admin 是一个用React开发的一个企业级中后台管理UI,包含常用的业务,组件,及数据流转方案,前后端分离的开发方式,按业务划分的目录结构,可以大大提高我们的开发效率 下面是整体 ...

  3. react-cropper + antdesign +dva 实现裁剪图片并上传的功能

    react-cropper + antdesign +dva 实现裁剪图片并上传的功能 一.首先安装react-cropper插件 npm install --save react-cropper 执 ...

  4. react+antd+dva细节

    首先是项目结构 1.js+modal+service,页面+数据+端口 js是骨架,modal是血肉,services是数据源 js写页面,页面可以有子页面或者小弹窗,子页面弹窗直接引用,需要的数据等 ...

  5. react ant-design自定义图标

    ant-design给我们提供的图标不够怎么办呢?答案是我们可以自定义图标. 自定义图标也挺简单的,现在图标推荐用svg格式,那么我们就需要制作svg图片. 下面让我们看看如果制作svg图片吧. 1. ...

  6. React + ant-design实现文件下载

    我们知道react实现一个请求的流程是,页面js文件触发事件,然后调用models内的fetch,然后再去service内找对应的api,发送request请求即完成. 现在我在开发的过程中碰到一个问 ...

  7. Ant Design Pro V4 入门到实战手册【2020】

    前言 第一章 初识 Ant Design Pro 1. 调整 Ant Design Pro 基本配置 2. 浅析 Ant Design Pro 工作流程 第二章 布局和路由 1. 复杂页面布局的&qu ...

  8. React爬坑之路三:Dva

    前两篇写了react各种基本操作和主要概念 但其实没必要那么复杂直接用框架就好啦 这年头前端框架真是一睁眼就多出好几个 傻瓜级教程写的不合理的地方请批评指正 React官网:https://react ...

  9. react json转换_Typescript + React 新手篇

    极链科技前端工程师茅丹丹 前言 · TS是什么 Type = Type + (标准JS). TS的官方网站:Type is a typed superset of Java that compiles ...

最新文章

  1. 【文末送5本书】与「韦神」齐名,35岁刁晗生任教清华!18岁一战成名,数学界颜值巅峰...
  2. 访谈|在网络世界捕获威胁的猎人
  3. 第二次数据库作业--gui
  4. linux下安装 QQ(wine qq 2013-2014)
  5. jpa映射json_如何使用JPA和Hibernate映射JSON集合
  6. python模块学习之glob模块
  7. php获取扫码枪的数据,js 获取扫码枪输入数据的方法
  8. java求数组和值_用java编写数组求和,array[]和ArrayList()?
  9. 通向码农的道路(enet开源翻译计划 二)
  10. Python+sklearn使用线性回归算法预测儿童身高
  11. C语言分治算法求中位数,【算法复习】分治算法
  12. SPSS正态性检验(图文+数据集)【SPSS 015期】
  13. hdoj1249三角形划分平面(递推+规律总结 )
  14. Stata | 导入导出文件
  15. PyQt环境的搭建:安装python+pyqt+eric
  16. Oracle Dataguard基于rac主库搭建rac备库
  17. 老飞飞魅力飞飞关于攻击辅助研究带易语言源码视频教程
  18. 针对Informer中时序数据ETT油温数据分析
  19. Android-悬浮窗功能的实现(附Java、KT实现源码,自学Android
  20. 蓝桥杯 算法训练 Beaver's Calculator

热门文章

  1. ON/安森美FCH041N65F车规级MOS管,原厂渠道ASEMI代理
  2. 计算机图形学中的曲线问题
  3. The 2020 ICPC Asia Shenyang Regional Programming Contest I题 Rise of Shadows(数论)
  4. 已达到计算机的连接数最大值,无法再同次计算机连接
  5. FPGA(四):高级设计
  6. 做题心得篇12.26
  7. tp5中渲染页面将时间戳转换为日期时间格式(Y-m-d H:i:s)
  8. Powerpivot PowerBI相关组件下载安装(附操作截图)
  9. 【macOS Catalina 10.15.X(19xx)原版镜像合集】
  10. i18n(国际化)地域标识码