Vue按照顺序实现多级弹窗(附Demo)

目录

  • 前言
  • 1. 单个弹窗
  • 2. 多级弹窗

前言

强化各个知识点,以实战融合,以下两个Demo从实战提取

1. 单个弹窗

部署按钮框以及确定的方法即可

截图如下所示:

在这里插入图片描述

以下Demo整体逻辑如下:

  1. 点击“生成周月计划”按钮会触发showWeekPlanDialog方法,该方法会先检查是否选择了数据,然后调用calculateWeekPeriods方法计算时间段并显示周计划对话框

  2. 在周计划对话框中,选择时间段后点击提交按钮会触发submitWeekPlan方法,该方法会检查是否选择了时间段,然后执行doSubmitWeekPlan方法提交周计划,并在操作成功后关闭周计划对话框并清空选中的时间段

<template>
  <div>
    <el-button type="primary" size="small" plain @click="showWeekPlanDialog">生成周月计划</el-button>

    <el-dialog title="周计划" :visible.sync="showWeekPlanDialogBox" :append-to-body="true" width="20%">
      <el-radio-group v-model="selectedPeriod" @change="handlePeriodChange">
        <el-table :data="weekPeriods" border>
          <el-table-column label="时间段" width="100">
            <template slot-scope="scope">
              <el-radio :label="scope.row.label"></el-radio>
            </template>
          </el-table-column>
          <el-table-column prop="dateRange" label="日期范围" width=200></el-table-column>
        </el-table>
      </el-radio-group>
      <el-button type="primary" size="small" @click="submitWeekPlan" style="margin: 10px;">提交</el-button>
    </el-dialog>
  </div>
</template>

<script>
import moment from 'moment';

export default {
  data() {
    return {
      showWeekPlanDialogBox: false, // 控制周计划对话框的显示
      selectedPeriod: '', // 选中的时间段
      weekPeriods: [], // 时间段数组
    };
  },
  methods: {
    showWeekPlanDialog() {
      if (this.selectionList.length === 0) { // 检查是否选择了数据
        this.$message.warning("请选择至少一条数据");
        return;
      }
      // 确保选中数据后计算时间段
      this.calculateWeekPeriods();
      this.showWeekPlanDialogBox = true; // 显示周计划对话框
    },
    calculateWeekPeriods() {
      const today = moment();
      const dayOfWeek = today.isoWeekday();

      // 计算本周的起始日期和结束日期
      const startDateThisWeek = today.clone().startOf('isoWeek');
      const endDateThisWeek = today.clone().endOf('isoWeek');

      // 计算上周和下周的起始日期和结束日期
      const startDateLastWeek = startDateThisWeek.clone().subtract(1, 'week');
      const endDateLastWeek = startDateLastWeek.clone().endOf('isoWeek');
      const startDateNextWeek = startDateThisWeek.clone().add(1, 'week');
      const endDateNextWeek = startDateNextWeek.clone().endOf('isoWeek');

      // 格式化日期范围
      const formatDateRange = (startDate, endDate) => {
        return `${startDate.format('YYYY-MM-DD')}~${endDate.format('YYYY-MM-DD')}`;
      };

      // 生成周期数组
      const weekPeriods = [
        { label: '上周', dateRange: formatDateRange(startDateLastWeek, endDateLastWeek) },
        { label: '本周', dateRange: formatDateRange(startDateThisWeek, endDateThisWeek) },
        { label: '下周', dateRange: formatDateRange(startDateNextWeek, endDateNextWeek) }
      ];
      this.weekPeriods = weekPeriods;
    },
    submitWeekPlan() {
      if (this.selectedPeriod === '') { // 检查是否选择了时间段
        this.$message.warning("请选择一个时间段");
        return;
      }
      // 执行提交周计划的操作
      this.doSubmitWeekPlan();
    },
    doSubmitWeekPlan() {
      // 在这里执行提交周计划的操作,可以调用API等
      console.log("提交周计划");
      this.showWeekPlanDialogBox = false; // 关闭周计划对话框
      // 清空选中的时间段,以便下次使用
      this.selectedPeriod = '';
      this.$message({
        type: "success",
        message: "操作成功!"
      });
    }
  }
};
</script>

2. 多级弹窗

在上面弹窗前加入一层弹窗

在这里插入图片描述
之后才是

在这里插入图片描述

