Vue接口封装的完整步骤记录


Posted in Vue.js onMay 14, 2021

首先根据接口写好对应页面的请求

内容如图尽量保证js文件名称与页面文件名称相同(易于查找)

Vue接口封装的完整步骤记录

根据文件目录动态引入/导出接口

提高便捷性

/**
 * 自动引入当前文件夹下所有module
 * require.context(directory, useSubdirectories = false, regExp = /^.//);
 * @param {String} directory 读取文件的路径
 * @param {Boolean} directory 匹配文件的正则表达式
 * @param {regExp} regExp 读取文件的路径
 */
 const modulesFiles = require.context(
    './', // 在当前目录下查找
    false, // 不遍历子文件夹
    /\.js$/ // 正则匹配 以 .js结尾的文件
)
 const modules = modulesFiles.keys().reduce((modules, modulePath) => {
   const moduleName = modulePath.replace(/^.\/(.*)\.js/,'$1')
   const value = modulesFiles(modulePath)
   modules[moduleName] = value.default
   return modules
   }, {})

export default modules

根据项目情况编写拦截/插入内容

import axios from 'axios'
import { MessageBox, Message } from 'element-ui'
import store from '@/store'
import { getToken } from '@/utils/auth'

// create an axios instance
const service = axios.create({
  baseURL: process.env.VUE_APP_BASE_API, // url = base url + request url
  // withCredentials: true, // send cookies when cross-domain requests
  timeout: 5000 // request timeout
})

// request interceptor
service.interceptors.request.use(
  config => {
    // 在发送请求之前做些什么

    if (store.getters.token) {
      // let each request carry token让每个请求携带令牌
      // ['X-Token'] is a custom headers key 是一个自定义标题键
      // please modify it according to the actual situation请根据实际情况修改
      config.headers['X-Token'] = getToken()
    }
    return config
  },
  error => {
    // do something with request error
    console.log(error) // for debug
    return Promise.reject(error)
  }
)

// response interceptor
service.interceptors.response.use(
  /**
   * If you want to get http information such as headers or status如果您想获取http信息,如标头或状态
   * Please return  response => response
  */

  /**
   * Determine the request status by custom code通过自定义代码确定请求状态
   * Here is just an example这里只是一个例子
   * You can also judge the status by HTTP Status Code您还可以通过HTTP状态码来判断状态
   */
  response => {
    const res = response.data
    // console.log(res);
    // 如果自定义代码不是20000,则判断为错误.
    if (res.code !== 200) {
      Message({
        message: res.message || 'Error',
        type: 'error',
        duration: 5 * 1000
      })
      
      // 50008: 非法token; 50012: 其他客户端已登录; 50014: Token 已过期;
      if (res.code === 50008 || res.code === 50012 || res.code === 50014) {
        // to re-login
        MessageBox.confirm('您已注销,可以取消以停留在此页面,或重新登录', '确认注销', {
          confirmButtonText: 'Re-Login',
          cancelButtonText: 'Cancel',
          type: 'warning'
        }).then(() => {
          store.dispatch('user/resetToken').then(() => {
            location.reload()
          })
        })
      }
      return Promise.reject(new Error(res.message || 'Error'))
    } else {
      return res
    }
  },
  error => {
    console.log('err' + error) // for debug
    Message({
      message: error.message,
      type: 'error',
      duration: 5 * 1000
    })
    return Promise.reject(error)
  }
)

export default service

编写env文件

# just a flag
ENV = 'development'

# base api
VUE_APP_BASE_API = 'http://192.168.2.44:5001/v1'

vue继承api

import serve from './api/index'
Vue.prototype.$api = serve;

使用

getAssetsList() {
  this.$api.assets
    .getAssetsList(this.queryInfo.num, this.queryInfo.size)
    .then((res) => {
      this.assetsList = res.data.cards
      this.total = res.data.page.totalCount
    })
    .catch(() => {
      this.$message.error({
        message: "失败",
        duration: 700,
      })
    })
},

总结

