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

首先安装 axios

  1. $npm install axios $yarn install axios

代码中引入axios

  1. import axios from 'axios';

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

  1. import axios from 'axios';
  2. import globalCode from '../constants/globalCode';
  3. import { Toast } from 'antd-mobile';
  4. import {createHashHistory} from 'history';
  5. import commonInfo from '../common/CommonInfo';
  6.  
  7. const instance = axios.create({
  8. //当创建实例的时候配置默认配置
  9. xsrfCookieName: 'xsrf-token'
  10. });
  11.  
  12. //添加请求拦截器
  13. instance.interceptors.request.use(function(config){
  14. //在发送请求之前做某事,比如加一个loading
  15. if(commonInfo.hasLoading){
  16. Toast.loading('', 3);
  17. }
  18.  
  19. return config;
  20. },function(error){
  21. //请求错误时做些事
  22. Toast.hide();
  23. return Promise.reject(error);
  24. });
  25.  
  26. //添加一个响应拦截器
  27. instance.interceptors.response.use(function (response) {
  28. // 1.成功
  29. if (response.data.success && response.data.messageCode === globalCode.success) {
  30. if(commonInfo.hasLoading){
  31. Toast.hide();
  32. }
  33. return response.data.data;
  34. }
  35.  
  36. // 2.session过期
  37. if (!response.data.success && response.data.messageCode === globalCode.timeout) {
  38. Toast.hide();
  39. Toast.info("会话过期,请重新登录", 1);
  40. createHashHistory().push('/login');
  41.  
  42. // 定义一个messagecode在后面会用到
  43. return Promise.reject({
  44. messageCode: 'timeout'
  45. })
  46. }
  47.  
  48. // 3.11111111 系统异常、网络异常
  49. if (response.data.success && response.data.messageCode === globalCode.busyCode) {
  50. Toast.hide();
  51. Toast.info(response.data.message, 1);
  52. return Promise.reject({
  53. messageCode: 'netError'
  54. })
  55. }
  56.  
  57. // 3.其他失败,比如校验不通过等
  58. return Promise.reject(response.data);
  59. }, function () {
  60. Toast.hide();
  61. // 4.系统错误,比如500、404等
  62. Toast.info('系统异常,请稍后重试!', 1);
  63. return Promise.reject({
  64. messageCode: 'sysError'
  65. });
  66. });
  67.  
  68. export default instance;

引用 axios 的 instance 实例

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

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

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

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

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

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

  1. // 集中管理路由,所有的接口地址:
  2. // 1.整个应用用到了哪些接口一目了然
  3. // 2.接口地址可能变化,方便管理

  4. const prefix = '' // api地址前缀
  5. export default(config => {
  6. return Object.keys(config).reduce((copy, name) => {
  7. copy[name] = `${prefix}$config[name]`
  8. return copy
  9. })
  10. })({
  11. // example api
  12. "getExampleData": "/api/example/data"
  13. })

文件最终返回一个对象

  1. // api对象
  2. {
  3. getExampleData: '/api/example/data'
  4. }

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. Codeforces Round #551 (Div. 2) 题解

    CF1153A 直接做啊,分类讨论即可 #include<iostream> #include<string.h> #include<string> #includ ...

  2. 随手记一个漂亮的code

    代码  从前有个代码长这样 if (a) { if (b) { c } } else { if (d) { c } } 后来长这样 if (a && b || !a && ...

  3. 洛谷P5289 皮配

    解:观察一波部分分. 首先小数据直接暴力4n,然后考虑背包.设f[i][a][b][c]表示前i个学校中前三位导师分别有多少人,第四位导师可以直接推出来. 然后暴力枚举每一个人放在哪进行背包. 进一步 ...

  4. 更换gcc工具链

    title: 更换gcc工具链 date: 2019/1/16 19:27:51 toc: true --- 更换gcc工具链 下载后解压到一个临时目录先看看文件结构 mkdir tmp tar xj ...

  5. 第十节: EF的三种追踪实体状态变化方式(DBEntityEntry、ChangeTracker、Local)

    一. 简介 我们在前面章节介绍EF基本增删改的时候,曾说过EF的SaveChanges()方法,会一次性的将所有的实体的状态变化统一提交到数据库,那么你是否想过EF的实体会有哪些状态变化呢?什么原因会 ...

  6. [物理学与PDEs]第2章第4节 激波 4.2 熵条件

    1.  R.H. 条件仅仅给出了越过激波时的能量守恒定律, 即热力学第一定律; 但客观的流体运动过程还需满足热力学第二定律, 即越过激波是个熵增过程: $$\bex S_1>S_0\quad(0 ...

  7. shell1

    shebang = sharp-bang = #! 1.echo $PATH export PATH="$PATH:/home/user/bin" PREPEND prepend( ...

  8. [译]Ocelot - Request Id / Correlation Id

    原文 Ocelot可以通过header的形式发送一个requestid.ocelot会将这个requestid转发到下游服务. 如果在日志配置中设置了IncludeScopes为true,那么requ ...

  9. 嵌套调用less函数时参数值的变化及提取部分-遁地龙卷风

    在a.less中导入base.lessa.less中的代码 .animate-ripple-ink{ .animation(ripple .5s linear;{ 100%{ opacity:; .t ...

  10. 402 CSS菜鸟:transform and transition

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...