react dva发送请求详解(转)

1,在jsx页面派发任务,可以在componentWillMount的生命周期内,
使用this.props.dispatch方法派发,需要先引用connect模块,不引用会报错

import { connect } from 'dva';

在类中操作:

class 类名 extends React.Component {
  constructor(props){
    super(props)
  }
  componentWillMount() {
    this.props.dispatch({
      type: '自定义的namespace/effects中的方法名',
      payload: {//可以不填
        参数名:参数值
      },
    })
  }
  render() {
  //查看网络请求传递出来的内容
  console.log(this.props.data)
  //this.props.data为mapStateToProps中的data
    return (
      <div></div>
    )
  }
}

const mapStateToProps = (state) => {  //见名知意,把state转换为props
  //可以打印state看看数据结构,然后放到data里
  return {
    data:state.data
  };
};
export default connect(mapStateToProps)(类名)

2,services文件夹下创建单独的发送网络请求js,比如service.js

import request from '../utils/request';

export function models中要调用的方法名 (参数) {
  return request(`接口地址?${参数}`) //get方法请求
    /*
   return request(`接口地址`,{
    method: 'post',
    headers: {
      'Content-Type': 'application/json; charset=utf-8'
    },
    body: JSON.stringify({
      参数名:参数
    })
  })
  */
  
}

3,models文件夹下创建操作数据的js,比如data.js

import * as 自定义名 from '../services/service';

export default {
  namespace: '第一步中的namespace',

  state: {
    data: ''   //reducers中接收数据
  },

  subscriptions: {
    setup({ dispatch, history }) {  // eslint-disable-line
    },
  },

  effects: {

    *供组件调用的方法名({ payload: { 参数 }}, { call, put }) {

      const result = yield call(自定义名.service中的方法名, 参数);//如果使用  {参数}  ,则是一个对象

      //把请求的数据保存起来
      //数据更新会带动页面重新渲染
      yield put({
        type: 'save',  //reducers中的方法名
        payload:{
          data: result.data  //网络返回的要保留的数据
        }
      })
    }
  },

  reducers: {
     save(state, { payload: { data } }) {
       return {
         ...state, 
          data: data  //第一个data是state的,第二个data是payload的
      };
     },
  },
}
effects函数中参数详解
1)yield:固定关键词,Generator函数自带的关键字,与*搭配使用,有yield说明这里是异步,需要等后边的代码执行完成
2)payload:view端通过dispatch传过来的payload同名参数
3)select:拿到model中state的数据,
如:拿到state中commodityData中的list
const list = yield select(state=>state.commodityData.list)
4)call:第一个参数是异步函数,payload是参数,可以通过call来执行一个完整的异步请求,又因为yield的存在,就实现了异步转同步的方案
const res= yield call(pageQuery,payload)
5)put:就是通过reducers更改state中的数据,并更新到页面上

 

使用data.js可以在主js中:

import dva from 'dva';
const app = dva();
app.model(require('./models/data'));

第二步中引用的request.js⬇️,不需要改动

import fetch from 'dva/fetch';

function parseJSON(response) {
  return response.json();
}

function checkStatus(response) {
  if (response.status >= 200 && response.status < 300) {
    return response;
  }

  const error = new Error(response.statusText);
  error.response = response;
  throw error;
}

/**
 * Requests a URL, returning a promise.
 *
 * @param  {string} url       The URL we want to request
 * @param  {object} [options] The options we want to pass to "fetch"
 * @return {object}           An object containing either "data" or "err"
 */
export default function request(url, options) {
  return fetch(url, options)
    .then(checkStatus)
    .then(parseJSON)
    .then(data => ({ data }))
    .catch(err => ({ err }));
}

参考:https://www.jianshu.com/p/6482f4785929

https://www.jianshu.com/p/5aa95d62339c

https://blog.csdn.net/hzxOnlineOk/article/details/102930679

posted @ 2020-11-17 22:42  dongxiaolei  阅读(2479)  评论(0编辑  收藏  举报