在 Vue3 + Element Plus 中实现对话框加载效果,可以通过以下两种方式实现:
方式一:使用 v-loading 指令(推荐)
vue
复制
下载
<template> <el-button @click="openDialog">打开对话框</el-button> <el-dialog v-model="dialogVisible" title="加载中对话框" @open="handleOpen" > <!-- 使用 v-loading 指令 --> <div v-loading="isLoading" style="min-height: 150px"> <div v-if="!isLoading"> <!-- 你的实际内容 --> 加载完成的内容... </div> </div> </el-dialog> </template> <script setup> import { ref } from 'vue'; const dialogVisible = ref(false); const isLoading = ref(false); const openDialog = () => { dialogVisible.value = true; }; const handleOpen = async () => { isLoading.value = true; try { // 模拟异步请求 await new Promise(resolve => setTimeout(resolve, 2000)); // 这里可以放置你的真实请求 } finally { isLoading.value = false; } }; </script>
方式二:使用 ElLoading 服务(局部加载)
vue
复制
下载
<template> <el-button @click="openDialog">打开对话框</el-button> <el-dialog v-model="dialogVisible" title="加载中对话框" @open="handleOpen" > <div ref="dialogContent" style="min-height: 150px"> <!-- 你的实际内容 --> <div v-if="data"> {{ data }} </div> </div> </el-dialog> </template> <script setup> import { ref } from 'vue'; import { ElLoading } from 'element-plus'; const dialogVisible = ref(false); const dialogContent = ref(null); const data = ref(null); const openDialog = () => { dialogVisible.value = true; }; const handleOpen = async () => { // 创建加载实例 const loadingInstance = ElLoading.service({ target: dialogContent.value, text: '拼命加载中...', background: 'rgba(255, 255, 255, 0.5)' }); try { // 模拟异步请求 await new Promise(resolve => setTimeout(resolve, 2000)); data.value = '加载完成的内容...'; } finally { // 关闭加载 loadingInstance.close(); } }; </script>
两种方式对比:
v-loading 指令:
更简单直接
内置加载动画和样式
自动处理 DOM 容器
ElLoading 服务:
更灵活,可以自定义加载文本和背景
需要手动管理加载实例
需要指定具体加载容器
优化建议:
在 finally 块中关闭加载状态,确保异常情况下也能关闭加载
可以为加载状态添加文字提示:
v-loading="isLoading" element-loading-text="正在拼命加载..."
如果内容高度不确定,建议设置最小高度避免布局抖动
对于表单场景,可以在提交时使用类似方法防止重复提交