• dva的基本用法


    dva是一个状态管理工具,整合了redux,redux-saga,react-router,fetch等框架,目前只能用于react的状态管理

    1. dva的models

    dva的主要作用还是整合了redux,redux-saga的多文件的分散的写法,将state,reducers,effects这些常用的状态
    处理方法集中在一个model中,其形式如下:

    import * as userService from '../services/userService'
    
    export default {
      namespace: "users",
      state: {
        list:[]
      },
      reducers: {        
        save(state, {payload:{data}}) {   
          state.list = data;
          return {...state}
        },
        removeItem(state, {item}) {
          state.list = state.list.filter(function (lItem) {
            return item.id !== lItem.id
          });
          return{...state}
        }
      },
      //effects指的是涉及到异步请求的方法。通常用来调用服务获取数据。
      //这里要注意如果effects的方法名与reducers中存在重复的话容易造成死循环。
      effects: {          
        * fetch(payload,{put, call}) {
          const data = yield call(userService.fatchData);
          yield put({type: "save", payload: data})
        },
        * fetchRemoveItem({item},{put,call}){
          const result = yield call(userService.fetchRemoveItem,item.id);
          if (result){
            console.log(true);
            yield put({type:"removeItem",item})
          }else{
            console.log(false);
          }
        }
      },
      subscriptions: {              
        setup({dispatch}) {
          dispatch({type: 'fetch'})
        }
      }
    }

    要在全局的app中注册model

    app.model(require('./models/users').default);

    2. dva的models的几点说明

    namespace:       全局状态的属性,通过global.namespace来访问对应model的state
    reducers:           同步修改状态的方法
    effects:             异步修改状态的方法,effects中使用的还是generator,与redux-saga中的调用完全一致,
            不能直接调用reducers中的同步方法,通过put({'reducer方法名',payload})的形式来
            调用reducer中的方法

    subscriptions:    subscription 是订阅,用于订阅一个数据源,然后根据需要 dispatch 相应的 action。
              在 app.start() 时被执行,数据源可以是当前的时间、服务器的websocket 连接、
              keyboard 输入、geolocation 变化、history 路由变化等等

    这个结构与vuex的结构十分类似

    state -> reducers -> effects 对应 state -> mutations -> actions

    3. dva中的状态传递

    依然采用react-redux的方法,用connect,mapStateToProps来解决

    4. dva中的全局事件

    dva中提供了一下全局的事件,来解决注册和拦截问题

    const app = dva({
      history,
      initialState,
      onError,
      onAction,
      onStateChange,
      onReducer,
      onEffect,
      onHmr,
      extraReducers,
      extraEnhancers,
    });

    onError:          effect 执行错误或 subscription 通过 done 主动抛错时触发,可用于管理全局出错状态
    onAction:        在 action 被 dispatch 时触发,用于注册 redux 中间件
    onStateChange:     state 改变时触发,可用于同步 state 到 localStorage,服务器端等
    onReducer:             封装 reducer 执行,全局拦截reducer
    onEffect:                 封装 effect 执行,全局拦截effect
    onHmr:                   全局处理热替换
    extraReducers:        指定额外的 reducer
    extraEnhancers:      指定额外的 StoreEnhancer

    参考:http://www.cnblogs.com/axel10/archive/2018/03/12/8548305.html

  • 相关阅读:
    操作符详解(思维导图)
    数组(C语言、思维导图)
    函数(C语言、思维导图)
    分支语句与循环语句(知识点思维导图)
    单链表及其基本操作
    顺序表
    时间复杂度与空间复杂度
    javascript基础知识show
    Java中的四舍五入
    JavaScript中数组迭代方法(jquery)
  • 原文地址:https://www.cnblogs.com/mengff/p/9506986.html
Copyright © 2020-2023  润新知