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