首页 > 其他分享 >vue3+vite+js中二次封装axios

vue3+vite+js中二次封装axios

时间:2023-12-16 18:55:54浏览次数:43  
标签:axios const 请求 request js api vue3 data

一、安装axios

npm i axios

二、文件结构

涉及到的文件:

  1. utils/request.sj
  2. api/index.js(可以根据不同页面在api文件下新建不同文件夹,方便管理)
  3. vite.config.js

三、request.js

对axios进行简单的二次封装

import axios from "axios";

const request = axios.create({
  // 此处的 '/api' 和 vite.config.js 的配置相关联
  baseURL: "/api",
  timeout: 50000,
  requestOptions: {
    withToken: true,
  },
});

// 数据请求拦截
request.interceptors.request.use(
  // 1. 返回config对象
  // 2. 可以设置携带 token 信息
  (config) => {
    const token = window.localStorage.getItem("access_token");
    token &&
      config?.requestOptions?.withToken &&
      (config.headers.token = token);
    return config;
  },
  (err) => {
    return Promise.reject(err);
  }
);

// 返回响应数据拦截
request.interceptors.response.use(
  (response) => {
    //   console.log("request.js打印返回信息" , response);
    // 简化返回数据
    if (response.data.code == "200") {
      return Promise.resolve(response.data);
    }
  },
  // 错误执行
  (error) => {
    console.log("错误信息", error);
    if (error.response.status) {
      switch (error.response.status) {
        case 404:
          console.log("请求路径找不到!");
          break;
        case 500:
          console.log("服务器内部报错!");
          break;
        // 还可以自己添加其他状态码
        default:
          break;
      }
    }
    return Promise.reject(new Error(error.message));
  }
);

// 暴露对象
export default request;

 

 四、index,js

api 文件下的 index.js

import request from "@/utils/request.js";

const API = {
  //获取名言
  GET_SENTENCES: "/api/sentences",
  //发送验证码
  GET_YANZHENGMA: "/api/sendVerificationCode",
  //注册
  GET_ZHUCE:"/api/register",
  //获取个人信息
  GET_USERINFO:"/api/getUserInfo"
};

//获取名言
export const reqSentences = () => request.get(API.GET_SENTENCES);
//发送验证码
export const reqYanzhengma = (data) => request.post(API.GET_YANZHENGMA, data);
//注册
export const reqZhuce = (data) => request.post(API.GET_ZHUCE, data);
//获取个人信息
export const reqUserinfo = () => request.get(API.GET_USERINFO);

 

五、vite.config.js 配置

使用: 配置代理跨域及请求路径

server: {
    port: 8080, // 设置服务启动端口号
    open: true, // 设置服务启动时是否自动打开浏览器
    cors: true, // 允许跨域
    // 设置代理,根据我们项目实际情况配置
    proxy: {
      //第一访问地址
      '/api': { //apiTest是自行设置的请求前缀,按照这个来匹配请求,有这个字段的请求,就会进到代理来
        target: 'https://api.apiopen.top/', // 需要代理的域名
        changeOrigin: true, // 是否跨域
        rewrite: (path) => path.replace(/^\/api/, ""), //重写匹配的字段,如果不需要放在请求路径上,可以重写为""
      },
      //第二访问地址,以此类推可写多个
      '/api2': { //apiTest是自行设置的请求前缀,按照这个来匹配请求,有这个字段的请求,就会进到代理来
        target: 'http://localhost:8080', // 需要代理的域名
        changeOrigin: true, // 是否跨域
        rewrite: (path) => path.replace(/^\/api2/, ""), //重写匹配的字段,如果不需要放在请求路径上,可以重写为""
      }
    }
  }

 

路径重新定向

import { fileURLToPath, URL } from 'node:url'
resolve: {
    alias: {
      //路径重定向
      '@': fileURLToPath(new URL('./src', import.meta.url))
    }
  }

 

六、使用请求

