element-ui動(dòng)態(tài)添加表單項(xiàng)并實(shí)現(xiàn)事件觸發(fā)驗(yàn)證代碼示例
需求分析:
點(diǎn)擊新增后新增一個(gè)月度活動(dòng)詳情,提交時(shí)可同時(shí)提交多個(gè)月度活動(dòng)詳情。點(diǎn)擊某一個(gè)月度活動(dòng)信息的刪除后可刪除對(duì)應(yīng)月度活動(dòng)信息
H5部分:
<el-dialog :title="title" :visible.sync="open" append-to-body> <el-form ref="form" :model="form" label-width="80px"> <el-button @click="addItem" type="primary">增加</el-button> <div v-for="(item, index) in form.dynamicItem" :key="index" style="background-color:#f2f5f9;margin: 10px;" > <el-form :model="form.dynamicItem[index]" :rules="rules" label-width="120px"> <!-- 動(dòng)態(tài)產(chǎn)生重復(fù)表單項(xiàng) --> <el-row> <el-col :span="8"> <el-form-item label="活動(dòng)類型" prop="type" > <el-select v-model="item.type" placeholder="請(qǐng)選擇活動(dòng)類型"> <el-option v-for="dict in activeType" :key="dict.value" :label="dict.label" :value="parseInt(dict.value)" > </el-option> </el-select> </el-form-item> </el-col> <el-col :span="16"> <el-form-item label="活動(dòng)開始時(shí)間" prop="starttime"> <el-time-picker v-model="item.starttime" format = 'HH:mm' value-format = 'HH:mm' placeholder="活動(dòng)開始時(shí)間" style="width: 30%"> </el-time-picker> 至 <el-time-picker style="width: 30%" v-model="item.endtime" format = 'HH:mm' value-format = 'HH:mm' placeholder="活動(dòng)結(jié)束時(shí)間"> </el-time-picker> </el-form-item> </el-col> </el-row> <el-row> <el-col :span="8"> <el-form-item label="活動(dòng)人數(shù)" prop="ptotal"> <el-select v-model="item.ptotal" placeholder="請(qǐng)選擇活動(dòng)人數(shù)"> <el-option v-for="dict in activePtotal" :key="dict.value" :label="dict.label" :value="parseInt(dict.value)" /> </el-select> </el-form-item> </el-col> <el-col :span="16"> <el-form-item label="報(bào)名開始時(shí)間" prop="regTime"> <el-date-picker v-model="item.regTime" type="daterange" range-separator="至" start-placeholder="開始日期" end-placeholder="結(jié)束日期"> </el-date-picker> </el-form-item> </el-col> </el-row> <el-form-item label="活動(dòng)題目" prop="title"> <el-input v-model="item.title" placeholder="請(qǐng)輸入活動(dòng)題目" /> </el-form-item> <el-row> <el-col :span="8"> <el-form-item label="活動(dòng)場(chǎng)景" prop="scene"> <el-radio-group v-model="item.scene"> <el-radio :key="3" :label="1">室內(nèi)</el-radio> <el-radio :key="4" :label="2">室外</el-radio> </el-radio-group> </el-form-item> </el-col> <el-col :span="8"> <el-form-item label="活動(dòng)室名稱" prop="roomnum"> <el-select v-model="item.roomnum" placeholder="請(qǐng)選擇活動(dòng)室名稱"> <el-option label="請(qǐng)選擇字典生成" value="1" /> </el-select> </el-form-item> </el-col> <el-col :span="8"> <el-form-item label="活動(dòng)預(yù)算" prop="badget"> <el-input v-model="item.badget" placeholder="請(qǐng)輸入活動(dòng)預(yù)算" /> </el-form-item> </el-col> </el-row> <el-row > <el-col :span="8"> <el-form-item label="活動(dòng)主管" prop="manager"> <el-input v-model="item.manager" placeholder="請(qǐng)輸入活動(dòng)主管" /> </el-form-item> </el-col> <el-col :span="16"> <el-form-item label="協(xié)助人員" prop="assistant"> <el-input v-model="item.assistant" placeholder="請(qǐng)輸入?yún)f(xié)助人員" /> </el-form-item> </el-col> <el-button @click="delItem(index)" type="danger" style="float: right;">刪除</el-button> </el-row> </el-form> </div> </el-form> <div slot="footer" class="dialog-footer"> <el-button type="primary" @click="submitForm">確 定</el-button> <el-button @click="cancel">取 消</el-button> </div> </el-dialog>
抽取H5部分的主要框架:
<el-dialog :title="title" :visible.sync="open" append-to-body> <el-form ref="form" :model="form" label-width="80px"> <el-button @click="addItem" type="primary">增加</el-button> <!-- 動(dòng)態(tài)產(chǎn)生重復(fù)表單項(xiàng) --> <div v-for="(item, index) in form.dynamicItem" :key="index" style="background-color:#f2f5f9;margin: 10px;" > <el-form :model="form.dynamicItem[index]" :rules="rules" label-width="120px"> <el-row> <el-col :span="8"> <el-form-item label="活動(dòng)類型" prop="type" > 表單項(xiàng)1 </el-form-item> </el-col> <el-col :span="16"> <el-form-item label="活動(dòng)開始時(shí)間" prop="starttime"> 表單項(xiàng)2 </el-form-item> </el-col> <el-button @click="delItem(index)" type="danger" style="float: right;">刪除</el-button> </el-row> </el-form> </div> </el-form> <div slot="footer" class="dialog-footer"> <el-button type="primary" @click="submitForm">確 定</el-button> <el-button @click="cancel">取 消</el-button> </div> </el-dialog>
js部分
/** 點(diǎn)擊新增后增加新的項(xiàng)目 **/ addItem(){ // console.log(this.form.dynamicItem); this.form.dynamicItem.push({}); }, /** 點(diǎn)擊按鈕刪除動(dòng)態(tài)添加的表單 **/ delItem(index){ this.form.dynamicItem.splice(index,1); }
頁面中form數(shù)據(jù)對(duì)象聲明
// 表單參數(shù) form: { dynamicItem: [] },
表單驗(yàn)證
// 表單校驗(yàn) rules: { type: [{ required: true, message: "活動(dòng)類型不能為空", trigger: "change" }], starttime: [{ required: true, message: "活動(dòng)開始時(shí)間不能為空", trigger: "blur" }], endtime: [{ required: true, message: "活動(dòng)結(jié)束時(shí)間不能為空", trigger: "blur" }], ptotal: [{ required: true, message: "活動(dòng)人數(shù)不能為空", trigger: "change" }], regTime: [{ required: true, message: "報(bào)名時(shí)間不能為空", trigger: "blur" }], title: [{ required: true, message: "活動(dòng)題目不能為空", trigger: "blur" }], roomnum: [{ required: true, message: "活動(dòng)室名稱不能為空", trigger: "change" }], badget: [{ required: true, message: "活動(dòng)預(yù)算不能為空", trigger: "blur" }], manager: [{ required: true, message: "活動(dòng)主管不能為空", trigger: "blur" }], }
export default { name: "Month", components: { Form }, data() { return { // 表單參數(shù) form: { dynamicItem: [] }, // 表單校驗(yàn) rules: { type: [{ required: true, message: "活動(dòng)類型不能為空", trigger: "change" }], starttime: [{ required: true, message: "活動(dòng)開始時(shí)間不能為空", trigger: "blur" }], endtime: [{ required: true, message: "活動(dòng)結(jié)束時(shí)間不能為空", trigger: "blur" }], ptotal: [{ required: true, message: "活動(dòng)人數(shù)不能為空", trigger: "change" }], regTime: [{ required: true, message: "報(bào)名時(shí)間不能為空", trigger: "blur" }], title: [{ required: true, message: "活動(dòng)題目不能為空", trigger: "blur" }], roomnum: [{ required: true, message: "活動(dòng)室名稱不能為空", trigger: "change" }], badget: [{ required: true, message: "活動(dòng)預(yù)算不能為空", trigger: "blur" }], manager: [{ required: true, message: "活動(dòng)主管不能為空", trigger: "blur" }], } }; }, };
完整demo
<template> <div class="app-container"> <el-date-picker v-model="monthValue" type="month" style="width: 120px" value-format="yyyy-MM" format="yyyy-MM" placeholder="選擇月" @change="changeMonth" > </el-date-picker> <el-calendar v-model="nowDate" > <template slot="dateCell" slot-scope="{date, data}" > <p :class="data.isSelected ? 'is-selected' : ''" style="width: 100%;height: 100%;" @click="clickDate(date)"> {{ data.day.split('-').slice(1).join('月')+"日"}} {{ data.isSelected ? '??' : ''}} </p> </template> </el-calendar> <!-- 對(duì)話框(添加 / 修改) --> <el-dialog :title="title" :visible.sync="open" append-to-body> <el-form ref="form" :model="form" label-width="80px"> <el-button @click="addItem" type="primary">增加</el-button> <div v-for="(item, index) in form.dynamicItem" :key="index" style="background-color:#f2f5f9;margin: 10px;" > <el-form :model="form.dynamicItem[index]" :rules="rules" label-width="120px"> <!-- 動(dòng)態(tài)產(chǎn)生重復(fù)表單項(xiàng) --> <el-row> <el-col :span="8"> <el-form-item label="活動(dòng)類型" prop="type" > <el-select v-model="item.type" placeholder="請(qǐng)選擇活動(dòng)類型"> <el-option v-for="dict in activeType" :key="dict.value" :label="dict.label" :value="parseInt(dict.value)" > </el-option> </el-select> </el-form-item> </el-col> <el-col :span="16"> <el-form-item label="活動(dòng)開始時(shí)間" prop="starttime"> <el-time-picker v-model="item.starttime" format = 'HH:mm' value-format = 'HH:mm' placeholder="活動(dòng)開始時(shí)間" style="width: 30%"> </el-time-picker> 至 <el-time-picker style="width: 30%" v-model="item.endtime" format = 'HH:mm' value-format = 'HH:mm' placeholder="活動(dòng)結(jié)束時(shí)間"> </el-time-picker> </el-form-item> </el-col> </el-row> <el-row> <el-col :span="8"> <el-form-item label="活動(dòng)人數(shù)" prop="ptotal"> <el-select v-model="item.ptotal" placeholder="請(qǐng)選擇活動(dòng)人數(shù)"> <el-option v-for="dict in activePtotal" :key="dict.value" :label="dict.label" :value="parseInt(dict.value)" /> </el-select> </el-form-item> </el-col> <el-col :span="16"> <el-form-item label="報(bào)名開始時(shí)間" prop="regTime"> <el-date-picker v-model="item.regTime" type="daterange" range-separator="至" start-placeholder="開始日期" end-placeholder="結(jié)束日期"> </el-date-picker> </el-form-item> </el-col> </el-row> <el-form-item label="活動(dòng)題目" prop="title"> <el-input v-model="item.title" placeholder="請(qǐng)輸入活動(dòng)題目" /> </el-form-item> <el-row> <el-col :span="8"> <el-form-item label="活動(dòng)場(chǎng)景" prop="scene"> <el-radio-group v-model="item.scene"> <el-radio :key="3" :label="1">室內(nèi)</el-radio> <el-radio :key="4" :label="2">室外</el-radio> </el-radio-group> </el-form-item> </el-col> <el-col :span="8"> <el-form-item label="活動(dòng)室名稱" prop="roomnum"> <el-select v-model="item.roomnum" placeholder="請(qǐng)選擇活動(dòng)室名稱"> <el-option label="請(qǐng)選擇字典生成" value="1" /> </el-select> </el-form-item> </el-col> <el-col :span="8"> <el-form-item label="活動(dòng)預(yù)算" prop="badget"> <el-input v-model="item.badget" placeholder="請(qǐng)輸入活動(dòng)預(yù)算" /> </el-form-item> </el-col> </el-row> <el-row > <el-col :span="8"> <el-form-item label="活動(dòng)主管" prop="manager"> <el-input v-model="item.manager" placeholder="請(qǐng)輸入活動(dòng)主管" /> </el-form-item> </el-col> <el-col :span="16"> <el-form-item label="協(xié)助人員" prop="assistant"> <el-input v-model="item.assistant" placeholder="請(qǐng)輸入?yún)f(xié)助人員" /> </el-form-item> </el-col> <el-button @click="delItem(index)" type="danger" style="float: right;">刪除</el-button> </el-row> </el-form> </div> </el-form> <div slot="footer" class="dialog-footer"> <el-button type="primary" @click="submitForm">確 定</el-button> <el-button @click="cancel">取 消</el-button> </div> </el-dialog> </div> </template> <style rel="stylesheet/scss" lang="scss"> @import "~@/assets/styles/month.scss"; </style> <script> import { createMonth, updateMonth, deleteMonth, getMonth, getMonthPage, exportMonthExcel, createMonthActivities } from '@/api/activity/month' import {DICT_TYPE, getDictDataLabel, getDictDatas, getDictDatas2} from "@/utils/dict"; import Form from '@/views/bpm/form' export default { name: "Month", components: { Form }, data() { return { //活動(dòng)類型下拉框獲取后端數(shù)據(jù) activeType:null, //活動(dòng)人數(shù)下拉框獲取后端數(shù)據(jù) activePtotal:null, monthValue:null, nowDate:new Date(), // 遮罩層 loading: true, // 導(dǎo)出遮罩層 exportLoading: false, // 顯示搜索條件 showSearch: true, // 總條數(shù) total: 0, // 月度活動(dòng)列表 list: [], // 彈出層標(biāo)題 title: "", // 是否顯示彈出層 open: false, dateRangeTime: [], dateRangeRegTime: [], dateRangeCreateTime: [], //新增活動(dòng)日期 addActiveDate:null, // 查詢參數(shù) queryParams: { pageNo: 1, pageSize: 10, id: null, type: null, ptotal: null, title: null, scene: null, roomnum: null, badget: null, manager: null, assistant: null, }, // 表單參數(shù) form: { dynamicItem: [] }, // 表單校驗(yàn) rules: { type: [{ required: true, message: "活動(dòng)類型不能為空", trigger: "change" }], starttime: [{ required: true, message: "活動(dòng)開始時(shí)間不能為空", trigger: "blur" }], endtime: [{ required: true, message: "活動(dòng)結(jié)束時(shí)間不能為空", trigger: "blur" }], ptotal: [{ required: true, message: "活動(dòng)人數(shù)不能為空", trigger: "change" }], regTime: [{ required: true, message: "報(bào)名時(shí)間不能為空", trigger: "blur" }], title: [{ required: true, message: "活動(dòng)題目不能為空", trigger: "blur" }], roomnum: [{ required: true, message: "活動(dòng)室名稱不能為空", trigger: "change" }], badget: [{ required: true, message: "活動(dòng)預(yù)算不能為空", trigger: "blur" }], manager: [{ required: true, message: "活動(dòng)主管不能為空", trigger: "blur" }], } }; }, created() { this.monthValue=this.nowDate; this.getList(); //活動(dòng)類型下拉框獲取數(shù)據(jù) this.activeType=this.getDictDatas(DICT_TYPE.ACTIVITY_MONTH_TYPE); //活動(dòng)人數(shù)下拉框獲取數(shù)據(jù) this.activePtotal=this.getDictDatas(DICT_TYPE.ACTIVITY_MONTH_PTOTAL); //活動(dòng)場(chǎng)景單選框數(shù)據(jù) // this.activeScene=this.getDictDatas(DICT_TYPE.ACTIVITY_MONTH_SCENE); }, methods: { /** 查詢列表 */ getList() { this.loading = true; // 處理查詢參數(shù) let params = {...this.queryParams}; this.addBeginAndEndTime(params, this.dateRangeTime, 'time'); this.addBeginAndEndTime(params, this.dateRangeRegTime, 'regTime'); this.addBeginAndEndTime(params, this.dateRangeCreateTime, 'createTime'); // 執(zhí)行查詢 getMonthPage(params).then(response => { this.list = response.data.list; this.total = response.data.total; this.loading = false; }); }, /** 取消按鈕 */ cancel() { this.open = false; this.reset(); }, /** 表單重置 */ reset() { this.form.dynamicItem = []; this.resetForm("form"); }, /** 提交按鈕 */ submitForm() { var flag=0; var subData=this.form.dynamicItem; //提交數(shù)據(jù)驗(yàn)證 subData.forEach((data,index)=>{ //對(duì)提交數(shù)據(jù)進(jìn)行驗(yàn)證:type,starttime,endtime,ptotal,regTime,title,roomnum,manager,badget if (!data.type||!data.starttime||!data.endtime||!data.ptotal||!data.regTime||!data.title||!data.roomnum||!data.manager||!data.badget){ alert("數(shù)據(jù)提交異常1"); flag=1; } } ) if (flag===1){ return; } //數(shù)據(jù)信息進(jìn)行處理并進(jìn)行提交 subData.forEach((data,index)=>{ //對(duì)提交數(shù)據(jù)進(jìn)行驗(yàn)證:type,starttime,endtime,ptotal,regTime,title,roomnum,manager,badget data.regStarttime=data.regTime[0]; data.regEndtime=data.regTime[1]; if (typeof(data.starttime )=='string'){ var hourAndMinutesS=data.starttime.split(':'); data.starttime=new Date(this.addActiveDate.setHours(parseInt(hourAndMinutesS[0]))); data.starttime=new Date(this.addActiveDate.setMinutes(parseInt(hourAndMinutesS[1]))); } if (typeof(data.endtime )=='string'){ var hourAndMinutesE=data.endtime.split(':'); data.endtime=new Date(this.addActiveDate.setHours(hourAndMinutesE[0])); data.endtime=new Date(this.addActiveDate.setMinutes(hourAndMinutesE[1])); } console.log("處理過后的數(shù)據(jù)對(duì)象",data); console.log("數(shù)據(jù)"+index,data); } ) console.log(this.form.dynamicItem); // 添加的提交 createMonthActivities(this.form.dynamicItem).then(response => { this.$modal.msgSuccess("新增成功"); this.open = false; this.getList(); }); }, /** 上方月份選擇后下方日歷的聯(lián)動(dòng) **/ changeMonth() { //上方日期選擇器選擇了月份后,下方日歷顯示為選中月份 this.nowDate = new Date(this.monthValue); console.log("this.nowDate",this.nowDate); }, clickDate(date){ //點(diǎn)擊某個(gè)日期后彈出彈出框 this.reset(); this.open = true; this.title = "添加月度活動(dòng)"; this.addActiveDate=date; }, /** 點(diǎn)擊新增后增加新的項(xiàng)目 **/ addItem(){ // console.log(this.form.dynamicItem); this.form.dynamicItem.push({}); }, /** 點(diǎn)擊按鈕刪除動(dòng)態(tài)添加的表單 **/ delItem(index){ this.form.dynamicItem.splice(index,1); } } }; </script>
整體效果及功能:
刪除某個(gè)月度活動(dòng):
總結(jié)
到此這篇關(guān)于element-ui動(dòng)態(tài)添加表單項(xiàng)并實(shí)現(xiàn)事件觸發(fā)驗(yàn)證的文章就介紹到這了,更多相關(guān)element-ui動(dòng)態(tài)添加表單項(xiàng)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
vue項(xiàng)目預(yù)覽excel表格功能(file-viewer插件)
這篇文章主要介紹了vue項(xiàng)目預(yù)覽excel表格功能(file-viewer插件),本文分步驟結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2023-10-10關(guān)于antd中select搜索框改變搜索值的問題
這篇文章主要介紹了關(guān)于antd中select搜索框改變搜索值的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-04-04vue監(jiān)聽input標(biāo)簽的value值方法
今天小編就為大家分享一篇vue監(jiān)聽input標(biāo)簽的value值方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-08-08Vue3+ElementPlus在el-table表格中顯示時(shí)間的示例代碼
文章介紹了如何在Vue3+ElementPlus的el-table表格中顯示時(shí)間,并提供了相關(guān)的代碼示例,感興趣的朋友一起看看吧2025-02-02Vue 針對(duì)瀏覽器參數(shù)過長(zhǎng)實(shí)現(xiàn)瀏覽器參數(shù)加密解密的操作方法
文章介紹了如何在Vue項(xiàng)目中使用crypto-js庫對(duì)瀏覽器參數(shù)進(jìn)行加密和解密,以解決參數(shù)過長(zhǎng)的問題,在router/index.js中添加了相關(guān)代碼,并在utils工具類中添加了encryption.js和query.js源碼,感興趣的朋友一起看看吧2024-12-12解決antd datepicker 獲取時(shí)間默認(rèn)少8個(gè)小時(shí)的問題
這篇文章主要介紹了解決antd datepicker 獲取時(shí)間默認(rèn)少8個(gè)小時(shí)的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-10-10