Umi + Dva + Antd的React项目实践
记录一下最近项目所用到的技术React + Dva + Antd + umi ,以免忘记。之前没有用过它们其中一个,也是慢慢摸索,了解数据整个流程。
先了解下概念
React 不多说,3大框架之一;
Dva 是由阿里架构师 sorrycc 带领 team 完成的一套前端框架,在作者的 github 里是这么描述它的:“dva 是 react 和 redux 的最佳实践”。现在已经有了自己的官网 https://dvajs.com;
Antd 是阿里的一套开箱即用的中台前端/设计解决方案,UI框架,官网 http://ant-design.gitee.io/index-cn;
umi 是 dva 作者 sorrycc 最近整的新玩意,2018.2.26 发布的 1.0 版本。sorrycc 认为之前 dva 固然好,但还要用户自己引入 UI 工具 antd,打包工具 roadhog,路由 react-router,状态管理器 dva,这些很麻烦,所以弄了这个,官网 https://umijs.org;
在dva中主要分3层,models,services,components,其中models是最重要概念,这里放的是各种数据,与数据交互的应该都是在这里。services是请求后台接口的方法。components是组件了。
services层:

export function doit (body) {
return request({
method: "post",
url: `${wechatApi}/doit`,
data: JSON.stringify(body),
})
}
这里就是请求后台接口的方法,其中这里的request是封装了axios的函数,所以它是返回的是一个promise对象,url就是要请求的地址,body就是请求参数了。
那个request如下
import axios from "axios"
export default async function request (options) {
let response
try {
response = await axios(options)
return response
} catch (err) {
return response
}
}

models层:

export default {
namespace: "test", //命名空间名字,必填
state: { num: 0 },//state就是用来放初始值的
// 能改变界面的action应该放这里,这里按官方意思不应该做数据处理,只是用来return state 从而改变界面
reducers:{
addNum ( // addNum可以理解为一个方法名
// 这里state就是上面初始的state,这里理解是旧state
state, { payload: { num }}// num 是传过来的,名字随便起,不是state中的num,这接收一个action ) { //return新的state,这样页面就会更新 es6语法,就是把state全部展开,然后把num:num重新赋值,这样后面赋值的num就会覆盖前面的。也是es6语法,相同名字可以写成一个,所以上面接收处写了num
return { ...state, num}
},
},
// 与后台交互,处理数据逻辑的地方
effects:{
},
* fetchUser(_,{call,put}) {
// XXXXXXX代码
}
},
subscriptions:{
// 订阅监听,比如我们监听路由,进入页面就如何,可以在这写
}
)

components层:

clickHandler = () => {
dispatch({
type: "test/fetchNum",// 这里就会触发models层里面effects中fetchNum方法(也可以直接触发reducer中方法,看具体情况) ,test就是models里的命名空间名字
payload: {
numCount: ++1,
},
})
}

所以整体流程是:
点击页面按钮,会触发clickHandler,——>触发models层effect的fetchNum——>触发services层doit,获取到后台返回数据——>触发models层的addNum,把返回数据传给addNum,再去更新models里的state,components应用了models层中的state的num的话,就会触发页面render方法重新渲染,界面就会更新。
render方法什么时候会触发
当state或props变化时就会触发render,我们一般在render里只获取props和state,尽量不做逻辑处理(数据逻辑处理基本在render上面的函数或者models中处理)。当父组件给子组件传递props时,子组件那个props最好不要在render里面做逻辑计算赋值,不然传递过去,子
组件有可能拿不到最新的值。比如传了个数组arr,arr在render里做了数据处理,赋值,render会运行多次(这里举例3次)所以结果可能是[1,2,3] [1,2,3] [1,2],子组件拿到的值是[1,2,3]而不是最终的[1,2],所以当你出现
子组件无法获取父组件传递过来最后正确的值,看看是不是值在render做了运算赋值,解决方法就是把数据逻辑放在models层处理,然后再返回,这样就没问题了。
页面要应用models层的数据要用connect

import { Component } from "react"
import { connect } from "dva"
class TheDemo extends Component {
clickHandler = () =>{xxxx}
render () {
const {num} = this.props //获取下面的num
return (
<div>
<button onClick={this.clickHandler}><button>
<p>{num}</p>
</div>
)
}
}
//字面意思就是,把models的state变成组件的props
function mapStateToProps (state) {
const { num} = state.test // test就是models命名空间名字
return {
num, // 在这return,上面才能获取到
}
}
export default connect(mapStateToProps)(TheDemo)

