vue3+vite+axios+ElementPlus+ElLoading简易封装

1.安装按需加载element-plus需要的依赖包

sh 复制代码
pnpm install element-plus
sh 复制代码
pnpm install axios
sh 复制代码
# 按需自动导入
pnpm install -D unplugin-vue-components unplugin-auto-import
sh 复制代码
# 自动导入element-plus样式
pnpm install -D vite-plugin-style-import

2.修改jsconfig.json

json 复制代码
{
  "compilerOptions": {
    "paths": {
      "@/*": ["./src/*"]
    },
    "types": ["element-plus/global"] // 增加element-plus组件标签代码提示
  },
  "exclude": ["node_modules", "dist"]
}

3.修改vite.config.js

js 复制代码
import { fileURLToPath, URL } from "node:url";
import { defineConfig } from "vite";
import vue from "@vitejs/plugin-vue";
import AutoImport from "unplugin-auto-import/vite";
import Components from "unplugin-vue-components/vite";
import { ElementPlusResolver } from "unplugin-vue-components/resolvers";
import {
  createStyleImportPlugin,
  ElementPlusResolve,
} from "vite-plugin-style-import";

export default defineConfig({
  plugins: [
    vue(), // element-plus组件自动引入
    AutoImport({
      resolvers: [ElementPlusResolver()],
    }),
    Components({
      resolvers: [ElementPlusResolver()],
    }),
    // element-plus反馈组件样式自动引入
    createStyleImportPlugin({
      resolves: [ElementPlusResolve()],
      libs: [
        {
          libraryName: "element-plus",
          esModule: true,
          resolveStyle: (name) => {
            return `element-plus/theme-chalk/${name}.css`;
          },
        },
      ],
    }),
  ],
  // 加了这个配置后, 可以在任意组件中访问到scss全局变量
  css: {
    preprocessorOptions: {
      scss: {
        javascriptEnabled: true,
        additionalData: '@import "./src/assets/css/variable.scss";',
      },
    },
  },

  resolve: {
    alias: {
      "@": fileURLToPath(new URL("./src", import.meta.url)),
    },
  },
});

4.axios二次封装

js 复制代码
// /src/utils/request.js  - 对axios的简易封装
import axios from "axios";
import { ElLoading } from "element-plus";
import { getItem } from "@/utils/storage";
// 默认loading为false
const DEFAULT_LOADING = false;

// 保证当一个页面中有多个请求时, loading只显示一次
let loadingCount = 0;
let loadingInstrance = null;

function startLoading() {
  if (loadingCount === 0) {
    loadingInstrance = ElLoading.service({
      lock: true,
      text: "正在加载...",
      background: "rgba(0, 0, 0, 0.5)",
    });
  }
  loadingCount++;
}

function endLoading() {
  if (loadingCount > 0) {
    loadingCount--;
    if (loadingCount === 0) {
      loadingInstrance.close();
    }
  }
}

const request = axios.create({
  baseURL: import.meta.env.VITE_BASE_URL,
  timeout: 10000,
});

request.interceptors.request.use(
  (config) => {
    const token = getItem("token");
    if (token) {
      config.headers.Authorization = `Bearer ${token}`;
    }

    config.showLoading = config.showLoading ?? DEFAULT_LOADING;

    config.showLoading && startLoading();

    return config;
  },
  (error) => {
    return Promise.reject(error);
  }
);

request.interceptors.response.use(
  (res) => {
    res.config.showLoading && endLoading();
    return res.data;
  },
  (error) => {
    error.config.showLoading && endLoading();
    return Promise.reject(error);
  }
);

export default request;

5.api的封装

js 复制代码
// src/apis/index.js
import request from "@/utils/request";

export function getMessage() {
  return request({
    url: "https://api.uomg.com/api/rand.qinghua",
    showLoading: true, // showLoading为true时, 该接口就会出现加载中动画
  });
}

6.api的使用

html 复制代码
<!-- App.vue -->
<template>
  <h2>{{ message }}</h2>
  <el-button @click="handleGetMessage"> 获取消息 </el-button>
</template>

<script setup>
import { ref } from "vue";
import { getMessage } from "@/apis";
const message = ref("");
const handleGetMessage = async () => {
  const res = await getMessage();
  message.value = res.content;
};
handleGetMessage();
</script>


相关推荐
景天科技苑2 分钟前
【vue3+vite】新一代vue脚手架工具vite,助力前端开发更快捷更高效
前端·javascript·vue.js·vite·vue项目·脚手架工具
小行星12513 分钟前
前端预览pdf文件流
前端·javascript·vue.js
join814 分钟前
解决vue-pdf的签章不显示问题
javascript·vue.js·pdf
小行星12520 分钟前
前端把dom页面转为pdf文件下载和弹窗预览
前端·javascript·vue.js·pdf
Lysun00129 分钟前
[less] Operation on an invalid type
前端·vue·less·sass·scss
J总裁的小芒果44 分钟前
Vue3 el-table 默认选中 传入的数组
前端·javascript·elementui·typescript
Lei_zhen961 小时前
记录一次electron-builder报错ENOENT: no such file or directory, rename xxxx的问题
前端·javascript·electron
咖喱鱼蛋1 小时前
Electron一些概念理解
前端·javascript·electron
yqcoder1 小时前
Vue3 + Vite + Electron + TS 项目构建
前端·javascript·vue.js
鑫宝Code1 小时前
【React】React Router:深入理解前端路由的工作原理
前端·react.js·前端框架