vue3+element-plus 如何实现全局配置ElLoading默认值

项目场景:

公司项目中使用element-plus的loading效果时想更改默认的loading图标


问题描述

遗憾的是el-config-provider没有对应的全局配置属性,无法通过全局配置简单实现。


解决方案:

第一时间想到用覆盖样式的方式解决,但思考之后觉得不是很完美,于是研究了第二套方案,废话不多说,直接上代码。

方案一:

大致就是将图中svg标签隐藏掉,给el-loading-spinner类添加before或after,再结合自定义的样式和动画实现loading效果。

方案二:

通过重写ElLoading的方式实现,具体如下:

1、在plugins文件夹下新建wrapElLoading.ts文件

wrapElLoading.ts

import {ElLoading} from "element-plus";

/**
 * @description 扩展ElLoading,传入默认值
 */
export default {
    install(app: any) {
        const svg: string = `<path d="M21.38,4.58a4.62,4.62,0,0,0,9.24,0h0a4.62,4.62,0,0,0-9.24,0Z" fill="#9ab1c9"/><path d="M6.33,10.39a3.75,3.75,0,0,0,7.49,0h0a3.75,3.75,0,0,0-7.49,0Z" fill="#9ab1c9"/><path d="M0,25.86a3.43,3.43,0,0,0,6.86,0h0a3.41,3.41,0,0,0-3.43-3.4A3.41,3.41,0,0,0,0,25.85Z" fill="#9ab1c9"/><path d="M6.88,41.66a3.2,3.2,0,1,0,3.2-3.17A3.18,3.18,0,0,0,6.88,41.66Z" fill="#9ab1c9"/><path d="M23.32,47.35a2.68,2.68,0,0,0,5.36,0h0a2.68,2.68,0,0,0-5.36,0Z" fill="#9ab1c9"/><path d="M39.68,41.66a2.14,2.14,0,0,0,4.28,0h0a2.14,2.14,0,0,0-4.28,0Z" fill="#9ab1c9"/><path d="M46.85,26A1.58,1.58,0,0,0,50,26h0a1.58,1.58,0,0,0-3.15,0Z" fill="#9ab1c9"/><path d="M40.77,10.2a1.12,1.12,0,1,0,1.12-1.11A1.12,1.12,0,0,0,40.77,10.2Z" fill="#9ab1c9"/>`;
        const loadingDir: any = ElLoading.directive
        const originDirMounted = loadingDir.mounted;
        loadingDir.mounted = function (el: any, binding: any, vnode: any, prevVnode: any) {
            // 需要覆盖哪些默认属性值在这里设置,具体属性名参考官网loading指令用法
            el.setAttribute('element-loading-svg', svg)
            originDirMounted.call(this, el, binding, vnode, prevVnode)
        }
        const originService = ElLoading.service;
        ElLoading.service = function (options: any = {}) {
            return originService.call(this, Object.assign({ svg}, options))
        }
        app.config.globalProperties.$loading = ElLoading.service;
        // 如果在main.ts中全局使用了ElementPlus —> app.use(ElementPlus),则下面这行代码不需要
        // app.use(ElLoading);
    }
}

2、在main.ts中use即可

import WrapElLoading from "@/plugins/wrapElLoading";

// 若项目采用全局引入ElementPlus,则须在app.use(ElementPlus)后执行
app.use(WrapElLoading);

3、在组件中使用:

<template>
  <div class="about">
    <el-button @click="showLoading">show loading</el-button>
    <el-button @click="manualLoading">manual loading</el-button>

    <div v-loading="loading" element-loading-text="加载中……" class="loading-wrap"></div>
    <div ref="manualLoadingRef" class="loading-wrap"></div>

  </div>
</template>

<script setup lang="ts">
import {getCurrentInstance, ref} from "vue";

const ctx: any = getCurrentInstance()?.appContext.config.globalProperties

const loading = ref(false);
const manualLoadingRef = ref();

function showLoading() {
  loading.value = !loading.value
}

function manualLoading() {
  const loadingIns = ctx.$loading({target: manualLoadingRef.value})
  setTimeout(() => {
    loadingIns.close()
  }, 2000)
}

</script>

<style lang="scss" scoped>
.about {
  border: 1px solid #42b983;
  height: 100%;
  padding: 60px;

  .loading-wrap {
    width: 200px;
    height: 200px;
    border: 1px solid #ccc;
  }
}

</style>

Vue3 Element Plus 中的黑白主题切换通常通过CSS变量(CSS Custom Properties)和响应式系统来实现Element Plus 提供了一个全局的主题管理模块,它定义了一组基础的颜色变量,包括前景色、背景色等。当用户选择黑白模式时,会改变这些变量的值,如将前景色设为白色,背景色设为黑色。 具体步骤如下: 1. **创建主题变量**:在 `element-plus/packages/theme-chalk/src/index.js` 或类似文件中,定义了初始的主题颜色和其他样式属性,并设置默认值,比如 `$primary-color` 对应默认主题的颜色。 ```javascript // 示例 export const color = { primary: &#39;#142338&#39;, secondary: &#39;#495A64&#39;, success: &#39;#67C23A&#39;, warning: &#39;#E0A933&#39;, danger: &#39;#ED5565&#39;, info: &#39;#3F51B5&#39;, text: &#39;#485763&#39;, // 黑白模式下的颜色 darkText: &#39;#fff&#39;, darkBackground: &#39;#000&#39;, }; ``` 2. **监听状态变化**:Vue组件中,通过 Vue 的 `watch` 或者更推荐的 `setup` 函数中的 `useEffect` 来监听主题状态的变化。例如,当状态变为 "dark" 时,更新主题相关的CSS变量。 ```javascript import { useTheme } from &#39;element-plus&#39;; setup() { const { toggleDarkMode, isDarkMode } = useTheme(); useEffect(() => { toggleDarkMode(); // 当切换到黑暗模式时,更新CSS变量 document.documentElement.style.setProperty(&#39;--color-primary&#39;, color.darkText); document.documentElement.style.setProperty(&#39;--color-background&#39;, color.darkBackground); }, [toggleDarkMode, color]); } ``` 3. **UI组件响应**:元素 UI 组件会检测并应用这些CSS变量,使得文本、边框、背景等视觉效果相应地改变,达到黑白切换的效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值