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>


相关推荐
kinlon.liu37 分钟前
Web应用安全实用建议
前端·网络·网络协议·安全·centos
narukeu41 分钟前
理解 React 的严格模式
前端·javascript·react.js
Bee.Bee.43 分钟前
移动端如何调试本地运行的前端项目
前端
Tech Synapse1 小时前
java 如何暴露header给前端
java·开发语言·前端
卓卓没头发1 小时前
掌握Vue插槽:创建灵活且可复用的组件
前端·javascript·vue.js
白臻1 小时前
小程序 npm 支持
前端·小程序·npm
lyllovelemon1 小时前
🍭🍭🍭五分钟带你掌握next国际化最佳实践
前端·react.js·面试
用户4099322502122 小时前
Nuxt框架中内置组件详解及使用指南(三)
前端·vue.js·nuxt.js
化作繁星2 小时前
vue3项目图片压缩+rem+自动重启等plugin使用与打包配置
前端·vue·vite
u0104058363 小时前
构建可扩展的Java Web应用架构
java·前端·架构