介绍

dva 首先是一个基于 redux 和 redux-saga 的数据流方案,然后为了简化开发体验,dva 还额外内置了 react-router 和 fetch,所以也可以理解为一个轻量级的应用框架。

定义model

dva 通过 model 的概念把一个领域的模型管理起来,包含同步更新 state 的 reducers,处理异步逻辑的 effects,订阅数据源的 subscriptions 。

Reducers

在 model 文件夹下新建products.js文件

export default {namespace:"products",state:[],reducers:{'delete'(state,{payload:id}){let _state=JSON.parse(JSON.Stringfy(state))return _state.filter(item=>item.id!==id)},'add'(state){console.log("state",state);return [...state,{name:"umi",id:3}]}},
}
  • namespace model 的命名空间,同时也是他在全局 state 上的属性,只能用字符串,不支持通过 . 的方式创建多层命名空间。
  • state 是初始值,优先级低于传给 dva() 的 opts.initialState(index.js文件中定义)。
  • reducers 用于处理同步操作,唯一可以修改 state 的地方。由 action 触发。格式为 (state, action) => newState 或 [(state, action) => newState, enhancer]。

使用

直接通过dispatch进行提交,参数包括type,payload(payload指传递的数据,可省略)

const handleDelete=(id)=>{dispatch({type: 'products/delete',payload: id,});
}const addData=()=>{dispatch({type: 'products/add',});}

effects

以 key/value 格式定义 effect。用于处理异步操作和业务逻辑,不直接修改 state。由 action 触发,可以触发 action,可以和服务器交互,可以获取全局 state 的数据等等。
格式为 (action, effects) => void 或 [(action, effects) => void, { type }]。

新建一个一个model/user.js

