antd pro中如何使用mock数据以及调用接口-程序员宅基地

技术标签: ViewUI  后端  javascript  

antd pro的底层基础框架使用的是dva,dva采用effect的方式来管理同步化异步

在dva中主要分为3层 services  models  components

models层用于存放数据以及对数据进行操作,services层调用请求后台接口的方法,components层用于书写页面逻辑代码

services层

import request from '@/utils/request';

export async function doit(payload) {

  const {id} = payload;

  let url = `/api/v2/.../${id}`;

  return request(url,{

    mode: 'cors',

    method: 'GET',

  })

    .then(res => {

      return res;

    })

    .catch(err => console.log(err));

}

models层中的effects是与后台交互、处理数据逻辑的地方

import {doit} from '../../'

export default {

  namespace: 'test',

  effects: {

    *fetchNum ({payload,callback},{call,put}) {

      const res = yield call (doit,payload)

      //doit是引入services层那个js文件的doit方法,payload是后台要求传递的参数,res就是后台返过来的数据

      yield put ({

        type: 'addNum', //这就是reducer的addNum方法,put用来出发reducer中的方法,payload是传过去的参数。同时也能触发同等级effects中的方法

        payload: {

           num: res.data    //把后台返回的数据赋值给num,假如哪个reducer中的方法是由这里effects去触发的,哪个num名必须是这里的名字num,如果reducer中的方法不是这触发,那名字可以随意取

        }

      })

    }

  }

  reducers: {

    addNum (state,{payload:{num}}) {

      return {...state,num}

     }

  }

}

components层

页面如果需要使用models层的数据,要用connect进行连接,即在页面在引入import {connect} from 'dva';@connect(state => ({test:state.test})) 通过this.props获取数据

this.props.dispatch({

  type: 'test/fetchNum',   test对应models层的命名空间namespace

  payload: {

    numCount: ++1

  }

})

使用mock数据主要包括以下几步:

1、添加mock接口

2、添加service文件

3、添加model(需引入service函数)

4、页面链接model

5、页面调用model中的effect函数

6、model中的effects通过reducer中的函数将数据返回到页面

7、页面通过this.props获取数据

具体操作就是在项目根目录下,mock文件夹中新建record.js文件,用于存放mock数据

export default {
  'GET /love/record':{
     message: 'Succeed',
     code:0,
     data: [
        {
          key: '1',
          Name: '违规操作',
          age: '口腔科',
          address: '人民医院',
          tags: '2019-03-21 12:56:12',
          questions: '温度'
        },
        {
          key: '2',
          Name: '违规操作',
          age: '皮肤科',
          address: '人民医院',
          tags: '2019-03-21 12:56:12',
          questions: '压力'
        },
     ]
  }
}

然后在src目录下的services文件夹中新建一个record.js文件,用来创建请求数据的函数,框架已经为我们封装好了request函数(可能需要我们对request.js文件进行补充),我们可以直接进行使用

