models细节

  1. 如果 reducers和 effects里面有同名的方法,2个都会执行
    1. 先执行 reducres里面的同步方法,
    2. 后执行 effects里面的异步方法
  2. 什么时候需要添加 namespace前缀?
    1. models里面不需要添加 namespace命名空间前缀
    2. 组件里面需要添加命名空间前缀,namespace/action
  3. 整个应用里面,只有 reducers 才能改变 state状态
    1. reducer是一个纯函数,没有副作用
    2. 相同的输入,一定会有相同的输出
    3. 函数执行的过程中对外部产生了可观察的变化,我们就说函数产生了副作用。
    4. 例如修改外部的变量、调用DOM API修改页面,发送Ajax请求、调用window.reload刷新浏览器
    5. 甚至是console.log打印数据,都是副作用

models模板文件

  1. import { getUserById } from './server';
  2. export default {
  3. namespace: 'example', //命名空间
  4. state: { // 状态对象
  5. user: {isLogin: false}
  6. },
  7. reducers: { // 处理器,修改状态的,只有 reducer才能修改 state状态
  8. init(state, action) {
  9. return { ...state, ...action.payload };
  10. },
  11. // save 动作的名称 action.type,值是一个函数对来计算新状态
  12. save(state, {payload}) {
  13. return { ...state, ...payload };
  14. },
  15. },
  16. // effects中每个属性都是一个generator
  17. effects: {
  18. *init(action, effects) {},
  19. *fetchRemote({ payload }, { call, put }) {
  20. const res = yield call(getUserById, payload)
  21. yield put({
  22. type: 'init',
  23. payload: {dataSource: res}
  24. })
  25. },
  26. },
  27. // 订阅 可以在subscriptions里定义很多个属性和值,
  28. // 值是一个函数,这些函数会在应用初始化的时候执行一次
  29. subscriptions: {
  30. setup({ dispatch, history }) {
  31. // dispatch({type: 'init'})
  32. // 给history对象增加一个监听函数,当路由发生改变的时候,执行回调
  33. history.listen(route => {
  34. document.title = route.name
  35. })
  36. },
  37. },
  38. };

subscription 语义是订阅,用于订阅一个数据源,然后根据条件 dispatch 需要的 action

  • 数据源可以是当前的时间、服务器的 websocket 连接、keyboard 输入、
  • geolocation 变化、history 路由变化等

model说明

  • namespace 命名空间
  • state,数据源
  • reducers,同步任务,修改 state,只有 reducers才能修改 state
  • effect,副作用,用来处理异步

    1. export default {
    2. namespace: 'example',
    3. state: {
    4. user: {isLogin: false}
    5. },
    6. reducers: {
    7. save(state, {payload}) {
    8. console.log('save')
    9. return { ...state, ...payload };
    10. },
    11. },
    12. effects: {
    13. *save({ payload }, { call, put }) {
    14. console.log('*save')
    15. },
    16. },
    17. };