Vue按照順序?qū)崿F(xiàn)多級(jí)彈窗效果 附Demo
前言
強(qiáng)化各個(gè)知識(shí)點(diǎn),以實(shí)戰(zhàn)融合,以下兩個(gè)Demo從實(shí)戰(zhàn)提取
1. 單個(gè)彈窗
部署按鈕框以及確定的方法即可
截圖如下所示:
以下Demo整體邏輯如下:
- 點(diǎn)擊“生成周月計(jì)劃”按鈕會(huì)觸發(fā)
showWeekPlanDialog
方法,該方法會(huì)先檢查是否選擇了數(shù)據(jù),然后調(diào)用calculateWeekPeriods
方法計(jì)算時(shí)間段并顯示周計(jì)劃對(duì)話框 - 在周計(jì)劃對(duì)話框中,選擇時(shí)間段后點(diǎn)擊提交按鈕會(huì)觸發(fā)
submitWeekPlan
方法,該方法會(huì)檢查是否選擇了時(shí)間段,然后執(zhí)行doSubmitWeekPlan
方法提交周計(jì)劃,并在操作成功后關(guān)閉周計(jì)劃對(duì)話框并清空選中的時(shí)間段
<template> <div> <el-button type="primary" size="small" plain @click="showWeekPlanDialog">生成周月計(jì)劃</el-button> <el-dialog title="周計(jì)劃" :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="時(shí)間段" 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, // 控制周計(jì)劃對(duì)話框的顯示 selectedPeriod: '', // 選中的時(shí)間段 weekPeriods: [], // 時(shí)間段數(shù)組 }; }, methods: { showWeekPlanDialog() { if (this.selectionList.length === 0) { // 檢查是否選擇了數(shù)據(jù) this.$message.warning("請(qǐng)選擇至少一條數(shù)據(jù)"); return; } // 確保選中數(shù)據(jù)后計(jì)算時(shí)間段 this.calculateWeekPeriods(); this.showWeekPlanDialogBox = true; // 顯示周計(jì)劃對(duì)話框 }, calculateWeekPeriods() { const today = moment(); const dayOfWeek = today.isoWeekday(); // 計(jì)算本周的起始日期和結(jié)束日期 const startDateThisWeek = today.clone().startOf('isoWeek'); const endDateThisWeek = today.clone().endOf('isoWeek'); // 計(jì)算上周和下周的起始日期和結(jié)束日期 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')}`; }; // 生成周期數(shù)組 const weekPeriods = [ { label: '上周', dateRange: formatDateRange(startDateLastWeek, endDateLastWeek) }, { label: '本周', dateRange: formatDateRange(startDateThisWeek, endDateThisWeek) }, { label: '下周', dateRange: formatDateRange(startDateNextWeek, endDateNextWeek) } ]; this.weekPeriods = weekPeriods; }, submitWeekPlan() { if (this.selectedPeriod === '') { // 檢查是否選擇了時(shí)間段 this.$message.warning("請(qǐng)選擇一個(gè)時(shí)間段"); return; } // 執(zhí)行提交周計(jì)劃的操作 this.doSubmitWeekPlan(); }, doSubmitWeekPlan() { // 在這里執(zhí)行提交周計(jì)劃的操作,可以調(diào)用API等 console.log("提交周計(jì)劃"); this.showWeekPlanDialogBox = false; // 關(guān)閉周計(jì)劃對(duì)話框 // 清空選中的時(shí)間段,以便下次使用 this.selectedPeriod = ''; this.$message({ type: "success", message: "操作成功!" }); } } }; </script>
2. 多級(jí)彈窗
在上面彈窗前加入一層彈窗
之后才是
整體邏輯如下:
- 按鈕邏輯流程: 確保每個(gè)按鈕的點(diǎn)擊觸發(fā)正確的邏輯流程,比如點(diǎn)擊第一個(gè)按鈕后顯示第一個(gè)對(duì)話框,點(diǎn)擊第一個(gè)對(duì)話框的確定按鈕后顯示第二個(gè)對(duì)話框,以此類推
- 數(shù)據(jù)傳遞: 確保在不同的對(duì)話框之間正確傳遞數(shù)據(jù),比如第一個(gè)對(duì)話框選擇的選項(xiàng)需要傳遞到第二個(gè)對(duì)話框
- 錯(cuò)誤處理: 考慮每個(gè)步驟中進(jìn)行錯(cuò)誤處理,比如在確認(rèn)選項(xiàng)時(shí)確保用戶選擇了正確的選項(xiàng),或者在提交周計(jì)劃時(shí)確保選擇了時(shí)間段
對(duì)應(yīng)Demo如下:
<template> <div> <el-button type="primary" size="small" plain @click="showOptionsDialog">生成周月計(jì)劃</el-button> <!-- 第一個(gè)對(duì)話框 --> <el-dialog title="工單類型" :visible.sync="showOptionsDialogBox" :append-to-body="true" width="20%"> <!-- 在此設(shè)置檢查或更換選項(xiàng) --> <el-radio-group v-model="selectedOption"> <el-radio label="檢查">鋼絲繩檢查</el-radio> <el-radio label="更換">鋼絲繩更換</el-radio> </el-radio-group> <!-- 點(diǎn)擊確定后顯示第二個(gè)對(duì)話框 --> <el-button type="primary" size="small" @click="confirmOptions" style="margin: 10px;">確定</el-button> </el-dialog> <!-- 第二個(gè)對(duì)話框 --> <el-dialog title="周計(jì)劃" :visible.sync="showWeekPlanDialogBox" :append-to-body="true" width="20%"> <el-radio-group v-model="selectedPeriod"> <el-table :data="weekPeriods" border> <el-table-column label="時(shí)間段" 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 { // 控制第一個(gè)對(duì)話框的顯示 showOptionsDialogBox: false, showWeekPlanDialogBox: false, // 顯示框,一開始為false,才有彈窗 selectedOption: '', // 如果不初始化,后續(xù)會(huì)無法選中 selectedPeriod: '', // 如果不初始化,后續(xù)會(huì)無法選中 weekPeriods: [] }; }, methods: { showOptionsDialog() { this.showOptionsDialogBox = true; }, confirmOptions() { if (!this.selectedOption) { this.$message.warning("請(qǐng)選擇檢查或更換"); return; } this.showOptionsDialogBox = false; // 如果需要根據(jù)選項(xiàng)動(dòng)態(tài)生成周期,在這里調(diào)用相應(yīng)的方法生成周期數(shù)組 this.generateWeekPeriods(); this.showWeekPlanDialogBox = true; // 打開第二個(gè)對(duì)話框 }, generateWeekPeriods() { const today = moment(); const dayOfWeek = today.isoWeekday(); // 計(jì)算本周的起始日期和結(jié)束日期 const startDateThisWeek = today.clone().startOf('isoWeek'); const endDateThisWeek = today.clone().endOf('isoWeek'); // 計(jì)算上周和下周的起始日期和結(jié)束日期 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')}`; }; // 生成周期數(shù)組 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("請(qǐng)選擇一個(gè)時(shí)間段"); return; } // 在這里執(zhí)行提交周計(jì)劃的操作,傳遞選中的周期和選項(xiàng)等參數(shù) this.doSubmitWeekPlan(); }, doSubmitWeekPlan() { // 在這里執(zhí)行提交周計(jì)劃的操作,傳遞選中的周期和選項(xiàng)等參數(shù) console.log("提交周計(jì)劃"); this.showWeekPlanDialogBox = false; this.$message({ type: "success", message: "操作成功!" }); } } }; </script>
到此這篇關(guān)于Vue按照順序?qū)崿F(xiàn)多級(jí)彈窗(附Demo)的文章就介紹到這了,更多相關(guān)Vue多級(jí)彈窗內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
vue el-checkbox實(shí)現(xiàn)全選單選方式
這篇文章主要介紹了vue el-checkbox實(shí)現(xiàn)全選單選方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-03-03Vue項(xiàng)目設(shè)置多個(gè)靜態(tài)文件及自定義靜態(tài)文件目錄的方案詳解
本文介紹了如何在Vue項(xiàng)目中配置多個(gè)靜態(tài)文件目錄,并提供了使用Vite和Webpack實(shí)現(xiàn)的示例,通過在vite.config.ts或vue.config.js中引入相關(guān)插件和配置,可以輕松實(shí)現(xiàn)自定義靜態(tài)文件目錄,希望這些內(nèi)容對(duì)您有所幫助,感興趣的朋友一起看看吧2025-01-01vue模仿網(wǎng)易云音樂的單頁(yè)面應(yīng)用
這篇文章主要介紹了vue仿網(wǎng)易云音樂的單頁(yè)面應(yīng)用實(shí)例代碼,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-04-04vue3+TS 實(shí)現(xiàn)自定義指令長(zhǎng)按觸發(fā)綁定的函數(shù)
這篇文章主要介紹了vue3+TS實(shí)現(xiàn)自定義指令長(zhǎng)按觸發(fā)綁定的函數(shù),文中給大家分享了編寫自定義指令時(shí)遇到的幾個(gè)難點(diǎn),本文結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下2022-12-12解決vue js IOS H5focus無法自動(dòng)彈出鍵盤的問題
今天小編就為大家分享一篇解決vue js IOS H5focus無法自動(dòng)彈出鍵盤的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-08-08vue3 el-form-item如何自定義label標(biāo)簽內(nèi)容
這篇文章主要介紹了vue3 el-form-item如何自定義label標(biāo)簽內(nèi)容問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-10-10使用vue.js寫一個(gè)tab選項(xiàng)卡效果
Vue 實(shí)現(xiàn) Tab切換實(shí)現(xiàn)的場(chǎng)景很多,比如,利用vue-router、利用第三方插件、利用組件等等.本文使用組件來實(shí)踐tab選項(xiàng)卡2017-03-03