聊聊 effects 与 reducers--React AntDesign Dva
原文: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:
<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视图文件了,如下:
<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 ,它会在控制台打印出什么呢?
<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相关推荐
- React之Dva的学习
一.创建Dva工程 我们前两篇都是用create-react-app创建工程的,但是它只能创建一个最基本的空程序.在前两篇中,我们自己用npm装上了router,redux等依赖包,并自己手动写了很多 ...
- React Create-React-App DVA 的后台管理UI
dva-boot-admin 是一个用React开发的一个企业级中后台管理UI,包含常用的业务,组件,及数据流转方案,前后端分离的开发方式,按业务划分的目录结构,可以大大提高我们的开发效率 下面是整体 ...
- react-cropper + antdesign +dva 实现裁剪图片并上传的功能
react-cropper + antdesign +dva 实现裁剪图片并上传的功能 一.首先安装react-cropper插件 npm install --save react-cropper 执 ...
- react+antd+dva细节
首先是项目结构 1.js+modal+service,页面+数据+端口 js是骨架,modal是血肉,services是数据源 js写页面,页面可以有子页面或者小弹窗,子页面弹窗直接引用,需要的数据等 ...
- react ant-design自定义图标
ant-design给我们提供的图标不够怎么办呢?答案是我们可以自定义图标. 自定义图标也挺简单的,现在图标推荐用svg格式,那么我们就需要制作svg图片. 下面让我们看看如果制作svg图片吧. 1. ...
- React + ant-design实现文件下载
我们知道react实现一个请求的流程是,页面js文件触发事件,然后调用models内的fetch,然后再去service内找对应的api,发送request请求即完成. 现在我在开发的过程中碰到一个问 ...
- Ant Design Pro V4 入门到实战手册【2020】
前言 第一章 初识 Ant Design Pro 1. 调整 Ant Design Pro 基本配置 2. 浅析 Ant Design Pro 工作流程 第二章 布局和路由 1. 复杂页面布局的&qu ...
- React爬坑之路三:Dva
前两篇写了react各种基本操作和主要概念 但其实没必要那么复杂直接用框架就好啦 这年头前端框架真是一睁眼就多出好几个 傻瓜级教程写的不合理的地方请批评指正 React官网:https://react ...
- react json转换_Typescript + React 新手篇
极链科技前端工程师茅丹丹 前言 · TS是什么 Type = Type + (标准JS). TS的官方网站:Type is a typed superset of Java that compiles ...
最新文章
- 【文末送5本书】与「韦神」齐名,35岁刁晗生任教清华!18岁一战成名,数学界颜值巅峰...
- 访谈|在网络世界捕获威胁的猎人
- 第二次数据库作业--gui
- linux下安装 QQ(wine qq 2013-2014)
- jpa映射json_如何使用JPA和Hibernate映射JSON集合
- python模块学习之glob模块
- php获取扫码枪的数据,js 获取扫码枪输入数据的方法
- java求数组和值_用java编写数组求和,array[]和ArrayList()?
- 通向码农的道路(enet开源翻译计划 二)
- Python+sklearn使用线性回归算法预测儿童身高
- C语言分治算法求中位数,【算法复习】分治算法
- SPSS正态性检验(图文+数据集)【SPSS 015期】
- hdoj1249三角形划分平面(递推+规律总结 )
- Stata | 导入导出文件
- PyQt环境的搭建:安装python+pyqt+eric
- Oracle Dataguard基于rac主库搭建rac备库
- 老飞飞魅力飞飞关于攻击辅助研究带易语言源码视频教程
- 针对Informer中时序数据ETT油温数据分析
- Android-悬浮窗功能的实现(附Java、KT实现源码,自学Android
- 蓝桥杯 算法训练 Beaver's Calculator
热门文章
- ON/安森美FCH041N65F车规级MOS管,原厂渠道ASEMI代理
- 计算机图形学中的曲线问题
- The 2020 ICPC Asia Shenyang Regional Programming Contest I题 Rise of Shadows(数论)
- 已达到计算机的连接数最大值,无法再同次计算机连接
- FPGA(四):高级设计
- 做题心得篇12.26
- tp5中渲染页面将时间戳转换为日期时间格式(Y-m-d H:i:s)
- Powerpivot PowerBI相关组件下载安装(附操作截图)
- 【macOS Catalina 10.15.X(19xx)原版镜像合集】
- i18n(国际化)地域标识码