首页 > 其他分享 >vue3中使用axios

vue3中使用axios

时间:2023-04-16 18:33:48浏览次数:39  
标签:axios return url res vue3 headers 使用 data

1、问题:

在vue2中axios通常是经过封装的后挂载使用的,来处理token及报错处理,比如

//main.js
import ajax from '@/axios.js'
Vue.prototype.ajax = ajax

在项目中使用也很方便this.ajax就行了,那vue3中是如何简单、便捷的封装并使用呢

2、思路:

vue3中使用axios并不难,封装,然后使用就这两步,痛点在于多了setup很难像vue2一样简单、便捷的使用

在网上查了一圈,有通过app.config.globalProperties、getCurrentInstance挂载使用的,有用vue-axios的,还有provide、inject依赖注入的

这些方式都比vue2多了一步,即先引入,再调用,那有没有更好的方法呢?有,且很简单

目前的vue3项目普遍安装了unplugin-auto-import这个库,这个库大家都很熟悉,就是自动import的,如果能够自动引入我们封装好的axios方法不是就很简单、便捷了吗

查看unplugin-auto-import文档,里面有//custom这么一种使用方式来引入

3、实现

先新建一个ajax.js来封装我们的axios

//ajax.js
import axios from 'axios'
import router from '@/router'

// 设置代理
const proxy = '/api'

// 设置token
const setToken = headers => {
    let token = localStorage.getItem('token')
    if (token) {
        headers.authorization = 'Bearer ' + token
    }
}

// 处理响应错误
const handleResponse = err => {
    console.log('handleResponse', err)
    let res = err.response
    let errArr = [401]
    if (errArr.includes(res.status)) {
        localStorage.removeItem('token')
        router.push('/')
    }
    if (res.data) {
        ElMessage.closeAll()
        ElMessage.error({
            showClose: true,
            message: res.data.msg,
        })
    }
    return Promise.reject(err)
}

// 处理请求数据
const handleData = res => {
    console.log('handleData', res)
    if (res.data) {
        if (res.data.code == 200) {
            return res.data.data
        }
        else if (res.data.code == 401) {
            localStorage.removeItem('token')
            router.push('/')
        }
        else {
            ElMessage.closeAll()
            ElMessage.error({
                showClose: true,
                message: res.data.msg,
            })
            return Promise.reject(res.data)
        }
    }
}

// 处理上传数据
const handleUpFileData = data => {
    if (data instanceof Blob) {
        let formData = new FormData()
        formData.append('file', data)
        return formData
    }
    if (data instanceof FormData) {
        return data
    }
    return null
}

