image.png
当有一个请求过来后,会通过Component或Route来展示界面。同时也会接收用户的点击事件,每一个点击事件都会由dispath来触发一个Action,这之后会产生两种结果。

一种是直接通过reducers函数改变状态state,使与前台关联的model发生变化,由此来改变前台页面。另一种是调用后台的服务,通过fetch进行后端服务的访问,后台服务返回的数据会由effects函数处理,处理后会交给reducers函数去改变状态state,进而触发前端的组件刷新和渲染。

最后还有一个subscriptions函数是进行前端拦截的,当拦截到一个URL请求之后仍然是触发一个Action,然后又会导致上面的两种变更

router

  • 约定式路由, 会自动识别 pages 下的文件是否为路由文件
  • dva 插件会自动识别 models 下的文件是否为 dva model

models

  1. call() 请求
  2. put 发送到 reducers里面的 type

models 接管 state的数据操作

  1. export default {
  2. namespace: 'card',
  3. state: {
  4. list: []
  5. },
  6. // 同步的方法
  7. reducers: {
  8. getList(state, action) {
  9. return {
  10. ...state,
  11. list: action.payload
  12. }
  13. }
  14. },
  15. // 异步的方法
  16. *effects: {
  17. *asyncList(action, effect) {
  18. const {payload} = action
  19. const { put, call } = effect
  20. const res = yield call(API.list, payload)
  21. const action = {
  22. type: 'getList',
  23. payload: res.data
  24. }
  25. yield put(action)
  26. },
  27. *getListAsync({payload}, {call, put}) {
  28. const res = yield call('/api/list', payload)
  29. yield put({
  30. type: 'getList',
  31. payload: res.data
  32. })
  33. }
  34. }
  35. }

事件触发 dispatch(action)

  1. onChange = () => {
  2. const action = {
  3. type: 'card/asyncList',
  4. payload: 100
  5. }
  6. this.props.dispatch(action)
  7. }