项目集成element-plus和axios

Posted 忘忘碎斌bin

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了项目集成element-plus和axios相关的知识,希望对你有一定的参考价值。

注:在写对应的文件时,省略了其他库的与演示内容不相关的代码,为的是代码片段简洁点儿。

element-plus的集成

安装:npm install element-plus

全局引入

// 其余代码省略 .......
import ElementPlus from "element-plus";
import "element-plus/lib/theme-chalk/index.css";
// 其余代码省略 .......
app.use(ElementPlus);

局部引入

在组件内部:引入需要的组件,引入对应的样式和基础样式,然后注册组件。一般基础样式在全局引入
main.ts中

import "element-plus/lib/theme-chalk/base.css";

组件内

<script lang="ts">
import { defineComponent } from "vue";
import { ElButton } from "element-plus";
import "element-plus/lib/theme-chalk/el-button.css";
export default defineComponent({
  name: "App"
  components: {
    ElButton
  }
});
</script>

局部引用的封装

新建src/global/index.ts文件,index.ts文件用于注册全局的一些第三方库

src/global/registerElement.ts用于注册需要用到的element组件

src/global/registerElement.ts

import { App } from "vue";

import { ElButton } from "element-plus";
import "element-plus/lib/theme-chalk/base.css";

const components = [ElButton];
export default function (app: App): void {
  for (const cpn of components) {
    app.component(cpn.name, cpn);
  }
}

引入不同的组件,还需要引入对应的样式,交给babel来完成

安装:npm install babel-plugin-import -D

babel.config.js配置:

module.exports = {
  plugins: [
    [
      "import",
      {
        libraryName: "element-plus",
        customStyleName: (name) => {
          return `element-plus/lib/theme-chalk/${name}.css`;
        }
      }
    ]
  ],
  presets: ["@vue/cli-plugin-babel/preset"]
};

src/global/index.ts

import { App } from "vue";

import registerElement from "./registerElement";

export default function (app: App): void {
  // 三种注册方式都可以
  // registerElement(app);
  // app.use({
  //	install: registerElement
  // })
  app.use(registerElement);
}

main.ts

import register from "./global";
// 其余代码省略 ......
app.use(register);

以后需要用到element的某个组件就到registerElement.ts内添加就可以了。

axios的集成

安装npm install axios

使用类来封装axios

  • 结合element-plus的Loading页面
  • 三层拦截器根据需要自行引入
    type.ts文件
import { AxiosRequestConfig, AxiosResponse } from "axios";

export interface MsiInterceptors<T> {
  requestInterceptor?: (config: AxiosRequestConfig) => AxiosRequestConfig;
  requestInterceptorCatch?: (error: any) => any;
  responseInterceptor?: (result: T) => T;
  responseInterceptorCatch?: (error: any) => any;
}

export interface MsiRequestConfig<T = AxiosResponse>
  extends AxiosRequestConfig {
  interceptors?: MsiInterceptors<T>;
  isShowLoading?: boolean;
}

index.ts文件

import axios from "axios";
import type { AxiosInstance } from "axios";

import { ElLoading } from "element-plus";

import { MsiRequestConfig } from "./type";
import { ILoadingInstance } from "element-plus/lib/el-loading/src/loading.type";

const SHOW_LOADING = true;

class MsiRequest {
  instance: AxiosInstance;
  elLoading?: ILoadingInstance;
  isShowLoading: boolean = SHOW_LOADING;
  constructor(config: MsiRequestConfig) {
    this.instance = axios.create(config);
    this.isShowLoading = config.isShowLoading ?? SHOW_LOADING;
    // 实例拦截器
    this.instance.interceptors.request.use(
      config.interceptors?.requestInterceptor,
      config.interceptors?.requestInterceptorCatch
    );
    this.instance.interceptors.response.use(
      config.interceptors?.responseInterceptor,
      config.interceptors?.responseInterceptorCatch
    );
    // 全局拦截器
    this.instance.interceptors.request.use(
      (config) => {
        console.log("全局拦截器请求成功~");
        if (this.isShowLoading === true) {
          this.elLoading = ElLoading.service({
            text: "正在加载中,请稍后....",
            background: "rgba(0,0,0,.6)"
          });
        }

        return config;
      },
      (error) => {
        console.log("全局拦截器请求失败~");
        return error;
      }
    );
    this.instance.interceptors.response.use(
      (result) => {
        console.log("全局拦截器响应成功~");
        this.elLoading?.close();
        return result.data;
      },
      (error) => {
        console.log("全局拦截器响应失败~");
        return error;
      }
    );
  }

  request<T>(config: MsiRequestConfig<T>): Promise<T> {
    if (config.interceptors?.requestInterceptor) {
      this.isShowLoading = config.isShowLoading ?? SHOW_LOADING;
      config = config.interceptors.requestInterceptor(config);
    }

    return this.instance
      .request<any, T>(config)
      .then((res) => {
        if (config.interceptors?.responseInterceptor) {
          res = config.interceptors.responseInterceptor(res);
        }
        this.isShowLoading = SHOW_LOADING;
        return res;
      })
      .catch((err) => {
        this.isShowLoading = SHOW_LOADING;
        return err;
      });
  }
}

export default MsiRequest;


以上是关于项目集成element-plus和axios的主要内容,如果未能解决你的问题,请参考以下文章

后台管理系统目录

vue3+element-plus配置cdn

vue 项目搭建规范

vue3 + typescript + axios封装(附带loading效果,...并携带跨域处理,...element-plus按需引入)

vuepress 2.x 集成 element-plus

vue3项目源码汇集