Vue 和 Element Plus 弹框组件详解:从基本实现到异步数据加载与自定义内容(实战)

news2024/9/22 19:22:22

目录

  • 前言
  • 1. 基本知识
  • 2. 模版
  • 3. 实战

前言

主要是通过一个按钮触发一个按钮框,多种方式的逻辑,多种场景

原先通过实战总结,基本的知识推荐阅读:

  1. 详细分析Element Plus中的ElMessageBox弹窗用法(附Demo及模版)
  2. 详细分析Element中的MessageBox基本知识(附Demo)
  3. Vue按照顺序实现多级弹窗(附Demo)
  4. Vue以弹窗形式实现导入功能
  5. 使用 Vue 实现包含单选框的弹窗功能(附Demo)
  6. 点击按钮框来选择相应信息(Vue + Java)

此处整体文章偏向vue3的语法, 对于vu2大同小异,注意语法差异即可

1. 基本知识

展示弹框内容并控制其显示是 Vue 和 Element Plus 中常见的需求

弹框组件 (el-dialog):
el-dialog 是 Element Plus 提供的对话框组件,用于弹出层展示信息
使用 v-model 或 v-model:visible 来控制对话框的显示和隐藏
可以通过插槽自定义对话框的内容和底部按钮

Vue 组件通信:
Props:父组件向子组件传递数据
Emits:子组件向父组件传递事件或数据
v-model:用于双向绑定数据

方法:

使用异步方法(async/await)获取数据
更新组件状态(如弹框的显示状态)以展示或隐藏内容

2. 模版

参照模版感受对应的需求

在最基本的实现中,可以使用 el-dialog 组件并通过 v-model 控制其显示和隐藏

  1. 组件代码 (BasicDialog.vue)
<template>
  <div>
    <el-button type="primary" @click="showDialog">打开对话框</el-button>
    <el-dialog
      v-model:visible="dialogVisible"
      title="基本对话框"
      width="50%"
    >
      <p>这是一个基本的对话框。</p>
      <template #footer>
        <el-button @click="dialogVisible = false">关闭</el-button>
      </template>
    </el-dialog>
  </div>
</template>

<script setup>
import { ref } from 'vue';

const dialogVisible = ref(false);

const showDialog = () => {
  dialogVisible.value = true;
};
</script>
  1. 传递数据到对话框
<template>
  <div>
    <el-button type="primary" @click="showDataDialog">查看数据</el-button>
    <el-dialog
      v-model:visible="dataDialogVisible"
      title="数据对话框"
      width="50%"
    >
      <p>{{ dialogContent }}</p>
      <template #footer>
        <el-button @click="dataDialogVisible = false">关闭</el-button>
      </template>
    </el-dialog>
  </div>
</template>

<script setup>
import { ref } from 'vue';

const dataDialogVisible = ref(false);
const dialogContent = ref('这是传递的数据内容');

const showDataDialog = () => {
  dataDialogVisible.value = true;
};
</script>
  1. 异步数据加载

通过按钮点击触发对话框显示,并从后端获取数据并显示

<template>
  <div>
    <el-button type="primary" @click="fetchDataAndShowDialog">获取数据并显示</el-button>
    <el-dialog
      v-model:visible="asyncDialogVisible"
      title="异步数据对话框"
      width="50%"
    >
      <p>{{ asyncData }}</p>
      <template #footer>
        <el-button @click="asyncDialogVisible = false">关闭</el-button>
      </template>
    </el-dialog>
  </div>
</template>

<script setup>
import { ref } from 'vue';
import AppointmentCommissionApi from '@/api/AppointmentCommissionApi'; // 替换为实际路径

const asyncDialogVisible = ref(false);
const asyncData = ref('');

const fetchDataAndShowDialog = async () => {
  try {
    const response = await AppointmentCommissionApi.getData();
    asyncData.value = response.data; // 假设返回的数据在 data 字段中
    asyncDialogVisible.value = true;
  } catch (error) {
    console.error('数据获取失败:', error);
  }
};
</script>
  1. 自定义对话框内容
    可以通过插槽 (slot) 自定义对话框内容,如自定义表单或详细信息展示