import  {getList} from "../api/index"
export default {namespace:"user",state:[],reducers:{},effects:{*getList(payload,{call,put}){//payload可写成{payload},还可以调用回调,{payload,callback}这种方式使用是非常不优美的,可以改成dataCallBack这种方式const { resolve } = payload;const data= yield  call(getList, '/user');//异步请求接口 (getList指请求数据的接口)yield put({ type: 'products/add'});  //调用reducer!!resolve && resolve(data);yield put({ type: 'products/add'});  //调用reducer     }}
}

api/index.js文件

export const getList= ()=>{return new Promise((resolve,reject)=>{  fetch("./data.json",{method:"get"}).then(res =>{return  res.json()}).then((result) => {console.log("result",result.list)resolve(result.list) },(error) => {reject(error)console.log(error)})})
}

const dataCallBack=()=>{return new Promise((resolve)=>{dispatch({type: 'user/getList',payload:{resolve}})}).then((res)=>{console.log("Data",res)})
}

页面调用

const getData=()=>{dispatch({type: 'user/getList',payload:"ceshi"});
}

select

用于从 state 里获取数据。
state:{user:"ssss"},
const users = yield select(state => state.user);

错误处理

全局错误处理
 dva 里,effects 和 subscriptions 的抛错全部会走 onError hook,所以可以在 onError 里统一处理错误。
const app = dva({onError(e, dispatch) {console.log(e.message);},
});
本地错误处理
如果需要对某些 effects 的错误进行特殊处理,需要在 effect 内部加 try catch 。
app.model({effects: {*addRemote() {try {// Your Code Here} catch(e) {console.log(e.message);}},},
});

Subscription

subscriptions 是订阅,用于订阅一个数据源,然后根据需要 dispatch 相应的 action。数据源可以是当前的时间、服务器的 websocket 连接、keyboard 输入、geolocation 变化、history 路由变化等等。格式为 ({ dispatch, history }) => unsubscribe 。
app.model({subscriptions: {setup({ dispatch, history }) {history.listen(({ pathname }) => {if (pathname === '/users') {dispatch({type: 'users/fetch',});}});},},
});

dva Reducers与Effects的使用介绍相关推荐

  1. Dva中在effects中获取state的值

    Dva中在effects中获取state的值 首先,看官网给出effects中的例子 effects详情见 it('put multi effects in order', done => {c ...

  2. dva学习-入门安装和目录介绍

    一.dva安装和介绍 下面的npm其实可以用淘宝镜像cnpm安装更快,安装命令npm install -g cnpm --registry=https://registry.npm.taobao.or ...

  3. 在dva中的effects实现callback

    在前端实现修改用户密码的功能,通过dispatch来实现与后端api接口的交互. 界面点击"提交"执行的代码如下: handleSubmit = () => {const { ...

  4. 聊聊 effects 与 reducers--React AntDesign Dva

    原文:https://www.yuque.com/yuxuanbeishui/zog1rm/tgmgws 今天我们就来聊聊 dva 中的 effects 与 reducers以及其中涉及的关键字的使用 ...

  5. dva源码解析(一)

    转载 :原文 https://blog.csdn.net/zp1996323/article/details/73315096 写在前面 dva是蚂蚁金服推出的一个单页应用框架,对redux,reac ...

  6. dva的简单使用(一)

    一.前言 在实际的前端开发中,像 cardList 中包含的那些数据,一般都是通过发起异步 http 请求从后端服务中获得. 我们希望把数据逻辑(cardList 相关逻辑)和视图逻辑(PuzzleC ...

  7. 总结对Dva数据流向的简单理解

    在刚刚接触Dva时,我最想知道的第一个问题就是: 1. Dva是什么? Dva官网文档的介绍是: dva 是体验技术部开发的 React 应用框架,将上面三个 React 工具库包装在一起,简化了 A ...

  8. dva的用法_dva.js 用法详解:列表展示

    这次主要通过在线获取用户数据并且渲染成列表这个案例来演示dva.js. 整个开发流程概括下来应该是: 编写用户列表model(数据模型)->  编写修改model的方法 -> 编写服务接口 ...

  9. dva 中的响应编程

    思维盲区 我最开始学习使用 dva 是从<12 步 30 分钟,完成用户管理的 CURD 应用>开始的,这同时也是 dva 的官方教程.然而因为领悟能力太差,最开始完全没理解.前 4 步还 ...

最新文章

  1. AI当道,媒体会被机器牵着鼻子走?
  2. OGNL表达式语言中的#和$的区别
  3. 数据库水平切分的实现原理解析——分库,分表,主从,集群,负载均衡器
  4. C++全局变量的声明和定义
  5. Selenium之Action Chains类
  6. Hibernate之持久化对象
  7. 苹果wifi网速慢怎么办_技巧|iPhone 连接 Wi-Fi 网速慢解决方法
  8. python 下载 M3U8 视频
  9. 第七十三集 KVM虚拟化☜(゚ヮ゚☜)
  10. 使用navicat导入SQL语句的教程
  11. java Mail使用SSl,端口465加密发送邮件配置
  12. java北京招聘_JAVA应届毕业生去北京找工作,薪资大约多少?
  13. 【山大会议】私人聊天频道 WebRTC 工具类
  14. 互联网寒冬,我们应该抓住什么救命稻草?
  15. win10+ubuntu的坑
  16. 数学建模从入门到放弃
  17. v浅谈vue之vant框架
  18. c语言指针课堂教学设计,C语言程序设计 指针 C教学设计8单元V1.0.doc
  19. Android手机屏幕RTMP推流工具
  20. 12.3 拥塞控制流程

热门文章

  1. python爬取网易云某一歌手的音乐评论
  2. 苹果6plus性能测试软件,iPhone 6、iPhone6 Plus性能测试
  3. 建表报错 primary key and distributed by definition incompatible
  4. AT5014 Random Tournament
  5. 微博平台架构和安全——微博平台首席架构师杨卫华演讲
  6. CMD(命令行)解密Bitlocker
  7. CK-FR08-E01与恩基士PLC配置指南
  8. 扫雷游戏软件测试,软件测试
  9. c语言上交源代码怎么交啊,C语言问题在线等啊作业提交上交的的内容必须由以下两个部分组成,缺 爱问知识人...
  10. 人大金仓数据库的用户与角色