本文只要介绍如何在项目中把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'
}

react + axios实践的更多相关文章

  1. [转] React 最佳实践——那些 React 没告诉你但很重要的事

    前言:对很多 react 新手来说,网上能找到的资源大都是些简单的 tutorial ,它们能教会你如何使用 react ,但并不会告诉你怎么在实际项目中优雅的组织和编写 react 代码.用谷歌搜中 ...

  2. React最佳实践(1)

    React最佳实践不敢妄谈,但最差实践非知乎莫属. 旧版知乎看起来土了点,但体验流畅,起码用起来舒服. 新版知乎看起来UI现代化,技术实现上采用了React,但是可能因为知乎缺钱,请不起高水平的前端工 ...

  3. react项目实践——(1)使用webpack创建项目

    1. 新建文件夹,命名为项目名称——myapp,并打开myapp文件夹. mkdir webpack-demo && cd webpack-demo 2. 在./myapp中打开命令行 ...

  4. react axios 跨域问题

    周末又是补充知识点的时候了,用了react axios 跨越问题,貌似是要比vue 稍微麻烦一点 它请求http好像是没有问题的,但是https还是有跨域问题的, 我用的刚好是create-react ...

  5. react axios 跨域访问一个或多个域名

    1.react + axios 跨域访问一个域名 配置非常简单,只需要在当前的 package.json 文件里面配置: "proxy":"http://iot-demo ...

  6. iShow UI for React 最佳实践

    React 与 AJAX React只负责处理View这一层,它本身不涉及网络请求/AJAX,所以这里我们需求考虑两个问题: 第一,用什么技术从服务端获取数据: 第二,获取到的数据应该放在react组 ...

  7. Umi + Dva + Antd的React项目实践

    记录一下最近项目所用到的技术React + Dva + Antd + umi ,以免忘记.之前没有用过它们其中一个,也是慢慢摸索,了解数据整个流程. 先了解下概念 React 不多说,3大框架之一: ...

  8. [转] Immutable 详解及 React 中实践

    https://zhuanlan.zhihu.com/p/20295971 作者:camsong链接:https://zhuanlan.zhihu.com/p/20295971来源:知乎著作权归作者所 ...

  9. Immutable 详解及 React 中实践

    本文转自:https://github.com/camsong/blog/issues/3 Shared mutable state is the root of all evil(共享的可变状态是万 ...

随机推荐

  1. mongoDB 文档操作_增

    增加 / 插入 /保存 单文档插入 命令 db.collection.insertOne(doc) 功能 向被 use 的数据库中插入数据 实例 db.class.insertOne({"n ...

  2. MySQL数据目录(data)迁移

    因为系统分区的空间不足,添加了一块硬盘,挂载到/data目录下,把MySQL的数据目录(data)迁移过去. 1.停止MySQL服务: [root@zabbix mysql]# service mys ...

  3. 动态SQL之、条件判断(转)

    错误方式一: 在mybatis的动态sql语句中使用<if>标签可以判断sql中的条件是否成立. <select id="getPerson" resultTyp ...

  4. vbox安装增强功能,实现宿主机文件夹共享并浏览器访问

    虚拟机版本:6.0.4 r128413 (Qt5.6.2) linux:centos7/6 点击菜单栏中的设备->安装增强功能,再reboot 获取内核版本号 uname -r 查看yum的内核 ...

  5. CMDB资产管理系统开发【day25】:需求分析

    本节内容 浅谈ITIL CMDB介绍 Django自定义用户认证 Restful 规范 资产管理功能开发 浅谈ITIL TIL即IT基础架构库(Information Technology Infra ...

  6. crm 添加用户 编辑用户 公户和私户的展示,公户和私户的转化

    1.添加用户 和编辑可以写在一起 urls.py url(r'^customer_add/', customer.customer_change, name='customer_add'), url( ...

  7. HDU 1051(处理木棍 贪心)

    题意是处理一批木棍,如果当前处理的木棍长度和重量均大于前一根木棍的长度和重量,则处理当前木棍花费为 0,否则花费为 1. 用结构体存储木棍信息,将木棍按照长度从小到大排序,若长度相等则按照重量从小到大 ...

  8. 第六节:SignalR完结篇之依赖注入和分布式部署

    一. SignalR中DI思想的应用 DI,即依赖注入,它是一种不负责创建其自己的依赖项对象的一种模式,通常用来降低代码之间的耦合性,广泛应用于架构设计,是必不可少的一种思想. 下面结合一个需求来说一 ...

  9. SpringBoot系列: Web应用鉴权思路

    ==============================web 项目鉴权============================== 主要的鉴权方式有:1. 用户名/密码鉴权, 然后通过 Sess ...

  10. [物理学与PDEs]第4章第1节 引言

    1.  本章讨论可燃流体在流动过程中同时伴随着燃烧现象的情况. 2.  燃烧有两种, 一种是爆燃 (deflagration): 火焰低速向前传播, 此时流体微元通常是未燃气体.已燃气体的混合物; 一 ...