一、dva 框架介绍
dva 是阿里前端架构师 sorrycc 带 team 研发的一套轻量级前端框架,其目的是尽量避免前端重复性劳动,简化开发流程。
实际上也确实如此,一个简单的 CRUD 模块只需要1-2个小时即可完成前端作业。
前面说到 dva 是一个框架,那么 dva 脚手架就是这个框架的具体表现。
我们习惯于称:创建一个 dva 脚手架,实际上就是创建一个项目目录。
3、安装 dva-cli 用于初始化项目:
npm install -g dva-cli
# 或
yarn global add dva-cli
mkdir your-project 创建项目目录
cd your-project 并进入该目录
dva init 初始化项目
4、目录结构
二、项目结构分析
基础概念
1、Model
Model 是 dva 最重要的部分,可以理解为 redux、react-redux、redux-saga 的封装。
通常项目中一个模块对应一个 model,一个基本的 model 如下:
namespace
是该 model 的命名空间,同时也是全局 state
上的一个属性,只能是字符串,不支持使用 .
创建多层命名空间。
state
是状态的初始值。
reducer
类似于 redux 中的 reducer,它是一个纯函数,用于处理同步操作,是唯一可以修改 state
的地方,由 action
触发,它有 state
和 action
两个参数。
effects
用于处理异步操作,不能直接修改 state
,由 action
触发,也可触发 action
。它只能是 generator
函数,并且有 action
和 effects
两个参数。第二个参数 effects
包含 put
、call
和 select
三个 字 段,put
用于触发 action
,call
用于调用异步处理逻辑,select
用于从 state
中获取数据。
subscriptions
用于订阅某些数据源,并根据情况 dispatch 某些 action,格式为 ({ dispatch, history }, done) => unlistenFunction
。
如上的一个 model,监听路由变化,当进入 /user
页面时,执行 effects
中的 fetch
,以从服务端获取用户列表,然后 fetch
中触发 reducers
中的 save
将从服务端获取到的数据保存到 state
中。
注意,在 model 中触发这个 model 中的 action
时不需要写命名空间,比如在 fetch
中触发 save
时是 { type: ‘save‘ }
。而在组件中触发 action
时就需要带上命名空间了,比如在某个组件中触发 fetch
时应该是 { type: ‘user/fetch‘ }
。
connect
方法,其实它就是 react-redux
的 connect
。用法如下:
connect 后的组件除了可以获取到 dispatch
和 state
,还可以获取到 location
和 history
。
原文:https://www.cnblogs.com/meng95/p/9483048.html