// 处理下载文件
const handleDownFile = res => {
    let url = window.URL.createObjectURL(res.data)
    let fileName = /filename[^;=\n]*=((['"]).*?\2|[^;\n]*)/.exec(res.headers['content-disposition'])[1].replace(/['"]/g, '')
    let a = document.createElement('a')
    a.href = url
    a.download = fileName
    a.click()
    a.remove()
    window.URL.revokeObjectURL(url)
}

// 封装get
function get(url, params, headers = {}) {
    url = proxy + url
    setToken(headers)
    return axios.get(url, {
        params,
        headers,
    }).then(handleData, handleResponse)
}

// 封装post
function post(url, params, headers = {}) {
    url = proxy + url
    setToken(headers)
    return axios.post(url, params, { headers }).then(handleData, handleResponse)
}

// 封装上传文件
function upFile(url, params, headers = {}) {
    url = proxy + url
    setToken(headers)
    params = handleUpFileData(params)
    if (!params) return new Error('参数不正确')
    return axios.post(url, params, { headers }).then(handleData, handleResponse)
}

// 封装下载文件
function downFile(url, method, data, headers = {}) {
    url = proxy + url
    setToken(headers)
    if (method == 'get') return axios.get(url, {
        headers,
        responseType: 'blob',
    }).then(handleDownFile, handleResponse)
    if (method == 'post') return axios.post(url, data, {
        headers,
        responseType: 'blob',
    }).then(handleDownFile, handleResponse)

}
export default {
    get,
    post,
    upFile,
    downFile,
}

到vite.config.js设置使用unplugin-auto-import来自动引入

//vite.config.js
...
plugins: [
    ...
    AutoImport({
        imports: [
            'vue',
            'vue-router',
            { '.src/utils/ajax': [['default', 'ajax']] }//等同于import ajax from '.src/utils/ajax'
        ], 
        resolvers: [ElementPlusResolver(),],
    }), 
    ... 
] 
...
vue组件的setup中使用
<script setup >
let go = () => {
    ajax.get('/article/getArticle').then(res => {
        console.log(res)
    })
}
</script>

<template>
    <div @click="go">点击</div>
</template>

标签:axios,return,url,res,vue3,headers,使用,data
From: https://www.cnblogs.com/lovewhatIlove/p/17232427.html

相关文章

  • vue3使用tinymce
    第一种方法:通过使用key云端调用安装@tinymce/tinymce-vuenpmi@tinymce/tinymce-vue去官网注册一个账号获取key,然后去https://www.tiny.cloud/get-tiny/language-packages/下载语言包,放在目录下的public里在组件中使用,工具栏可以是字符串或者数组,一行字符串可以看做......
  • tinymce封装成vue3组件
    封装成组件<scriptsetup>importEditorfrom'@tinymce/tinymce-vue'//引入tinymce开启本地模式import'tinymce/tinymce'//引入图标和主题等import'tinymce/themes/silver/theme'import'tinymce/icons/default/icons'import'tin......
  • Vue3组件通信直接参考案例
    https://juejin.cn/post/6999687348120190983#heading-7Vue3通信使用写法1.props用props传数据给子组件有两种方法,如下方法一,setup()方法写法//Parent.vue传送<child:msg1="msg1":msg2="msg2"></child><script>importchildfrom"./child.v......
  • Nginx之数据流代理stream模块简介和使用
    转自 http://t.csdn.cn/RV4Hi一、stream模块简介  stream模块一般用于TCP/UDP数据流的代理和负载均衡,通过stream模块我们可以代理转发tcp报文。ngx_stream_core_module模块从1.9.0版开始提供。默认情况下,此模块不是构建的,应该使用–withstream配置参数启用它,即我们需要使用.......
  • 类的使用
    //运算符重载operator+()等#ifndefMYTIME_H_#defineMYTIME_H_classTime{public:Time();Time(inth,intm=0);voidAddMin(intm);voidAddHr(intn);voidReset(inth=0,intn=0);//如果想进行“+”的重载,只需要将sum换成operato......
  • 《花雕学AI》20:ChatGPT使用之体验评测AI EDU的网页版+桌面端+Android+App store组合
    最近准备出门,要去新疆哈密参加活动,一直在寻找手机上可用的AI移动端。昨天在网上偶然找到了AIEDU(这个不是MSRA创立的人工智能开源社区),其链接是:https://ai.aigcfun.com,今天就尝试做个相关体验与学习的记录。打开首页如下:  引言:人工智能聊天机器人ChatGPT是一种基于GPT-......
  • Redis:基本配置与使用?
    一、基于C语言,配置好c环境yuminstall-ygcctcl二、配置文件://监听的请求ip,默认为本地访问,修改为0000为任意访问bind0.0.0.0//设置程序为守护进程,即后台运行daemonizeyes//设置连接密码requirepasspassword//配置日志文件logfile"redis.log"//配置工作目......
  • 使用Python代码远程连接服务器
    目录一、paramiko模块的介绍二、基本使用(用户名密码登录)三、用公钥私钥连接一、paramiko模块的介绍模块介绍使用Python的第三方模块paramiko实现远程连接服务器功能:通过python代码连接服务器并执行相关操作并且支持用户名密码连接和公钥私钥连接模块安装pipinstall......
  • node中使用axios时:Error: unable to verify the first certificate 报错
    参考https://www.daozhao.com/10611.html报错原因:  在使用浏览器访问时,客户端、服务器在握手阶段完成验证。当我们在node中使用axios请求时,客户端没法确认服务端的TLS证书解决方案1、局部constaxios=require('axios')consthttps=require('https')//在axios......
  • k8s使用kubeadm 添加新的node节点
    1.关闭防火墙$systemctlstopfirewalld备注:必须关闭2.关闭selinux$setenforce03.关闭swap$swapoff-a临时关闭$free可以通过这个命令查看swap是否关闭了$vim/etc/fstab永久关闭#/dev/mapper/centos_k8s--master-swapswapswap......