• react + axios实践


    本文只要介绍如何在项目中把react和axios结合起来使用,想了解更多关于axios详细知识以及api,可以到官网查看 https://www.npmjs.com/package/axios

    首先安装 axios

    $npm install axios  或  $yarn install axios

    代码中引入axios

    import axios from 'axios';

    写一个拦截所有请求的axios全局拦截器

    import axios from 'axios';
    import globalCode from '../constants/globalCode'; 
    import { Toast } from 'antd-mobile';
    import {createHashHistory} from 'history';
    import commonInfo from '../common/CommonInfo';
    
    const instance = axios.create({
        //当创建实例的时候配置默认配置
        xsrfCookieName: 'xsrf-token'
    });
    
    //添加请求拦截器
    instance.interceptors.request.use(function(config){
            //在发送请求之前做某事,比如加一个loading
            if(commonInfo.hasLoading){
                Toast.loading('', 3);
            }
    
            return config;
        },function(error){
            //请求错误时做些事
            Toast.hide();
            return Promise.reject(error);
    });
    
    //添加一个响应拦截器
    instance.interceptors.response.use(function (response) {
        // 1.成功
        if (response.data.success && response.data.messageCode === globalCode.success) {
            if(commonInfo.hasLoading){
                Toast.hide();
            }
            return response.data.data;
        }
    
        // 2.session过期
        if (!response.data.success && response.data.messageCode === globalCode.timeout) {
            Toast.hide();
            Toast.info("会话过期,请重新登录", 1);
            createHashHistory().push('/login');
    
            // 定义一个messagecode在后面会用到
            return  Promise.reject({
                messageCode: 'timeout'
            })
        }
    
        // 3.11111111 系统异常、网络异常
        if (response.data.success && response.data.messageCode === globalCode.busyCode) {
            Toast.hide();
            Toast.info(response.data.message, 1);
            return  Promise.reject({
                messageCode: 'netError'
            })
        }
    
        // 3.其他失败,比如校验不通过等
        return Promise.reject(response.data);
    }, function () {
        Toast.hide();
        // 4.系统错误,比如500、404等
        Toast.info('系统异常,请稍后重试!', 1);
        return Promise.reject({
            messageCode: 'sysError'
        });
    });
    
    export default instance;

    引用 axios 的 instance 实例

    mport API from '../../config/api';
    import instance from '../utils/axiosCore';
    
    // PS:此处如果对请求参数格式有疑问的可以查看官网资料,此处就不一一做详细解释了
    // get
    export const login = (params) => {
       return instance.get(API.LOGIN_API, { params: params });
    };
    
    // post
    export const getConsultant = (params) => {
       return instance.post(API.GET_CONSULTANT_API, params);
    };

    发送请求并处理请求返回数据

    import { login } from '../../models/loginModel';
    
    login = () => {
            let params = {
               username: "admin",
               password: "123456"
            };
          
            login (params).then((data) => {
                //此处为正常业务数据的处理
               
            }, (data) => {
                if (data.messageCode !== 'netError' && data.messageCode !== 'sysError' && data.messageCode !== 'timeout') {
                    //此处是对除了以上几个系统异常意外的业务异常的处理
                    Toast.info(data.message, commonInfo.showToastTime);
                }
            });
        };
    
    
    // 一次性并发多个请求
    axios.all([getUserAccount(),getUserPermissions()])
      .then(axios.spread(function(acct,perms){
        //当这两个请求都完成的时候会触发这个函数,两个参数分别代表返回的结果
      }))

    到此,就是一个完整的从请求发送->拦截请求->请求响应->拦截响应->处理返回数据。

    上面的apis 文件可以用下面的方法写

    封装一个匿名函数返回一个apis对象,通过apis对象的键名去获取对应的api地址

    // 集中管理路由,所有的接口地址:
    //  1.整个应用用到了哪些接口一目了然
    //  2.接口地址可能变化,方便管理
    ​
    const prefix = '' // api地址前缀
    export default(config => {
        return Object.keys(config).reduce((copy, name) => {
          copy[name] = `${prefix}$config[name]`
          return copy
        })
    })({
      // example api
      "getExampleData": "/api/example/data" 
    })
    ​

    文件最终返回一个对象

    // api对象
    {
      getExampleData: '/api/example/data'
    }
  • 相关阅读:
    手机模式input框输入框收起键盘失焦后强制让页面归位
    造一个智能语音音箱!!!太简单了【语音智能管家】
    教你搭建一个花卉识别系统(超级简单)
    【语音智能管家】之语音唤醒(附演示视频)
    conda 安装GPU——CUDA
    筹划了几年,我终于开始实现了---语音智能管家
    我爬取了爬虫岗位薪资,分析后发现爬虫真香
    最近爆火的帅小伙丁真在AI面前颜值多少分?
    生物信息学云论坛第十三场报告会
    生物信息学云论坛第十二场报告会
  • 原文地址:https://www.cnblogs.com/xzqyun/p/9518882.html
Copyright © 2020-2023  润新知