import request from '../utils/request' ;
export async function getRecord (payload) {
  return request('/love/record',{  
    //如果路径中有参数,需要用字符串模板进行拼接``  
    method: 'GET'
  })
  .then(res => {
    return res;
  }
  .catch(err => console.log(err))
}

src目录下的models文件夹是store文件夹,用来定义state

新建record.js文件

引入我们在services文件夹中创建的请求数据的函数

import { getRecord } from '../services/record' ;
export default {
  namespace: 'demo',
  state:{
    record: [],
  },
  effects: {
    *getRecord(payload,{call,put}) {
      const res = yield call(getRecord,payload)
      yield put({
        type: 'updateToView',
        payload:{record:res.data}
      });
    }
  },
  reducers: {
    updateToView(state, { payload }) {
      return {
        ...state,
        ...payload,
      }
    }
  }
}

最后在page页面中,通过this.props就可以得到我们想要的数据

import { connect } from 'dva' ;
@connect(state=> ({
  demo:state.demo
})
componentDidMount(){
  const { dispatch } = this.props;
  dispatch({
    //需要调用对于namespace下effects中的该函数 
    type: 'record/getRecord',  
  })
}
console.log(this.props)就可以得到结果
const { demo } = this.props

我的request.js文件

import fetch from 'dva/fetch';
import { message } from 'antd';
import { error } from '@/utils/error';
const checkStatus = response => {
  if (response.status >= 200 && response.status < 300) {
    return response;
  }
  const errortext = error[response.status] || response.statusText;
  let isLogin = response.url.search('/unsecure/login') != -1;
  if (response.status === 401) {
    if (isLogin) {
      message.error(`请求错误 ${response.status}: ${errortext}`);
    } else {
      console.log('gogogo')
      router.push('/user/login');
    }
  } else {
    if (!isLogin) {
      message.error(`请求错误 ${response.status}: ${errortext}`);
    }
  }
  return response;
};
export default function request(url, option) {
  //获取token
  let token = localStorage.getItem('token');
  const options = {
    ...option,
    headers: {
      'X-Authorization': token,
      'x-language': 'chinese',
    },
  };
  const newOptions = { ...options, credentials: 'include' };
  if (
    newOptions.method === 'POST' ||
    newOptions.method === 'PUT' ||
    newOptions.method === 'DELETE'
  ) {
    if (!(newOptions.body instanceof FormData)) {
      newOptions.headers = {
        Accept: 'application/json',
        'Content-Type': 'application/json; charset=utf-8',
        ...newOptions.headers,
      };
      if (newOptions.dataType != 'string') {
        newOptions.body = JSON.stringify(newOptions.body);
      }
    } else {
      newOptions.headers = {
        Accept: 'application/json',
        ...newOptions.headers,
      };
    }
  }
  return (
    fetch(url, newOptions)
      .then(checkStatus)
      .then(response => {
        if (newOptions.responseType === 'blob') {
          return response.blob();
        }
        let type = typeof response;
        switch (type) {
          case 'object':
            return response.json();
          case 'string':
            return response.text();
        }
        return response.json();
      })
      .then(res => {
        return res;
      })
      .catch(e => { })
  );
}

error.js文件
export default {
 40101: '再输错两次将锁住',
 40200: '用户不存在',
  200: '服务器成功返回请求的数据。',
  201: '新建或修改数据成功。',
  202: '一个请求已经进入后台排队(异步任务)。',
  204: '删除数据成功。',
  400: '发出的请求有错误,服务器没有进行新建或修改数据的操作。',
  401: '用户权限错误。',
  403: '权限信息错误。',
  404: '发出的请求针对的是不存在的记录,服务器没有进行操作。',
  406: '请求的格式不可得。',
  410: '请求的资源被永久删除,且不会再得到的。',
  422: '当创建一个对象时,发生一个验证错误。',
  500: '服务器发生错误,请检查服务器。',
  502: '网关错误。',
  503: '服务不可用,服务器暂时过载或维保。',
  504: '网关超时。',
}

 

 

 

  

 

转载于:https://www.cnblogs.com/luxiaot/p/11244434.html

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_30888027/article/details/99642696

智能推荐

Fortify代码扫描问题及修复_input validation and representation-程序员宅基地

文章浏览阅读1.6w次,点赞8次,收藏39次。静态代码扫描常见问题及修复风险类型原因Code Correctness: Erroneous String Compare字符串的对比使用错误方法Cross-Site ScriptingWeb浏览器发送非法数据,导致浏览器执行恶意代码Dead Code: Expression is Always true表达式的判断总是trueDead Code: Unused Method没有使用的方法HTTP Response Splitting含有未验证的数据_input validation and representation

探索Svelte SVG Patterns:创新SVG图案生成器-程序员宅基地

文章浏览阅读278次,点赞4次,收藏9次。探索Svelte SVG Patterns:创新SVG图案生成器项目地址:https://gitcode.com/catchspider2002/svelte-svg-patterns该项目[[链接]][1]是一个基于Svelte框架构建的SVG图案生成工具,由开发者catchspider2002维护。它允许用户通过简单的交互式界面创建独特且可自定义的SVG图案,这些图案可以用于网页背景、图标...

光场深度估计(Light Field Depth Estimation)-程序员宅基地

文章浏览阅读1.8w次,点赞23次,收藏94次。本文将介绍光场领域进行深度估计的相关研究。In this post, I’ll introduce some depth estimation algorithms using Light field information. Here is some of the code.研究生阶段的研究方向是光场深度信息的恢复。再此做一些总结,以便于让大家了解光场数据处理的一般步骤以及深度估计的相关..._光场深度估计

CSS3 column 分栏-程序员宅基地

文章浏览阅读68次。column的布局形式还没有使用过,后续的bug和解决方案有待检验。columncolumn-count:number; 设置内容分为多少栏显示column-width:长度单位;设置每一栏的宽度而不设定元素的宽度column-gap:长度单位;设置多栏之间的间隔距离column-rule:宽度,颜色;在栏与栏之间增加一条间隔线。类似border.column-spa..._h5 column-span

在ArcGIS+Server里把屏幕像素点数所代表的距离转换为实际地理距离-程序员宅基地

文章浏览阅读495次。/*** @description 把屏幕像素点数所代表的距离转换为实际地理距离 * @author brian* @param mapScale地图比例尺 * @param pixelUnits屏幕像素个数 * @return double 实际地理距离 */public double ConvertPixelsToMapUnits(WebMa..._像素距离和实际距离转换

STM32开发系列之寄存器(二)GPIO口位带操作实现_gpiob->odr |=1<<6-程序员宅基地

文章浏览阅读2k次,点赞2次,收藏8次。位带操作顾名思义就是可以单独对CPU寄存器某个位进行读写操作,采取这种方式,将会大大减少我们写代码的难度,不用像上篇博客那样进行与或运算和移位,降低了出错的可能性。如果之前有使用过8051单片机的话,应该体会过这种操作的好处。例如,在51单片机中,P1.0上挂了一个灯,我们想要他点亮,可以直接P1.0=0或者P1.0=1这样写,直接对P1端的某个IO口进行操作。但在STM32中并不允许这样操作,..._gpiob->odr |=1<<6

随便推点

Android 中常用的跨进程通信和跨线程通信方法总结_android 跨线程消息-程序员宅基地

文章浏览阅读708次。优点:简化了线程间通信:EventBus提供了一种简单的方式来进行线程间通信,开发人员无需手动处理线程切换和消息传递的细节。松耦合的组件通信:通过EventBus,组件之间可以进行松耦合的通信,发送者和接收者之间没有直接的依赖关系。线程切换方便:EventBus允许在发布事件时指定事件的接收线程,从而方便地在不同线程之间切换。1.优点:网络通信能力:Socket通信可以在网络层面上进行进程间通信,适用于跨网络的通信需求。有多个进程和线程就会涉及到跨进程通信或跨线程通信,用户状态同步,UI刷新等。_android 跨线程消息

vue2(vue-cli3x[vue.config.js])使用cesium配置过程_vue2中使用cesium,vue.config.js-程序员宅基地

文章浏览阅读1.7k次。vue-cli3x中vue.config.js配置cesium环境_vue2中使用cesium,vue.config.js

java实现获取url中的图片保存到本地_java遍历数据库url保存照片-程序员宅基地

文章浏览阅读1.8k次。实现背景由于原本OSS服务器即将过期,需要将存在数据库里的oss_url中的地址取出,访问该地址并保存图片代码实现核心下载代码private void download(List<String> listImgSrc) { try { for (String url : listImgSrc) { String imageName = url.substring(url.lastIndexOf("/") + 1, u_java遍历数据库url保存照片

Mac下好用的终端SSH软件:Royal TSX的入门使用指导_royal tsx 可视化界面-程序员宅基地

文章浏览阅读2.3k次。介绍一款Mac下免费的终端软件:Royal TSX下载地址:Royal Apps使用:1.安装插件点击桌面左上角的Royal TSX,点击Preferences,出现如下窗口,然后在左侧列表中找到Plugins点击即出现安装插件的窗口。找到需要的Terminal以及File Transfer插件安装后,点击Apply & Close,然后重启Royal TSX插件即可生效。2.新建DocumentRoyal TSX是以Document的形式进行远程主机管理的,所以在建立远_royal tsx 可视化界面

Python使用MySQL查询数据导出Excel-程序员宅基地

文章浏览阅读3.7k次,点赞3次,收藏15次。Python系列之MySQL where in查询数据导出Excel最近接到需求,需要通过一条SQL查询出来的id,去过滤另外一条SQL的数据,听起来并不难,但是因为业务原因需要查询很多个环境,而且需要经常查询,所以想到通过程序来实现,开发环境MySQL 10.1.38-MariaDB-1~bionicPython3.7.8开发工具PyCharm2018.1SmartGit18.1Navicat15.0.28...

【Word及其他文本工具快捷键大全】_文字工具快捷键-程序员宅基地

文章浏览阅读2.7k次,点赞6次,收藏12次。整理由来由于大家日常难免用到Word等工具,由此,我整理了一份快捷工具大全,可以有效提高办公等效率。(部分资料度娘整理)具体内容(1)常见快捷键Ctrl + A:“全选”界面当前所有内容Ctrl + S:“保存”当前已经编辑的内容,一般可以有效防止内容“丢失”,很好用!Ctrl + C:“复制”已经选中的内容Ctrl + V:将已经复制的内容“粘贴”到另一编辑界面,常与上一个“复制”结合使用Ctrl + B:“加粗”已经选中的文本Ctrl + I:将选中的文字“斜体”化Ctrl + U_文字工具快捷键