到此这篇关于Vue接口封装的文章就介绍到这了,更多相关Vue接口封装内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Vue.js 相关文章推荐
详解vue 组件注册
Nov 20 Vue.js
Vue 的 v-model用法实例
Nov 23 Vue.js
解决vue页面刷新,数据丢失的问题
Nov 24 Vue.js
详解Vue中的自定义指令
Dec 07 Vue.js
Vue-router中hash模式与history模式的区别详解
Dec 15 Vue.js
手写Vue源码之数据劫持示例详解
Jan 04 Vue.js
深入了解Vue动态组件和异步组件
Jan 26 Vue.js
Vue elementUI表单嵌套表格并对每行进行校验详解
Feb 18 Vue.js
Vue监视数据的原理详解
Feb 24 Vue.js
Vue.js中v-for指令的用法介绍
Mar 13 Vue.js
vue3语法糖内的defineProps及defineEmits
Apr 14 Vue.js
Vue ECharts实现机舱座位选择展示功能
May 15 Vue.js
Vue全家桶入门基础教程
vue实现可拖拽的dialog弹框
vue如何批量引入组件、注册和使用详解
vue组件的路由高亮问题解决方法
Vue通过懒加载提升页面响应速度
Vue详细的入门笔记
如何理解Vue前后端数据交互与显示
You might like
PHP PDOStatement::fetchAll讲解
2019/01/31 PHP
PHP设计模式之简单工厂和工厂模式实例分析
2019/03/25 PHP
thinkPHP5框架路由常用知识点汇总
2019/09/15 PHP
jQuery 注意事项 与原因分析
2009/04/24 Javascript
javascript loadScript异步加载脚本示例讲解
2013/11/14 Javascript
浅谈checkbox的一些操作(实战经验)
2013/11/20 Javascript
jQuery实现页面滚动时动态加载内容的方法
2015/03/20 Javascript
JavaScript实现简单获取当前网页网址的方法
2015/11/09 Javascript
jquery实现加载进度条提示效果
2015/11/23 Javascript
jQuery打字效果实现方法(附demo源码下载)
2015/12/18 Javascript
Javascript 基础---Ajax入门必看
2016/07/06 Javascript
详解BootStrap中Affix控件的使用及保持布局的美观的方法
2016/07/08 Javascript
原生javascript 学习之js变量全面了解
2016/07/14 Javascript
使用JS实现图片展示瀑布流效果的实例代码
2016/09/12 Javascript
AngularJs的UI组件ui-Bootstrap之Tooltip和Popover
2018/07/13 Javascript
IntelliJ IDEA编辑器配置vue高亮显示
2019/09/26 Javascript
微信小程序wxs实现吸顶效果
2020/01/08 Javascript
JS替换字符串中指定位置的字符(多种方法)
2020/05/28 Javascript
vue实现登录、注册、退出、跳转等功能
2020/12/23 Vue.js
[02:34]肉山说——泡妞篇
2014/09/16 DOTA
[02:12]2019完美世界全国高校联赛(春季赛)报名开启
2019/03/01 DOTA
[02:36]DOTA2-DPC中国联赛 正赛 PSG.LGD vs Magma 选手采访
2021/03/11 DOTA
初步理解Python进程的信号通讯
2015/04/09 Python
Python3访问并下载网页内容的方法
2015/07/28 Python
Python线程池模块ThreadPoolExecutor用法分析
2018/12/28 Python
Python3模拟登录操作实例分析
2019/03/12 Python
CSS3 background-image颜色渐变的实现代码
2018/09/13 HTML / CSS
美国网上眼镜商城:Zenni Optical
2016/11/20 全球购物
法国在线宠物店:zooplus.fr
2018/02/23 全球购物
乡镇干部先进事迹材料
2014/02/03 职场文书
个人求职自荐信范文
2014/06/20 职场文书
卖车协议书范本4篇
2014/10/01 职场文书
2014年学校办公室工作总结
2014/12/19 职场文书
Nginx实现高可用集群构建(Keepalived+Haproxy+Nginx)
2021/05/27 Servers
《王国之心》迎来了发售的20周年, 野村哲发布贺图
2022/04/11 其他游戏
css3 选择器
2022/05/11 HTML / CSS