<template>
  <div>
    <el-button type="primary" @click="showCustomDialog">打开自定义对话框</el-button>
    <el-dialog
      v-model:visible="customDialogVisible"
      title="自定义内容对话框"
      width="50%"
    >
      <template #default>
        <el-form :model="form">
          <el-form-item label="名称">
            <el-input v-model="form.name"></el-input>
          </el-form-item>
          <el-form-item label="描述">
            <el-input type="textarea" v-model="form.description"></el-input>
          </el-form-item>
        </el-form>
      </template>
      <template #footer>
        <el-button @click="customDialogVisible = false">取消</el-button>
        <el-button type="primary" @click="handleSubmit">提交</el-button>
      </template>
    </el-dialog>
  </div>
</template>

<script setup>
import { ref } from 'vue';

const customDialogVisible = ref(false);
const form = ref({
  name: '',
  description: ''
});

const showCustomDialog = () => {
  customDialogVisible.value = true;
};

const handleSubmit = () => {
  console.log('提交的表单数据:', form.value);
  customDialogVisible.value = false;
};
</script>

3. 实战

通过基本的知识点以及Demo模版大致知道逻辑步骤

在做审批过程中,审批不通过,客户查询后端原因,出现弹框结果

在这里插入图片描述

基本的功能组件如下:

<template>
  <el-dialog :model-value="visible" title="不通过原因" width="50%" @close="handleClose">
    <p>{{ rejectionReason }}</p>
    <template #footer>
      <el-button @click="handleClose">关闭</el-button>
    </template>
  </el-dialog>
</template>

<script setup lang="ts">
import { ref, defineProps, defineEmits, watch } from 'vue';

const props = defineProps({
  modelValue: {
    type: Boolean,
    required: true
  },
  rejectionReason: {
    type: String,
    default: ''
  }
});

const emit = defineEmits(['update:modelValue']);

const visible = ref(props.modelValue);

watch(() => props.modelValue, (newVal) => {
  visible.value = newVal;
});

const handleClose = () => {
  emit('update:modelValue', false);
};
</script>

在父组件中使用 RejectionReasonDialog,并进行相应的弹框控制和数据处理

<template>
  <div>
    <!-- 查看不通过原因按钮 -->
    <el-button
      link
      type="primary"
      @click="showRejectionReason(scope.row.id)"
      v-if="scope.row.appointmentStatus === '审批不通过'"
      v-hasPermi="['dangerous:appointment-commission:query']"
    >
      查看原因
    </el-button>

    <!-- 不通过原因对话框 -->
    <RejectionReasonDialog
      v-model:modelValue="isReasonDialogVisible"
      :rejectionReason="rejectionReason"
    />
  </div>
</template>

<script setup lang="ts">
import { ref } from 'vue';
import AppointmentCommissionApi from '@/api/AppointmentCommissionApi'; // 替换为实际路径
import RejectionReasonDialog from '@/components/RejectionReasonDialog.vue'; // 替换为实际路径

const isReasonDialogVisible = ref(false);
const rejectionReason = ref('');

const showRejectionReason = async (id: number) => {
  try {
    const response = await AppointmentCommissionApi.getAppointmentCommission(id);
    rejectionReason.value = response.approvalReason || '无理由'; // 确保有默认值
    isReasonDialogVisible.value = true; // 显示对话框
  } catch (error) {
    console.error('获取不通过原因失败:', error);
  }
};
</script>

基本的解释如下:

  • RejectionReasonDialog 组件
    使用 :model-value="visible" 绑定控制对话框的显示
    使用 rejectionReason 作为对话框内容

  • 父组件
    通过 showRejectionReason 方法调用 API 并更新 rejectionReason
    通过 isReasonDialogVisible 控制对话框的显示

  • 数据绑定
    v-model:modelValue 用于双向绑定对话框的显示状态
    :rejectionReason 传递不通过原因到对话框组件

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2074794.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【STM32单片机_(HAL库)】3-4-1【中断EXTI】【智能排队控制系统】LCD1602显示字符串

