React + Dva.js 使用

Dva简介:Dva是基于redux和redux-saga的数据流方法,并且内置了react-router和Fetch,

    说白了就是融合了 redux+redux-saga+react-router    

    dva = React-Router + Redux + Redux-saga

Dva详细介绍请看官方Api:https://dvajs.com/guide/

1).在Dva中主要分为3层,services,models,components

    services:请求后台的接口

import { get,post } from '@/utils/request';
import { pathJoin } from '@/utils/utils';
import { ErrorBookPrefix, prefix } from '@/services/config';


/*获取班级列表接口*/
export const getClassList = (params) => {
  return get(pathJoin(prefix,ErrorBookPrefix, '/classes/class/getClass/v1.0'),{
    ...params
  });
};

这里对fetch做了封装

request.js

/**
 * 封装 POST 请求
 * @param {String} url
 * @param {Object} data
 */
export const post = (url, data, isJsonString) => { 
  data = Object.assign({}, defaultParams, data);
    return request(url, {
      method: "POST",
      credentials: "include",
      headers: {
        "X-Requested-With": "XMLHttpRequest",
        Accept: "application/json, text/javascript, */*; q=0.01", 
        "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8",
        'X-XSRF-TOKEN':cookie.get('XSRF-TOKEN')
      }, 
      body: objToSearch(data)
    });
};

     models:是最重要概念,这里放的是各种数据,与数据交互的应该都是在这里

   以下是个常见例子

    

//*第1步.引入我们定义的services
import {
 courseLists
} from '@/services/wrongQuestions'


export default {

   //namespace:当前 Model 的名称。整个应用的 State,用于解决多个models之间 的互相干        
      扰的问题,我们存储所有数据都会在这个空间下。
  namespace: 'wrongQuestions', 

  //state:该Model 当前的状态。数据保存在这里,直接决定了视图层的输出
  state: {    
    loading: false,
  },

  //reducers:处理同步操作,修改 state,由 action 触发,有state 和 action 两个参数
  reducers: { 
    'fetch/start'(state) {
      return {
        ...state,
        loading: true
      };
    },
    'fetch/end'(state) {
      return {
        ...state,
        loading: false
      };
    },
    fetchAfter(state, action) {
      return Object.assign({}, state, action.payload)
    },
  },

  //effects:处理异步动作,直接修改 state,由 action 触发
  effects: { 
  
    //*第2步 定义一个courseList的effects,注意这个函数名称前面要有“*”
    * courseLists({ payload }, { call, put, select }) { //put 用于触发 action,call 用于调用异步处理逻辑

      //yield表示同步调用,这个是generator提供的功能
      yield put({ type: 'fetch/start' });
      const queryCourseList = yield call(getErrorBookcList, payload) //call调用数据接口方法和请求参数
      yield put({  //储存数据
        type: 'fetchAfter',
        payload: {
          getTopicType: queryCourseList.data
        }
      });
      yield put({ type: 'fetch/end' });
    }
  }
}

 

components组件:

我们已经单独完成了 model 和 component,那么他们如何串联起来呢?

dva 提供了 connect 方法。如果你熟悉 redux,这个 connect 就是 react-redux 的 connect

import React, { Component } from 'react'
import { connect } from 'dva';

class myClass extends Component {
  constructor(props) {
    super(props);
    this.state = {
     
    }

  componentDidMount= () => {
    const { dispatch } = this.props;
    dispatch({ type: 'myClass/getClassType' })
    this.state.schoolYear &&
    dispatch({
      type: 'myClass/courseLists',
      payload: {
        year: this.state.schoolYearId,
        classType: this.state.classListid,
        isMy: this.state.isMy
      }
    })
  }
  }
}

export default connect(({ wrongQuestions}) => ({
  myClass
}))(myClass);

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值