vue封装axios的几种方法

2022-04-15 0 491
目录
  • 基础版
    • 第一步:配置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的资料请关注NICE源码其它相关文章!

    免责声明:
    1、本网站所有发布的源码、软件和资料均为收集各大资源网站整理而来;仅限用于学习和研究目的,您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。 不得使用于非法商业用途,不得违反国家法律。否则后果自负!

    2、本站信息来自网络,版权争议与本站无关。一切关于该资源商业行为与www.niceym.com无关。
    如果您喜欢该程序,请支持正版源码、软件,购买注册,得到更好的正版服务。
    如有侵犯你版权的,请邮件与我们联系处理(邮箱:skknet@qq.com),本站将立即改正。

    NICE源码网 JavaScript vue封装axios的几种方法 https://www.niceym.com/28123.html