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ù),比如第一個對話框選擇的選項需要傳遞到第二個對話框
- 錯誤處理: 考慮每個步驟中進行錯誤處理,比如在確認選項時確保用戶選擇了正確的選項,或者在提交周計劃時確保選擇了時間段
對應(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-01
vue3+TS 實現(xiàn)自定義指令長按觸發(fā)綁定的函數(shù)
這篇文章主要介紹了vue3+TS實現(xiàn)自定義指令長按觸發(fā)綁定的函數(shù),文中給大家分享了編寫自定義指令時遇到的幾個難點,本文結(jié)合實例代碼給大家介紹的非常詳細,需要的朋友可以參考下2022-12-12
解決vue js IOS H5focus無法自動彈出鍵盤的問題
今天小編就為大家分享一篇解決vue js IOS H5focus無法自動彈出鍵盤的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-08-08
vue3 el-form-item如何自定義label標簽內(nèi)容
這篇文章主要介紹了vue3 el-form-item如何自定義label標簽內(nèi)容問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-10-10