整体逻辑如下:

  1. 按钮逻辑流程: 确保每个按钮的点击触发正确的逻辑流程,比如点击第一个按钮后显示第一个对话框,点击第一个对话框的确定按钮后显示第二个对话框,以此类推
  2. 数据传递: 确保在不同的对话框之间正确传递数据,比如第一个对话框选择的选项需要传递到第二个对话框
  3. 错误处理: 考虑每个步骤中进行错误处理,比如在确认选项时确保用户选择了正确的选项,或者在提交周计划时确保选择了时间段

对应Demo如下:

<template>
  <div>
    <el-button type="primary" size="small" plain @click="showOptionsDialog">生成周月计划</el-button>

    <!-- 第一个对话框 -->
    <el-dialog title="工单类型" :visible.sync="showOptionsDialogBox" :append-to-body="true" width="20%">
      <!-- 在此设置检查或更换选项 -->
      <el-radio-group v-model="selectedOption">
        <el-radio label="检查">钢丝绳检查</el-radio>
        <el-radio label="更换">钢丝绳更换</el-radio>
      </el-radio-group>
      <!-- 点击确定后显示第二个对话框 -->
      <el-button type="primary" size="small" @click="confirmOptions" style="margin: 10px;">确定</el-button>
    </el-dialog>

    <!-- 第二个对话框 -->
    <el-dialog title="周计划" :visible.sync="showWeekPlanDialogBox" :append-to-body="true" width="20%">
      <el-radio-group v-model="selectedPeriod">
        <el-table :data="weekPeriods" border>
          <el-table-column label="时间段" width="100">
            <template slot-scope="scope">
              <el-radio :label="scope.row.label"></el-radio>
            </template>
          </el-table-column>
          <el-table-column prop="dateRange" label="日期范围" width=200></el-table-column>
        </el-table>
      </el-radio-group>
      <el-button type="primary" size="small" @click="submitWeekPlan" style="margin: 10px;">提交</el-button>
    </el-dialog>
  </div>
</template>

<script>
import moment from 'moment';

export default {
  data() {
    return {
      // 控制第一个对话框的显示
      showOptionsDialogBox: false,
      showWeekPlanDialogBox: false, // 显示框,一开始为false,才有弹窗
      selectedOption: '', // 如果不初始化,后续会无法选中
      selectedPeriod: '', // 如果不初始化,后续会无法选中
      weekPeriods: []
    };
  },
  methods: {
    showOptionsDialog() {
      this.showOptionsDialogBox = true;
    },
    confirmOptions() {
      if (!this.selectedOption) {
        this.$message.warning("请选择检查或更换");
        return;
      }
      this.showOptionsDialogBox = false;
      // 如果需要根据选项动态生成周期,在这里调用相应的方法生成周期数组
      this.generateWeekPeriods();
      this.showWeekPlanDialogBox = true; // 打开第二个对话框
    },
    generateWeekPeriods() {
      const today = moment();
      const dayOfWeek = today.isoWeekday();

      // 计算本周的起始日期和结束日期
      const startDateThisWeek = today.clone().startOf('isoWeek');
      const endDateThisWeek = today.clone().endOf('isoWeek');

      // 计算上周和下周的起始日期和结束日期
      const startDateLastWeek = startDateThisWeek.clone().subtract(1, 'week');
      const endDateLastWeek = startDateLastWeek.clone().endOf('isoWeek');
      const startDateNextWeek = startDateThisWeek.clone().add(1, 'week');
      const endDateNextWeek = startDateNextWeek.clone().endOf('isoWeek');

      // 格式化日期范围
      const formatDateRange = (startDate, endDate) => {
        return `${startDate.format('YYYY-MM-DD')}~${endDate.format('YYYY-MM-DD')}`;
      };

      // 生成周期数组
      const weekPeriods = [
        { label: '上周', dateRange: formatDateRange(startDateLastWeek, endDateLastWeek) },
        { label: '本周', dateRange: formatDateRange(startDateThisWeek, endDateThisWeek) },
        { label: '下周', dateRange: formatDateRange(startDateNextWeek, endDateNextWeek) }
      ];
      this.weekPeriods = weekPeriods;
    },
    submitWeekPlan() {
      if (this.selectedPeriod === '') {
        this.$message.warning("请选择一个时间段");
        return;
      }
      // 在这里执行提交周计划的操作,传递选中的周期和选项等参数
      this.doSubmitWeekPlan();
    },
    doSubmitWeekPlan() {
      // 在这里执行提交周计划的操作,传递选中的周期和选项等参数
      console.log("提交周计划");
      this.showWeekPlanDialogBox = false;
      this.$message({
        type: "success",
        message: "操作成功!"
      });
    }
  }
};
</script>

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

