antd pro 服务器交互与dva

2019-02-28  本文已影响0人  今天的事明天做

@component/services/api下 api.js 里 export 方法getGuan


export async function getGuan() {

  return request('/api/guan');

}

mock文件夹下 api.js新增接口

'GET /api/guan': (req, res) => {
    setTimeout(() => {
      res.send({
        'guan': [{
            a: '@city',
            b: 150,

          },
          {
            a: '@city',
            b: 150,

          },
          {
            a: '@city',
            b: 150,

          },
          {
            a: '@city',
            b: 150,

          }
        ],
      });
    }, 3000);
  },

新增models文件 gaun.js 引入方法getGuan并输出命名空间为‘g'的models
页面组件Guan.js 关联models ‘g’

@connect(({ g, loading }) => ({
    g,
    click: loading.effects['g/gu']
}))
class Guan extends PureComponent {

@connect要写在class之前 不然报错 - -!
Guan组件里的方法调用models发送请求

click = () => {
        const {
            dispatch,
            g
        } = this.props
        dispatch({
            type: 'g/gu',
        })
    }

post 请求需要带的参数payload

click = (fields) => {
        const {
            dispatch,
            g
        } = this.props
        dispatch({
            type: 'g/gu',
           payload: {
              desc: fields.desc
            }
        })
    }

@component/services/api下 api.js 下做对应处理

export async function getGuan(params) {
  return request('/api/getGuan', {
    method: 'POST',
    body:{
      ...params
   },
  });
}

mock下 api.js里方法改为post
models中给出方法对应请求和dva操作

import {
    getGuan,
    addGuan
} from '@/services/api'
export default {
    namespace: 'g',
    effects: {
        *gu({ payload }, {
            call,
            put
        }) {
            const response = yield call(getGuan, payload);
            response.guan.map(
                (v, i) => {
                    const j = v
                    j.id = i + 1
                    return j
                })
            yield put({
                type: 'get',
                payload: response.guan,
            });
        },
    },

    reducers: {
        get(state, action) {
            return {
                ...state,
                guan: action.payload,
            };
        },
};

其中reducer的方法get不能与effects下的gu重名 不然会陷入递归无限请求数据

*gu({ payload }, {

这里的payload是 click方法dispach带的参数payload,

yield put({
     type: 'get',
         payload: response.guan,
     });

这里的payload是用来存储服务器返回的数据 并传递给reducers下的 get方法的action
一些请求完数据后做的回调可以放在dispach中传给models处理

click = (fields) => {
        const {
            dispatch,
            g
        } = this.props
        dispatch({
            type: 'g/gu',
           payload: {
              desc: fields.desc
            }
          callback: () => {
            this.setState({
              visble: false
            });
          },
        })
    }

models里

     *gu({ payload,callback }, {
            call,
            put
        }) {
            const response = yield call(getGuan, payload);
            response.guan.map(
                (v, i) => {
                    const j = v
                    j.id = i + 1
                    return j
                })
            yield put({
                type: 'get',
                payload: response.guan,
            });
          if(callback) callback()
        },
上一篇 下一篇

猜你喜欢

热点阅读