models细节
- 如果 reducers和 effects里面有同名的方法,2个都会执行
- 先执行 reducres里面的同步方法,
- 后执行 effects里面的异步方法
- 什么时候需要添加 namespace前缀?
- models里面不需要添加 namespace命名空间前缀
- 组件里面需要添加命名空间前缀,namespace/action
- 整个应用里面,只有 reducers 才能改变 state状态
- reducer是一个纯函数,没有副作用
- 相同的输入,一定会有相同的输出
- 函数执行的过程中对外部产生了可观察的变化,我们就说函数产生了副作用。
- 例如修改外部的变量、调用DOM API修改页面,发送Ajax请求、调用window.reload刷新浏览器
- 甚至是console.log打印数据,都是副作用
models模板文件
import { getUserById } from './server';export default {namespace: 'example', //命名空间state: { // 状态对象user: {isLogin: false}},reducers: { // 处理器,修改状态的,只有 reducer才能修改 state状态init(state, action) {return { ...state, ...action.payload };},// save 动作的名称 action.type,值是一个函数对来计算新状态save(state, {payload}) {return { ...state, ...payload };},},// effects中每个属性都是一个generatoreffects: {*init(action, effects) {},*fetchRemote({ payload }, { call, put }) {const res = yield call(getUserById, payload)yield put({type: 'init',payload: {dataSource: res}})},},// 订阅 可以在subscriptions里定义很多个属性和值,// 值是一个函数,这些函数会在应用初始化的时候执行一次subscriptions: {setup({ dispatch, history }) {// dispatch({type: 'init'})// 给history对象增加一个监听函数,当路由发生改变的时候,执行回调history.listen(route => {document.title = route.name})},},};
subscription 语义是订阅,用于订阅一个数据源,然后根据条件 dispatch 需要的 action
- 数据源可以是当前的时间、服务器的 websocket 连接、keyboard 输入、
- geolocation 变化、history 路由变化等
model说明
- namespace 命名空间
- state,数据源
- reducers,同步任务,修改 state,只有 reducers才能修改 state
- effect,副作用,用来处理异步
export default {namespace: 'example',state: {user: {isLogin: false}},reducers: {save(state, {payload}) {console.log('save')return { ...state, ...payload };},},effects: {*save({ payload }, { call, put }) {console.log('*save')},},};