FLIR LEPTON3.5 热像仪wifi 科研实验测温采集仪

点击查看详情!点击查看详情点击查看详情点击查看详情点击查看详情点击查看详情点击查看详情点击查看详情点击查看详情点击查看详情点击查看详情点击查看详情点击查看详情点击查看详情点击查看详情 1、描述 这是一款桌面科研实验测温热成像多功能热像记录仪&#xff0c;小巧轻便…

STM32微秒级别延时--F407--TIM1

基本配置&#xff1a; TIM1挂载在APB2总线上&#xff0c;150MHz经过15分频&#xff0c;得到10MHz计数频率&#xff0c;由于disable了自动重装载&#xff0c;所以只需要看下一次计数值是多少即可。 void TIM1_Delay_us(uint16_t us) //使用阻塞方式进行延时&#xff0c;ARR值不…

记录vue报错问题 in ./node_modules/axios/lib/platform/index.js

今天这个问题困扰了我许久 报错内容如下&#xff1a; 最初一直以为是我没装axios&#xff0c;又重新装了一次&#xff0c;后面才发现是axios版本原因&#xff0c;真的总是被版本的原因困住真的很烦 解决方法如下&#xff1a; 将axios的版本改为1.5.0 1、打开项目的文件夹“…

Linux命令--查找占磁盘空间最大的文件

原文网址&#xff1a;Linux命令--查找占磁盘空间最大的文件-CSDN博客 简介 本文介绍Linux怎样查找占磁盘空间最大的文件。 1.找到占空间最大的分区 命令 df -h 结果 2.查找分区里最大的文件 法1&#xff1a;直接查找最大的文件 sudo find my_folder -type f -exec du -…

LangChain-RAG学习之 LangChain框架入门

什么是LangChain LangChain是一个强大的框架&#xff0c;旨在帮助开发人员使用语言模型构建端到端的应用程序。它提供了一套工具、组件和接口&#xff0c;可简化创建由大型语言模型 (LLM) 和聊天模型提供支持的应用程序的过程。LangChain 可以轻松管理与语言模型的交互&#x…

使用FastGPT+OneAPI在本地使用Llama3

FastGPT 是一个基于 LLM 大语言模型的知识库问答系统&#xff0c;提供开箱即用的数据处理、模型调用等能力。同时可以通过 Flow 可视化进行工作流编排&#xff0c;从而实现复杂的问答场景&#xff01;他的重要特点就是工作流编排。 工作流编排&#xff1a;基于 Flow 模块的工作…

OneNote导出白色背景文件时将笔记墨迹转换颜色

今天用OneNote导出笔记时发现在文件上做的黑色墨迹笔记全部转成了白色。推测是因为onenote会根据背景色自动转换黑色和白色的墨迹&#xff0c;但是其他颜色好像导出的时候不会转换。 于是&#xff0c;我们首先要转换背景&#xff0c;将黑色背景转成白色背景&#xff0c; 然后将…

国内各种免费AI聊天机器人(ChatGPT)推荐(中)

作者主页&#xff1a;点击&#xff01; 国内免费AI推荐(ChatGPT)专栏&#xff1a;点击&#xff01; 创作时间&#xff1a;2024年4月29日15点20分 随着人工智能技术的不断发展&#xff0c;AI聊天机器人已经逐渐融入我们的日常生活。它们可以提供各种服务&#xff0c;例如聊天、…

【数据结构】链表专题2

前言 本篇博客继续探讨有关链表的专题&#xff0c;这片博客的题&#xff0c;提前打个预防针&#xff0c;有点意思哦&#xff0c;哈哈哈&#xff0c;话不多说&#xff0c;进入正文 &#x1f493; 个人主页&#xff1a;小张同学zkf ⏩ 文章专栏&#xff1a;数据结构 若有问题 评论…

【C语言】分支和循环(上)