Umi + Dva + Antd的React项目实践的更多相关文章
- react项目实践——(1)使用webpack创建项目
1. 新建文件夹,命名为项目名称——myapp,并打开myapp文件夹. mkdir webpack-demo && cd webpack-demo 2. 在./myapp中打开命令行 ...
- umi+dva+antd新建项目(亲测可用)
首先全局安装dva+umiumi:npm install -g umidva:npm install -g dva-cli 通过脚手架创建项目 一: mkdir myapp && cd ...
- umi+dva+antd新建项目
首先全局安装dva+umiumi:npm install -g umidva:npm install -g dva-cli 通过脚手架创建项目 一: mkdir myapp && cd ...
- react+umi+dva+antd中dva的数据流图解
- react项目实践——(4)依赖安装与配置
1. 修改package.json,添加需要安装的包 { "name": "myapp", "version": "1.0.0&q ...
- react项目实践——(3)babel
1. babel Babel是一个广泛使用的转码器,可以将ES6代码转为ES5代码,从而在现有环境执行. (1)安装 npm install --save-dev babel-core babel-e ...
- react项目实践——(2)webpack-dev-serve
webpack-dev-server是一个小型的静态文件服务器,为webpack打包的资源文件提供Web服务.并且提供自动刷新和Hot Module Replacement(模块热替换:前端代码变动后 ...
- 【每天学一点-04】使用脚手架搭建 React+TypeScript+umi.js+Antd 项目
一.使用脚手架搭建项目框架 1.首先使用脚手架搭建React项目(React+TypeScript+Umi.js) 在控制台输入命令:yarn create @umijs/umi-app 2.引入An ...
- React 项目引入 Dva
背景 现在手上在做的 React 项目因为年代久远,用的 Redux,写代码的体验不太好,所以想升级一下引入 dva.以往使用 dva 都是使用 dva-cli 直接生成 dva 项目,或者在使用 a ...
随机推荐
- 关于OV7670摄像头的分辨率设置
关于OV7670摄像头的分辨率设置最近一直在纠结如何把OV7670输出的图片分辨率缩小,以减少数据量来适应数据的传输,在网上看了好多也没有关于寄存器的具体设置,最终又读了几遍数据手册,加上网友们写的帖 ...
- UWP 应用启动速度优化——关闭加载动画
准备 在开始之前,我们应该先处理好预启动来加速启动应用.请参见文末链接. 步骤 关闭加载动画主要在包清单文件中进行. 首先,以代码方式打开 Package.appxmanifest,在顶部的 Pack ...
- docker初体验:Docker部署SpringCloud项目eureka-server
Docker部署SpringCloud项目eureka-server 1 创建eureka-server工程 创建父工程cloud-demo,其pom.xml如下: <?xml version= ...
- JVM垃圾收集器CMS和G1
CMS(Concurrent Mark Sweep)收集器是一种以获取 最短回收停顿时间 为目标的收集器.采用的是"标记-清除算法",整个过程分为4步 由于整个过程中,并发标记和并 ...
- 剑指Offer-41.和为S的连续正数序列(C++/Java)
题目: 小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100.但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数).没多久,他就 ...
- Java做成Zip文件,Java实现压缩文件
import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import ...
- 每天用Mybatis,但是Mybatis的工作原理你真的知道吗?
近来想写一个mybatis的分页插件,但是在写插件之前肯定要了解一下mybatis具体的工作原理吧,于是边参考别人的博客,边看源码就开干了. 核心部件: SqlSession Executor Sta ...
- 3年java开发竟然还不知道Lambda的这个坑
背景 有朋友反馈zk连接很慢.整理出zk连接的关键逻辑如下: 上面的代码造成第一次调用ClientZkAgent.getInstance的时候,需耗时10s, 这个时间恰好跟semaphore的超时时 ...
- webpack学习_使用source map
追踪错误和警告,JS提供sourcemap功能,将编译后的代码映射回原始代码(简单来说就是即使打包后,也可以检测知道该错误来自哪个JS文件).如果一个错误来自与b.js,那么source map回明确 ...
- android开发检测用户是否使用了虚拟定位
在应用开发中,如果有签到打卡之类的功能,你是否会遇到检测用户是否使用了虚拟定位软件来进行打卡?如果有,那么请仔细阅读这篇文章.该文章会带你认识什么是虚拟定位.什么是应用分身,以及如何通过代码来检测用户 ...