dva.js 深入浅出

2022-07-03  本文已影响0人  咕叽咕叽先生

使用场景

dva 首先是一个基于 redux 和 redux-saga 的数据流方案.

dva 也是 React 应用框架,同样包装了React-Router,简化了 API,让开发 React 应用更加方便和快捷。

所以:
dva = React-Router + Redux + Redux-saga

快速上手

1、dva提供了一套自己的脚手架 用于构建一个基于dva的基础框架

    $ npm install dva-cli -g
    $ dva -v
    dva-cli version > 0.9.1
    $ dva new dva-quickstart

2、也可以只使用 dva 单纯的当做一个状态管理工具

    $ npm i dva
    // 普通项目中使用dva
    import dva from 'dva';
    const app = dva();
    app.router(() =>
        <App />
    );
    app.start('#root');

dva(opts)可配置opts有哪些?[1]

核心概念

img2.jpg
State 和 View
Action
connect
dispatch
Effect
Subscription
    subscriptions: {
        watch({ dispatch, history }, error) {
            return history.listen(({ pathname, query }) => {
                console.log(pathname)
                console.log(query)
            });
        },
        click({ dispatch, history }, error) {
            document.addEventListener('click', () => {  
                 //只要⿏标点击就会dispatch,这⾥的add就是reducers中的⽅法名
                dispatch({ type: "add" })
            })
        }
    }

Model

dva 提供 app.model 这个对象,所有的应用逻辑都定义在它上面
model 是 dva 中最重要的概念。以下是典型的例子:

   {
       namespace: 'count',
       // 初始化值 优先级低于dva() 的 opts.initialState
       state: {
           todos:3000
       },
       reducers: {
           // Action 处理器;处理同步操作的函数,根据 Action,从上一个 State 算出当前 State。
           add(state) { return state + 1 },
           // 往 [] 里添加一个新 todo
           addTodo(state, action) { return {...state, payload:action.payload}; }
       },
       effects:  {
       *addAfter1Second(action, { call, put, select }) {
               // const result = yield call(timeoutfun, action.payload);
               const result = yield (timeoutfun(action.payload));
               console.log('我是call 的 result', result);
               const todos = yield select(state => state.count.todos);//此处count为自定义的namespace值
               console.log('我是select 的 todos', todos);
               const newState = yield put({
                   type: 'addTodo',
                   payload: todos
               });
               console.log('我是put 的 newState', newState);
           },
       },
       subscriptions: {
           watch({ dispatch, history }, error) {
               return history.listen(({ pathname, query }) => {
                   console.log(pathname)
                   console.log(query)
               });
           },
           click({ dispatch, history }, error) {
               document.addEventListener('click', () => { 
                    dispatch({ type: "add" })
               })
           }
       }
   }

  1. ES6 新引入了 Generator 函数,函数内用 yield 标记同步逻辑,函数实例使用 .next()依次调用。从而解决异步问题。

  2. https://dvajs.com/api/#app-dva-opts

上一篇 下一篇

猜你喜欢

热点阅读