首页 > 其他分享 >vue3 axios 封装

vue3 axios 封装

时间:2024-01-24 11:36:01浏览次数:33  
标签:axios const get url vue3 error import 封装

一、介绍

二、代码

三、问题

 

一、介绍

  Axios 是一个基于 promise 的 HTTP 库,可以用在浏览器和 node.js 中。

  这里介绍的是在vue3中怎么封装

二、代码

  1. 基本使用

  1.1 安装

npm install axios

  1.2 简单使用

  1.2.1 局部使用

import axios from 'axios'
const getData = async ()=>{
  const response = await axios.get('/get_data')
  console.log(response ); 
}

  1.2.2 全局注入

  在main.js 文件里写入

// 在main.js 文件里面
// 第一种方式 注入
import { createApp } from 'vue'
import App from './App.vue'
import axios from 'axios'

const app = createApp(App)
app.provide('$axios',axios)
app.mount('#app')


// 第二种方式 使用全局变量
import { createApp } from 'vue'
import App from './App.vue'
import axios from 'axios'

const app = createApp(App)
app.config.globalProperties.$axios = axios
app.mount('#app')

  在局部使用

// 第一中方式的局部引用
const axios = inject('$axios')
const response = await axios.get('/get_data')
console.log(response);

// 第二种方式的局部引用
import {getCurrentInstance} from "vue"
const {proxy} = getCurrentInstance()
const response = await proxy.$axios.get('/get_data')
console.log(response);

  2 封装

  2.1 单独创建一个api.js

import axios from 'axios'

import { useCookies } from "vue3-cookies";
import router from '@/router'


const { cookies } = useCookies();

axios.defaults.timeout = 50000;


// 请求拦截器
axios.interceptors.request.use(
  config => {
    // 每次发送请求之前判断是否存在token,如果存在,则统一在http请求的header都加上token,不用每次请求都手动添加了
    // 即使本地存在token,也有可能token是过期的,所以在响应拦截器中要对返回状态进行判断
    config.headers['X-CSRFToken'] = cookies.get("csrf_token")
    if(config.method.toUpperCase() === 'POST') {
      config.headers['Content-Type'] = 'application/json;charset=utf-8'
    }
    return config
  },
  error => {
    return Promise.error(error)
  })

// 返回拦截器
axios.interceptors.response.use(
    res => {
        const back_data = res.data
        if (back_data.code === 20000){
            router.push('/login')
        }
        return Promise.resolve(res);
    }, 
    error => {
        switch (error.response.status) {
        case 500:
            ElMessage.error('Oops,Server Error.')
            break
        case 404:
            ElMessage.error('Oops, Not Find!')
            break
        case 400:
            // ElMessage.error('Oops, 400!')
            break
        // 其他错误,直接抛出错误提示
        default:
            ElMessage.error(error.message)
        }
        return Promise.reject(error);
    }
);

function f_base_get (url, params) {
    return new Promise((resolve, reject) => {
        axios.get(url, params)
        .then(res => {
            resolve(res.data)
        })
        .catch(err => {
            reject(err)
        })
    })
}

function f_base_post(url, params){
    return new Promise((resolve, reject) => {
      axios.post(url, params)
        .then(res => {
          resolve(res.data)
        })
        .catch(err => {
          reject(err)
        })
    })
}

//  将Promise 的错误统一捕获
export async function post (url, params) {
    let back = null
    try{
        back = await f_base_post(url, params)
    }catch(e){
        if (e.response.data === 'The CSRF token is missing.'){
            console.log('CSRF token miss, try again')
            back = await post(url, params)
        }
        console.log('async post', e)
    }
    return back
}

export async function get(url, params) {
    let back = null
    try{
        back = await f_base_get(url, params)
    }catch(e){
        console.log('async get', e)
    }
    return back
}

  2.2 单独创建一个 url.js

import {get, post} from './api'

export const apiCodeImg = p => get('/api/auth/graphicCode', p)

  2.3 在页面里调用