1.硬件 STM32单片机最小系统LCD1602显示模块 2.软件 驱动文件添加GPIO常用函数main.c程序 #include "sys.h" #include "delay.h" #include "led.h" #include "lcd1602.h"int main(void) {HAL_Init(); /* …

摄像头实时检查程序,插入设备,自动显示画面,支持多个摄像头,支持拍照,照片放大缩小

支持的特性 插入摄像头设备后&#xff0c;无需手动选择&#xff0c;自动显示摄像头画面&#xff0c;需要预先授权支持多个摄像头切换显示多个摄像头时支持 默认显示特定名称的摄像头支持拍照支持照片放大&#xff0c;缩小 显示效果 完整代码 <!DOCTYPE html> <html…

使用 AMD GPUs 进行基于 Transformers 的时间序列预测

Using AMD GPUs for Enhanced Time Series Forecasting with Transformers — ROCm Blogs 时间序列预测&#xff08;TSF&#xff09;是信号处理、数据科学和机器学习&#xff08;ML&#xff09;等领域的关键概念。TSF 通过分析系统的过去时间模式来预测其未来行为&#xff0c;利…

私域流量升级下的新机遇——“开源 AI 智能名片S2B2C 商城小程序”与新兴技术的融合

摘要&#xff1a;本文深入探讨了随着私域流量应用的进一步升级&#xff0c;智能对话式营销持续火爆的同时&#xff0c;CEM&#xff08;客户体验管理&#xff09;、MA&#xff08;营销自动化&#xff09;、CDP&#xff08;客户数据平台&#xff09;及 DAM&#xff08;数据资产管…

《黑神话:悟空》之光线追踪技术

8月20日&#xff0c;国产单机游戏《黑神话&#xff1a;悟空》终于上市&#xff0c;并以实力演绎了爆款游戏的“盛况空前”。 这款游戏的成功&#xff0c;不仅源自对经典文学《西游记》的深刻解读与创新演绎&#xff0c;更在于其背后强大的科技力量支撑。 空间计算功不可没 土…

游戏服务器架构:基于匿名函数的高性能异步定时器系统

作者&#xff1a;码客&#xff08;ygluu 卢益贵&#xff09; 关键词&#xff1a;游戏服务器架构、匿名函数、高性能、异步定时器。 一、前言 本文主要介绍适用于MMO/RPG游戏服务端的、基于匿名函数做定时器回调函数的、高性能异步触发的定时器系统的设计方案&#xff0c;以解决…

《深入浅出WPF》读书笔记.7依赖属性和附加属性

《深入浅出WPF》读书笔记.7依赖属性和附加属性 背景 总结一下wpf依赖属性和附加属性的底层逻辑&#xff0c;方便更好的理解使用。 属性 CLR属性由来 static属性和非static属性的区别 static属性:对类有意义&#xff0c;内存只有一个实例&#xff1b; 非static属性:对类实…

WPF—LiveCharts图表

LiveCharts图表 LiveCharts是一个简单灵活、交互式以及功能强大的跨平台图表库&#xff0c;支持wpf、winform...应用程序。 快速入门 安装 在应用程序中右键引用​&#xff0c;点击管理NuGet程序包​&#xff0c;选择浏览​&#xff0c;搜索LiveChartsCore.SkiaSharpView.W…

自动驾驶-机器人-slam-定位面经和面试知识系列10之高频面试题(04)

这个博客系列会分为C STL-面经、常考公式推导和SLAM面经面试题等三个系列进行更新&#xff0c;基本涵盖了自己秋招历程被问过的面试内容&#xff08;除了实习和学校项目相关的具体细节&#xff09;。在知乎和牛客也会同步更新&#xff0c;全网同号&#xff08;lonely-stone或者…

Cortex-A7的GIC(通用中断控制器):专有名词简介

0 资料 ARM Generic Interrupt Controller Architecture version 2.0 Architecture Specification1 专有名词简介 1.1 中断状态 说明&#xff1a; Inactive&#xff1a;未激活&#xff0c;中断无效。中断非挂起或非激活。 Pending&#xff1a;挂起&#xff0c;中断有效。等待…

【Web】NepCTF 2024题解

