美文网首页
在create-react-app搭建的框架中mock数据方法

在create-react-app搭建的框架中mock数据方法

作者: 范晓坤 | 来源:发表于2019-02-27 19:57 被阅读0次

    环境:

    1.用create-react-app搭建的React的应用
    2.没有用npm run eject弹出默认config

    采用的插件:

    json-server :用于模拟后端的各种请求;
    concurrently:用于并发地启动我们前端的web server和后端的server;

    使用步骤

    1.npm install json-server concurrently
    2.在根目录下创建mock文件夹,在mock文件夹下创建文件db.json

    其中db.json文件内容如下(以表格数据为例):


    屏幕快照 2019-02-27 下午7.51.26.png
    3.在根目录下创建utils文件夹,在其下创建request.ts,主要处理封装请求,导出request 作为公共方法,代码如下:
    import fetch, { AxiosResponse, AxiosRequestConfig, CancelTokenSource } from 'axios';
    import { message } from 'antd';
    import { stringify } from 'qs';
    // import config from './config';
    
    // const { apiPrefix } = config;
    
    function checkStatus(response: AxiosResponse) {
      if (response.status >= 200 && response.status < 300) {
        return response.data;
      }
      const msg = response.data.message ? response.data.message : '接口格式返回错误';
      message.error(msg);
      const error = Object.assign(new Error(`${response.statusText}:${msg}`), {
        response
      });
      throw error;
    }
    
    function checkData(response: { status: boolean, message: string, data: Object }): any {
      if (response.status === true) {
        return response;
      }
      if (response.message) {
        message.error(response.message);
      } else {
        const error = Object.assign(new Error(response.message || '请求失败'), {
          response
        });
        throw error;
      }
      return;
    }
    /**
     * 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 async function request(
      url: string,
      options?: { method?: 'GET' | 'POST', body?: Object, [key: string]: any },
      withCredentials: boolean = true,
      withApiPrefix: boolean = true,
      cancleSource?: CancelTokenSource,
    ) {
      const method = (options && options.method) ? options.method.toUpperCase() : 'GET';
      const requestOption: AxiosRequestConfig = {
        // url: withApiPrefix ? `${apiPrefix}${url}` : url,
        url: url,
        method,
        withCredentials,
        validateStatus(status: number) {
          return status < 500;
        },
        paramsSerializer(params: Object) {
          return stringify(params, { arrayFormat: 'indices' });
        },
        headers: {
          'Content-Type': 'application/json',
          Accept: 'application/json',
        },
      };
    
      if (options) {
        if (method === 'GET') {
          requestOption.params = options.body || options;
        } else {
          if (options.body) {
            requestOption.data = options.body;
          }
        }
      }
    
      if (cancleSource) {
        requestOption.cancelToken = cancleSource.token;
      }
    
      return fetch(requestOption)
        .then(checkStatus)
        .then(checkData)
        .then(data => ({ ...data }))
        .catch((err) => {
          throw err;
        });
    }
    
    

    4.修改package.json文件,主要代码如下:

    "scripts": {
        "start": "concurrently 'react-app-rewired start --scripts-version react-scripts-ts' 'json-server --watch ./mock/db.json -p 3001'",
        "build": "react-app-rewired build --scripts-version react-scripts-ts",
        "test": "react-app-rewired test --env=jsdom --scripts-version react-scripts-ts"
      },
    
    "proxy": {
        "/": {
          "target": "http://localhost:3001"
        }
      }
    

    5.调用接口:

     request(props.url).then((res: any) => {
              this.setState({
                dataSource: res.data
              });
            });
    

    实现思路参考如下文章:
    https://cuyu.github.io/javascript/2017/04/21/%E6%89%93%E9%80%A0%E5%8F%AF%E4%B8%8E%E5%90%8E%E7%AB%AF%E6%97%A0%E7%BC%9D%E8%A1%94%E6%8E%A5%E7%9A%84%E5%89%8D%E7%AB%AF%E5%BC%80%E5%8F%91%E7%8E%AF%E5%A2%83

    相关文章

      网友评论

          本文标题:在create-react-app搭建的框架中mock数据方法

          本文链接:https://www.haomeiwen.com/subject/tphquqtx.html