<script setup>
import { onMounted, reactive, toRefs } from 'vue'
//引入请求方法
import { reqSentences, reqUserinfo } from "@/api";
const data = reactive({
  sentences: {}
})
//使用方法
const getuplist = async () => {
  await reqSentences().then((res) => {
    if (res.code == "200") {
      data.sentences = res.result
    } else {
      ElMessage.error("请求数据失败");
    }
  });

}
const getuserinfo = async () => {
  await reqUserinfo().then((res) => {
    if (res.code == "200") {
      console.log(res)
    } else {
      ElMessage.error("请求数据失败");
    }
  });

}
const { sentences } = toRefs(data)
onMounted(() => {
  getuplist()
  getuserinfo()
})
</script>

 

标签:axios,const,请求,request,js,api,vue3,data
From: https://www.cnblogs.com/cjw0217/p/17903561.html

相关文章

  • Nestjs的Provider 和依赖注入
    前言上文介绍了如何理解依赖注入和控制反转,简单来说,控制反转是一种设计模式,可以将类与类的关系解耦,将人工维护转移给一个容器维护。要实现控制反转,依赖注入是一个常用方案,将依赖注册到DI容器中,哪里用到,就让容器将实例注入到哪里。Nest中的依赖注入,主要就是围绕提供者(Provider)展......
  • Vue3响应式概念
    响应式的基本概念响应式是指当数据发生变化时,系统会自动更新与数据相关的DOM结构。在Vue2中,响应式系统的实现基于 Object.defineProperty。然而,Object.defineProperty 有一些局限,如:无法监听数组的变化、需要遍历对象的每个属性进行监听、性能开销较大。在Vue3中,响应式系统......
  • [JS] JS单例模式的实现
    JS单例模式的实现单例模式简介单例模式(SingletonPattern)是最简单的设计模式之一。这种类型的设计模式属于创建型模式,提供了一种创建对象的最佳方式。特点:意图:保证一个类仅有一个实例,并提供一个访问它的全局访问点。主要解决:一个全局使用的类频繁地创建与销毁。何时使用:当......
  • tsconfig.json文件配置
    tsconfig.json配置TypeScript使用tsconfig.json文件作为其配置文件,当一个目录中存在tsconfig.json文件,则认为该目录为TypeScript项目的根目录。基础字段files-设置要编译的文件的名称;['./src/main.tsx']include-设置需要进行编译的文件,支持路径模式匹配;['src']......
  • nodejs使用sequelize vscode报错:Type 'Model<any, any, any>' is not a constructor f
    我的模型定义如下:import{Model,DataTypes}from"sequelize";//定义资源模型classRuleextendsModel{}问题:vscdoe报错:Type'Model<any,any,any>'isnotaconstructorfunctiontype.解决:这个问题可能是由于TypeScript类型定义的问题导致的。Model 是Seq......
  • 【前端开发】Next.js VS Nest.js–Nest和Next之间的区别
    web开发框架起到支持作用,并提供了开发应用程序的有效方法。它具有不同的功能和特性,这使得开发过程更容易,开发人员总是能找到最快的编码方式。这就是为什么,无论是后端还是前端框架,大多数开发人员都喜欢使用它。一些框架通常具有非凡的功能,可以最大限度地减少代码,使应用程序开发更快......
  • Java: OpenWeatherMap json Deserialization of Java Objects
    openweathermap.json{"coord":{"lon":114.0683,"lat":22.5455},"weather":[{"id":803,"main":"Clouds","description":"多云",......
  • JS获取url参数 比如?id=
    复制下方代码,自定义一个公共js文件function getUrlKey (name) {    return decodeURIComponent((new RegExp('[?|&]' + name + '=' + '([^&;]+?)(&|#|;|$)').exec(location.href) || [, ''])[1].replace(/\+/g, '%20')) ||......
  • quickjs运行typescript?
    一、前言quickjs是标准的js引擎,不可能直接运行ts文件。所以需要对ts文件,进行编译,编译成符合当前版本的js脚本,然后在运行。二、简单ts例子安装typescript,就有tsc编译器。使用npm之类安装。使用tsc--init创建项目,此时会得到一个tsconfig.js配置文件。在src目录创建一......
  • html+js实现数字自动动态增长
    animationnumber函数的参数可以是数组也可以是单个字符串,但是必须是数组中的元素是数字类型HTML部分<div class="content-boxs">    <div class="row-price">        <div class="price-box">            <p id="totalPrice" data-value="......