Vue3 Element Plus 对话框加载实现

在 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>

两种方式对比:

  1. v-loading 指令

    • 更简单直接

    • 内置加载动画和样式

    • 自动处理 DOM 容器

  2. ElLoading 服务

    • 更灵活,可以自定义加载文本和背景

    • 需要手动管理加载实例

    • 需要指定具体加载容器

优化建议:

  • 在 finally 块中关闭加载状态,确保异常情况下也能关闭加载

  • 可以为加载状态添加文字提示:v-loading="isLoading" element-loading-text="正在拼命加载..."

  • 如果内容高度不确定,建议设置最小高度避免布局抖动

  • 对于表单场景,可以在提交时使用类似方法防止重复提交

### 动态获取 Vue3 Element Plus Dialog 组件高度的方法Vue3Element Plus 中,可以通过 `ref` 来访问 DOM 节点并动态计算对话框的高度。以下是实现方法的具体说明: #### 使用 ref 获取 DOM 节点 通过给 `<el-dialog>` 添加 `ref` 属性,可以引用该组件实例或其根节点。随后利用原生 JavaScript 方法(如 `getBoundingClientRect()` 或 `offsetHeight`),即可获得当前对话框的实际高度。 ```javascript <template> <el-dialog ref="dialogRef" title="示例对话框" :visible="true"> <!-- 对话框内容 --> </el-dialog> </template> <script setup> import { onMounted, ref } from &#39;vue&#39;; const dialogRef = ref(null); onMounted(() => { if (dialogRef.value) { const dialogElement = dialogRef.value.$el; console.log(&#39;Dialog 高度:&#39;, dialogElement.offsetHeight); // 输出高度 } }); </script> ``` 上述代码展示了如何通过 `ref` 访问 `<el-dialog>` 的 DOM 元素,并调用 `offsetHeight` 获取其高度[^1]。 --- #### 处理异步加载场景下的高度变化 如果对话框的内容是异步加载的,则可能需要监听数据更新后的回调函数来重新测量高度。例如,在表格数据加载完成后触发一次高度检测。 ```javascript watch(dataList, () => { nextTick(() => { if (dialogRef.value) { const dialogElement = dialogRef.value.$el; console.log(&#39;更新后 Dialog 高度:&#39;, dialogElement.offsetHeight); } }); }, { deep: true }); ``` 这里使用了 Vue 的响应式特性以及 `nextTick` 确保 DOM 已经完成重绘后再执行高度测量操作[^3]。 --- #### 自定义封装组件中的应用 当封装一个通用的弹出窗口组件时,可以在父级传入特定事件处理逻辑或者暴露 API 接口供外部调用。以下是一个简单的封装例子: ```javascript <template> <el-dialog ref="customDialog" v-bind="$attrs" @open="onOpen" @closed="onClosed" > <slot></slot> </el-dialog> </template> <script setup> import { ref, defineEmits, onMounted } from &#39;vue&#39;; defineProps({ visible: Boolean, }); const emits = defineEmits([&#39;update:height&#39;]); const customDialog = ref(null); function getHeight() { if (customDialog.value) { const height = customDialog.value.$el.offsetHeight; emits(&#39;update:height&#39;, height); // 向外传递高度 } } function onOpen() { setTimeout(getHeight, 0); // 确保动画结束后再获取高度 } function onClosed() { getHeight(); } </script> ``` 此封装允许子组件主动通知父组件关于对话框高度的变化情况[^2]。 --- ### 总结 为了动态获取 Vue3 Element Plus 中 `<el-dialog>` 的高度,推荐的方式包括但不限于: - 利用 `ref` 结合 `$el` 属性直接读取 DOM 元素尺寸; - 在异步加载情况下配合 `nextTick` 更新高度; - 如果涉及复杂业务需求,可进一步抽象成独立组件提供灵活接口支持。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值