当前位置:编程学习 > > 正文

vue引入axios(vue封装axios的几种方法)

时间:2022-01-20 00:06:02类别:编程学习

vue引入axios

vue封装axios的几种方法

基础版

第一步:配置axios

首先,创建一个Service.js,这里面存放的时axios的配置以及拦截器等,最后导出一个axios对象。我平常elementUI用的比较多,这里你也可以使用自己的UI库。

  • import axios from 'axios'
    import { Message, Loading } from 'element-ui'
    const ConfigBaseURL = 'https://localhost:3000/' //默认路径,这里也可以使用env来判断环境
    let loadingInstance = null //这里是loading
    //使用create方法创建axios实例
    export const Service = axios.create({
      timeout: 7000, // 请求超时时间
      baseURL: ConfigBaseURL,
      method: 'post',
      headers: {
        'Content-Type': 'application/json;charset=UTF-8'
      }
    })
    // 添加请求拦截器
    Service.interceptors.request.use(config => {
      loadingInstance = Loading.service({
        lock: true,
        text: 'loading...'
      })
      return config
    })
    // 添加响应拦截器
    Service.interceptors.response.use(response => {
      loadingInstance.close()
      // console.log(response)
      return response.data
    }, error => {
      console.log('TCL: error', error)
      const msg = error.Message !== undefined ? error.Message : ''
      Message({
        message: '网络错误' + msg,
        type: 'error',
        duration: 3 * 1000
      })
      loadingInstance.close()
      return Promise.reject(error)
    })
    
    
  • 具体的拦截器逻辑以具体业务为准,我这里没什么逻辑,只是加了一个全局的loading而已

    第二步:封装请求

    这里我再创建一个request.js,这里面放的是具体请求。

  • import {Service} from './Service'
    export function getConfigsByProductId(productId) {
      return Service({
        url: '/manager/getConfigsByProductId',
        params: { productId: productId }
      })
    }
    export function getAllAndroidPlugins() {
      return Service({
        url: '/manager/getAndroidPlugin ',
        method: 'get'
      })
    }
    export function addNewAndroidPlugin(data) {
      return Service({
        url: '/manager/addAndroidPlguin',
        data: JSON.stringify(data)
      })
    }
    
    
  • 当然你也可以url再封装一遍,放到另一个文件里,我觉得这样并无什么意义,反而增加复杂度。这里主要注意的是起名问题,建议按功能起名,例如我这里请求方式+功能或者内容+参数,这样子直接看getConfigsByProductId这个名字也是很清晰明了

    第三步:使用

    在vue组件中

  • import {getAllAndroidPlugins,getConfigsByProductId,addNewAndroidPlugin} from '@/api/request.js'
    
    getAllAndroidPlugins()
    .then(res=>{
    
    })
    
    
  • 全局使用 在main.js中

  • import {Service} from '@/api/Service.js'
    Vue.prototype.$axios=Service
    
    
    
  • 进阶版

    随着vue cli的升级,core-js\babel等依赖也随之升级,现在已经可以随心所欲的async/await了,因此本次封装就是把之前的Promise升级成为async await. 首先,还是一样,先封装axios

  • //Service.js
    import axios from 'axios'
    const ConfigBaseURL = 'https://localhost:3000/' //默认路径,这里也可以使用env来判断环境
    //使用create方法创建axios实例
    export const Service = axios.create({
      timeout: 7000, // 请求超时时间
      baseURL: ConfigBaseURL,
      method: 'post',
      headers: {
        'Content-Type': 'application/json;charset=UTF-8'
      }
    })
    // 添加请求拦截器
    Service.interceptors.request.use(config => {
      return config
    })
    // 添加响应拦截器
    Service.interceptors.response.use(response => {
      // console.log(response)
      return response.data
    }, error => {
      return Promise.reject(error)
    })
    
    
    
  • 这时候你就获取了一个axios对象,然后我推荐一个常用的库,主要用于处理async时的错误:await-to-js。 代码接上面的。

  • import to from 'await-to-js'
    export function isObj(obj) {
      const typeCheck = typeof obj!=='undefined' && typeof obj === 'object' && obj !== null 
      return typeCheck && Object.keys(obj).length > 0
    }
    export async function _get(url, qs,headers) {
      const params = {
        url,
        method: 'get',
        params: qs ? qs : ''
      }
      if(headers){params.headers = headers}
      const [err, res] = await to(Service(params))
      if (!err && res) {
        return res
      } else {
        return console.log(err)
      }
    }
    
    
  • 封装get时只需要考虑parameter,使用await-to-js去捕获await时的错误,只在成功时返回数据,错误时就会走拦截器。

  • export async function _get(url, qs,headers) {
      const params = {
        url,
        method: 'get',
        params: isObj(qs) ? qs : {}
      }
      if(isObj(headers)){params.headers = headers}
      const [err, res] = await to(Service(params))
      if (!err && res) {
        return res
      } else {
        return console.log(err)
      }
    }
    
    
  • 这是我封装的post

  • export async function _post(url, qs, body) {
      const params = {
        url,
        method: 'post',
        params: isObj(qs) ? qs : {},
        data: isObj(body) ? body : {}
      }
      const [err, res] = await to(Service(params))
      if (!err && res) {
        return res
      } else {
        return console.log(err)
      }
    }
    
    
  • 使用的时候可以直接引入,也可以多次封装

  • //a.vue
    <srcipt>
    improt{_get}from './Service'
    export default{
    	methods:{
        	async test(){
            const res = await _get('http://baidu.com')
           }
        }
    }
    </script>
    
    
  • 以上就是vue封装axios的几种方法的详细内容,更多关于vue封装axios的资料请关注开心学习网其它相关文章!

    标签:
    上一篇下一篇

    猜您喜欢

    热门推荐