import { apiCodeImg } from '@/api/urls.js'

const get_img_code = async () => {
    const res = await apiCodeImg()
    imgBase64.value = res.data.img
}
get_img_code()

  3.补充

  这样的封装,将 axios 封装在一个文件里,可以在api.js 文件里 处理请求时带上token, csrf等参数, 还可以检查登录状态跳转登录, 还有错误捕获等,都可以统一在这里处理。

  再新建一个 url.js 这样可以统一管理与后端接口的地址,降低耦合度。

  再局部页面,进行专一接口调用,更清楚,代码更加简洁。

 

三、问题

标签:axios,const,get,url,vue3,error,import,封装
From: https://www.cnblogs.com/nobody-/p/17984289

相关文章

  • UniApp Vue3 动态表单
    左侧手机部分为动态表单内容,右侧为提交后获取到表单的值。页面代码:<viewstyle="margin:15px;padding:10rpx;"><tn-formlabel-position="top"ref="formRef":model="formData":rules="formRules"><tn-for......
  • npm ERR! request to https://registry.npm.taobao.org/axios failed, reason: certif
    前言一直使用npmbuild没问题的,突然出现报错:npmWARNinstallUsageofthe`--dev`optionisdeprecated.Use`--only=dev`instead.npmERR!codeCERT_HAS_EXPIREDnpmERR!errnoCERT_HAS_EXPIREDnpmERR!requesttohttps://registry.npm.taobao.org/axiosfailed,......
  • 前台分类-组件封装
      准备工作准备组件,只有首页使用导入并使用组件(手动)设置首页底色为 #F7F7F7静态结构前台类目布局为独立的组件 CategoryPanel属于首页的业务组件,存放到首页的 components 目录中。<scriptsetuplang="ts">//</script><template><viewclass="category">......
  • 请求函数封装promise请求函数
    借鉴aioxs请求函数-》返回promise对象请求分为:成功 失败 进行完一系列操作后在微信开发者平台测试的时候,如果有数据更新一定要重新编译刷新一下,代码:/*请求函数@paramUniApp.Requestoptions@returnsPromise1.返回Promise对象2.请求成功2.1提取核心数据res.data......
  • vue3中Fragment特性的一个bug,需要留意的注意事项
    vue3中的Fragment模版碎片特性是什么,简单的理解就是template模板代码不在像vue2中那样必须在根节点在包裹一层节点了。vue2写法<template><div><h1>标题</h1><p>正文内容</p></div></template>vue3写法<template><h1>标题</h1>......
  • 封装验证码简单示例
    1publicclassAuthCode{2/**3*封装验证码4*/5publicstaticStringcreateCode(intn){6Stringchars="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";7Stringcode="";8......
  • Vue3与Vue2的深度对比:你不可不知的差异!
    Vue3框架的优点特点首次渲染更快diff算法更快内存占用更少打包体积更小更好的Typescript支持CompositionAPI 组合API一、生命周期对于生命周期来说,整体上变化不大,只是大部分生命周期钩子名称上+“on”,功能上是类似的。不过有一点需要注意,Vue3在组合式API(CompositionAPI,下......
  • VUE框架MVVM架构思想解析与实现封装dom对象------VUE框架
    <!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metaname="viewport"content="width=device-width,initial-scale=1.0"><title>Document</title>......
  • vue3
    Vue31新建项目1.1vue-cli创建vue-V查看vue版本,必须高于4.5.0启动测试cdvue3_testnpmrunserve运行成功1.2vite创建命令1.3分析工程结构main.js//引入的不再是Vue构造函数了,引入的是一个名为createApp的工厂函数import{createApp}from'vue'......
  • 自动化复习巩固第五天封装数据库及断言方法
     方法1:处理数据库方法说明:数据库配置文件,主要存放数据库连接信息settings.py文件mysql_info={  "host":"xxxxx",  "user":"xxxxx",  "password":"xxxxx",  "port":3306,  "charset":"utf8mb4&......