【C语言】分支和循环&#xff08;上&#xff09; 1、if语句1.2 else1.3分支中包含多条语句1.4嵌套if1.5悬空else问题 2、关系操作符3、条件操作符4、逻辑操作符&#xff1a;与、或、非&#xff08;取反&#xff09;&#xff08;&&&#xff0c;||&#xff0c;&#xff0…

小程序引入 Vant Weapp 极简教程

一切以 Vant Weapp 官方文档 为准 Vant Weapp 官方文档 - 快速入手 1. 安装nodejs 前往官网下载安装即可 nodejs官网 安装好后 在命令行&#xff08;winr&#xff0c;输入cmd&#xff09;输入 node -v若显示版本信息&#xff0c;即为安装成功 2. 在 小程序根目录 命令行/终端…

mac nvm install node<version> error 404

mac m2芯片遇到的问题&#xff0c;估计m系列的应该也有这个问题&#xff0c;在这里记录一下 解决方案&#xff1a; ## 需要先处理一下兼容就OK了arch -x86_64 zsh nvm install returns curl: (22) The requested URL returned error: 404 Issue #2667 nvm-sh/nvm GitHub

关于YOLO8学习(五)安卓部署ncnn模型--视频检测

前文 关于YOLO8学习(一)环境搭建,官方检测模型部署到手机 关于YOLO8学习(二)数据集收集,处理 关于YOLO8学习(三)训练自定义的数据集 关于YOLO8学习(四)模型转换为ncnn 简介 本文将会讲解: (1)使用前文生成的ncnn模型,部署到安卓端,并且实现视频中,人脸的检测…

FileBird Pro插件下载:革新您的WordPress媒体库管理

WordPress媒体库是您网站的重要组成部分&#xff0c;它存储了所有的图片、视频、文档等文件。但随着网站的扩展&#xff0c;媒体库的管理变得越来越复杂。FileBird Pro插件&#xff0c;作为一款专为WordPress用户设计的媒体库管理工具&#xff0c;以其直观的界面和强大的功能&a…

【PowerJob】从源码编译到k8s部署

前言 虽然PowerJob官方说支持JPA各种数据源&#xff0c;但在PG数据库的兼容性上&#xff0c;确实存在小问题&#xff0c;issue也有相关原理描述&#xff0c;官方采用的优雅方式并未真正解决问题&#xff0c;因为只解决了从Lob字段读取的时候&#xff0c;自动建表的时候还是会生…

去哪儿网机票服务请求头pre逆向

作者声明&#xff1a;文章仅供学习交流与参考&#xff01;严禁用于任何商业与非法用途&#xff01;否则由此产生的一切后果均与作者无关&#xff01;如有侵权&#xff0c;请联系作者本人进行删除&#xff01; url&#xff1a;aHR0cHM6Ly9tLmZsaWdodC5xdW5hci5jb20v 一、加密位…

噪声嵌入提升语言模型微调性能

在自然语言处理&#xff08;NLP&#xff09;的快速发展中&#xff0c;大模型&#xff08;LLMs&#xff09;的微调技术一直是研究的热点。最近&#xff0c;一篇名为《NEFTUNE: NOISY EMBEDDINGS IMPROVE INSTRUCTION FINETUNING》的论文提出了一种新颖的方法&#xff0c;通过在训…

网络基础-网络设备介绍

本系列文章主要介绍思科、华为、华三三大厂商的网络设备 网络设备 网络设备是指用于构建和管理计算机网络的各种硬件设备和设备组件。以下是常见的网络设备类型&#xff1a; 路由器&#xff08;Router&#xff09;&#xff1a;用于连接不同网络并在它们之间转发数据包的设备…

Unity 编辑器工具 - 资源引用查找器

在Unity项目开发过程中&#xff0c;管理和维护资源之间的引用关系是至关重要的。当然我们项目也是需要这个功能 毕竟项目大了之后查找资源引用还是交给 资源引用查找器 比较好。 功能概述 资源引用查找器允许开发者选择一个目标资源&#xff0c;并在整个项目中查找引用了该资…

docker-compose启动mysql5.7报错

描述一下问题经过&#xff1a; 使用docker compose 部署mysql5.7 文件如下: services:mysql:restart: alwaysimage: mysql:5.7container_name: mysql-devports:- 3306:3306environment:- MYSQL_DATABASEdev- MYSQL_ROOT_PASSWORD123456healthcheck:test: ["CMD", &q…