版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
数据流向
- 数据的改变通常是通过用户交互行为或者浏览器行为(如路由跳转等)触发的
- 此类行为会改变数据的时候可以通过dispatch发起一个action
- 如果是同步行为直接通过Reducers改变state
- 如果是异步行为(副作用)会先触发Effects然后流向Reducer最终改变State
核心概念
- State:一个对象,保存整个应用状态
- View: React组件构成的视图层
- Action:一个对象,描述事件
- connect方法:一个函数,绑定State到View
- dispatch方法: 一个函数,发送Action到State
State
- State是一个JavaScript对象
- State表示Model的状态数据
- 操作时每次都要当作不可变(immutable data)数据对待
- 保证每次都是全新对象,没有引用关系,这样才能保证State的独立性,便于测试和追踪变化
Action
- Action是一个JavaScript对象
- 它是改变State的唯一途径
- action必须带有type属性指明具体的行为,其他字段可以自定义
- 如果要发起一个action需要使用dispatch函数
- 需要注意的是,dispatch是在组件connect Models以后,通过props传入的
dispatch ({
type: 'add',
})
dispatch函数
- dispatch function是一个用于触发action的函数
- action是改变state的唯一途径,但是他只描述了一个行为,而dispatch可以看作是触发这个行为的方式
Reducer
- Reducer(也称为reducing function)函数接受两个参数
- Reducer描述如何改变数据
- Reducer的概念来自函数式编程,在dva中,reducers聚合积累的结果是当前model的state对象
- 通过action中传入的值,与当前reducers中的值进行运算获得新的值(也就是新的state)
- Reducer必须是纯函数
Effect
- Effect被称为副作用
- dva为了控制副作用的操作,底层引入了redux-sagas做异步流程控制,由于采用generator的相关概念,所以将异步转成同步写法,从而将effects转为纯函数
- 关于纯函数:Mostly adequate guide to FP
Subscription
- Subscription是一种从源获取数据的方法
- 它来自与elm
- Subscription语义是订阅,用于订阅一个数据源,根据条件dispatch需要的action
- 数据源可以是当前的时间、服务器的websocket连接、keyboard输入、geolocation变化、history路由变化等等
Router
- 这里的路由通常指的是前端路由
- 通过浏览器提供的History API可以监听浏览器url的变化,从而控制相关操作
- dva实例提供了router方法来控制路由,使用的是react-router
RouteComponent
- 查看:组件设计方法
app.model
- dva提供app.model这个对象,所有的应用逻辑都定义在它上面
Model对象的属性
- namespace:当前model的名称。整个应用的state,由多少个小的Model的State以namespace为key合成
- state: 该model当前的状态。数据保存在这里,直接决定了视图层的输出
- reducers: Action处理器,处理同步动作,用来算出最新的State
- effects: Action处理器,处理异步动作
Generator函数
- Effect是一个Generator函数,内部使用yield关键字,标示每一步的操作(不管是异步或同步)
call和pu他 - call: 执行异步函数
- put: 发出一个action,类似于dispatch