目录 PHP_MASTER!! NepDouble 蹦蹦炸弹&#xff08;boom_it&#xff09; NepRouter-白给 Always RCE First PHP_MASTER!! PHP反序列化键值逃逸mb_strpos与mb_substr连用导致的字符注入 https://www.cnblogs.com/EddieMurphy-blogs/p/18310518 flag在phpinfo里 payloa…

1/f噪声影响及解决措施

在将6位半数字万用表输入短接时&#xff0c;观察其输出。在逐渐增加均值次数后&#xff0c;噪声开始下降&#xff0c;达到一定程度后便停止下降&#xff0c;随着时间的推移&#xff0c;停止下降的噪声在逐渐增加&#xff0c;该部分主要是1/f噪声影响。 这种1/f噪声&#xff08;…

mPLUG-Owl3环境搭建推理测试

mPLUG-Owl3环境搭建&推理测试 引子 多模态的大模型也写了很多篇&#xff0c;阿里系的之前有一篇Qwen-VL的相关部署&#xff0c;感兴趣的童鞋请移步&#xff08;Qwen-VL环境搭建&推理测试-CSDN博客&#xff09;。今天这个mPLUG-Qwl3&#xff0c;更新换代也很快&#x…

Windows下线程的竞争与资源保护(win32-API)

一、前言 在线程编程中&#xff0c;资源共享与保护是一个核心议题&#xff0c;尤其当多个线程试图同时访问同一份资源时&#xff0c;如果不采取适当的措施&#xff0c;就会引发一系列的问题&#xff0c;如数据不一致、竞态条件、死锁等。为了确保数据的一致性和线程安全&#…

【游戏速递】 小猪冲刺:萌动指尖的极速挑战,小虎鲸Scratch资源站独家献映!

在线玩&#xff1a;Scratch小猪冲刺&#xff1a;全新挑战的几何冒险游戏-小虎鲸Scratch资源站 想象一下&#xff0c;一群憨态可掬的小猪&#xff0c;穿上炫酷的装备&#xff0c;踏上了追逐梦想的赛道。它们或跳跃、或滑行&#xff0c;灵活躲避各种障碍&#xff0c;只为那终点的…

微软亚研院哈佛:同行评议互一致的rStar

本来想将近期另一篇DeepSeek的“DeepSeek-Prover-V1.5: Harnessing Proof Assistant Feedback for Reinforcement Learning and Monte-Carlo Tree Search”与这篇同样基于强化学习思想的小型清爽型推理模型放在一个笔记中相互对比借鉴一下&#xff0c;考虑虽然两者有着一些共通…

论文3解析(复现):六自由度机械臂轨迹规划研究+机器人基础知识-部分1

论文&#xff1a;六自由度机械臂轨迹规划研究&#xff0c;马强 机器人一些关于数学基础的知识&#xff0c;简单的说一下&#xff1a; 向量 在机器人中&#xff0c;向量的含义并不是算算数那样子&#xff0c;而是在空间的本质含义。 向量叉乘&#xff1a;ab |a|*|b|*sin&am…

燃烧控制模型

加热炉燃烧控制 主要功能&#xff1a; 1&#xff0e; 把要轧制的钢坯加热的规定温度&#xff0c;即出炉目标温度&#xff0c;并尽量减少黑印。 2&#xff0e; 协调加热炉及轧机的生产能力&#xff0c;以提高轧机总的生产效率。 3&#xff0e; 节省燃料 在轧钢生产过程中&#x…

s3c2440移植Linux内核之引导

最近想尝试把新的Linux内核移植到tq2440的开发板上&#xff0c;看看还能不能顺利的跑起来。我的基础版本是买板子的时候提供的2.6.30版本&#xff0c;编译器版本是4.3.3.。 下载源码和编译器 下载linux源码&#xff0c;源码的官方网站是The Linux Kernel Archives&#xff0c…

沉积层的厚度为自振周期波长的1/4

要理解为什么是1/4&#xff0c;需要明白如下两点。 &#xff08;1&#xff09;自振周期&#xff08;fundamental model, or first harmonic&#xff09;取决于在某边界条件下可以出现驻波&#xff08;standing wave&#xff09;的最短距离。Standing wave, also known as a st…