Element Plus组件v-loading在el-dialog组件上使用无效

目录

前情

坑位

Why?

解决方案1

解决方案2

解决方案3


前情


公司有经常需要做一些后台管理页面,我们选择了Element Plus,它是基于 Vue 3,面向设计师和开发者的组件库,是Vue框架生态中比较火的UI组件库,组件库丰富易用,组件链接:一个 Vue 3 UI 框架 | Element Plus,对于请求服务数据交互提供一个loading加载中效果是一个提高用户体验的好方法。

坑位


最近在开发一个需求,点击操作按钮根据传入的id获取相应数据渲染el-dialog组件内容,我于是按正常方式使用v-loading指令实现加载中loading效果,但事与愿违,v-loading失效了......

Why?


个人猜测是Element Plus组件库的v-loading指令不支持el-dialog组件上使用

解决方案1

加一个全局loading,Element Plus组件库不但可以通过v-loading指令实现,也支持以服务的形式实现,关键代码如下:

复制代码
import { ElLoading } from "element-plus";

const loading = ElLoading.service({
  lock: true,
  text: "数据加载中...",
  background: "rgba(255, 255, 255, 0.6)"
});
  
setTimeout(() => {
	loading.close();
}, 1500);

解决方案2

既然el-dialog不支持v-loading指定,我们可以把loading效果加在弹窗组件的内容容器里,关键代码如下:

复制代码
<template>
  <el-button plain @click="dialogVisible = true">
    Click to open the Dialog
  </el-button>

  <el-dialog
    v-model="dialogVisible"
    title="Tips"
    width="500"
    append-to-body
  >
    <template #header>
      <div class="font-size-20 font-bold">弹窗标题</div>
    </template>
    <div  v-loading="true"  class="main-content">
    </div>
    <template #footer>
      <div class="flex justify-end gap-2">
        <el-button @click="dialogVisible = false">取消</el-button>

      </div>
    </template>
  </el-dialog>
</template>

<script lang="ts" setup>
import { ref } from 'vue'


const dialogVisible = ref(false)


</script>

解决方案3

Element Plus组件库支持以服务的方式来实现loading效果,细看文挡当以服务的方式实现loading效果的时候,你会发现它还支持loading效果要插入的容器组件,于是有了下面的解决方法,el-dialog组件通过custom-class添加自定义class,再把loading组件插入自定义的class容器中,关键代码如下:

WARNING

custom-class 已被 弃用 , 之后将会在 2.4.0 移除 , 请使用 class.

注意版本

复制代码
<template>
  <el-button plain @click="dialogVisible = true">
    Click to open the Dialog
  </el-button>

  <el-dialog
    v-model="dialogVisible"
    title="Tips"
    width="500"
    class="dialog"
    @open="handleOpen"
  >
    <template #header>
      <div class="font-size-20 font-bold">弹窗标题</div>
    </template>
    <div  class="main-content">
    </div>
    <template #footer>
      <div class="flex justify-end gap-2">
        <el-button @click="dialogVisible = false">取消</el-button>

      </div>
    </template>
  </el-dialog>
</template>

<script lang="ts" setup>
import { ref } from 'vue'


const dialogVisible = ref(false)

	import { ElLoading } from "element-plus";

const handleOpen = () => {
	const loading = ElLoading.service({
	  lock: true,
	  text: "数据加载中...",
	  fullscreen: false,
	  target: '.dialog',
	  background: "rgba(255, 255, 255, 0.6)"
	});
	  
	setTimeout(() => {
		loading.close();
	}, 1500);
}
</script>
相关推荐
liangshanbo121518 分钟前
前端高级面试题:WebSocket 双向流式通信怎么设计?
前端·websocket·网络协议
可乐鸡翅yeah_26 分钟前
新手梳理:HLS 线上问题,哪些该提给 CDN,哪些该找后端切片服务
开发语言·前端·javascript·vue.js·网络协议·http·m3u8在线
zwd200527 分钟前
Manim arrange 和 arrange_in_grid 用法详解:buff、aligned_edge、rows/cols(0.21.0 实测)
前端·python·edge
Q264336502330 分钟前
【有源码】基于SpringBoot+Vue的博物馆展览与服务一体化平台-java博物馆数字化展品展示与交互平台设计
java·vue.js·spring boot·spring·毕业设计·javaweb·课程设计
小小龙学IT37 分钟前
Go 语言 reflect 反射包深度解析:从 Type/Value 到三大定律与工业实践
前端·golang
小溪学编程1 小时前
C语言篇:枚举类型
java·c语言·前端
xingpanvip1 小时前
星盘接口开发文档:推算星座接口指南
前端·php
Da Da 泓1 小时前
HTML浅浅入门
前端·html
এ慕ོ冬℘゜1 小时前
es6基础
前端·javascript·es6
熊猫钓鱼>_>1 小时前
从2D平铺到3D沉浸:我用HarmonyOS 7端侧AI做了一个全程数据不出设备的空间化私密相册
前端·人工智能·3d·华为·华为云·harmonyos·鸿蒙