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中每个属性都是一个generator
effects: {
*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')
},
},
};