<template> <div class="form-wrap" v-if="visible" :style="style" ref="formWrap"> <slot name="header">编辑</slot> <el-form ref="resetForm" :model="resetForm" :inline="isInline" :rules="rules" class="demo-form-inline edit-form" :label-position="labelPosition" label-width="120px" > <el-form-item v-for="(item,key,index) in form" :label="item.label" :key="key+index" :prop="key" :class="{'item-oneline':item.oneline,'item-inline-50': isInline}" > <el-input v-if="item.filed=='input'" v-model="resetForm[key]" :disabled="item.isDisable" :placeholder="item.placeholder" :show-password="item.pwd" label="left" ></el-input> <el-select v-else-if="item.filed=='select'" v-model="resetForm[key]" :multiple="item.multiple" > <el-option v-for="(items) in item.options " :key="items.inputValue" v-model="items.inputValue" :label="items.label" ></el-option> </el-select> <el-date-picker v-else-if="item.filed=='date'" type="date" v-model="resetForm[key]" :label="item.label" placeholder="抉择工夫" :key="item.inputValue" style="width: 80%;" ></el-date-picker> <el-date-picker v-else-if="item.filed=='datetime'" type="datetime" v-model="resetForm[key]" :label="item.label" placeholder="抉择日期" :key="item.inputValue" style="width: 80%;" ></el-date-picker> <el-switch v-else-if="item.filed=='switch'" v-model="resetForm[key]" :active-value="item.active" :inactive-value="item.inactive" ></el-switch> <el-radio-group v-else-if="item.filed=='radio'" v-model="resetForm[key]"> <el-radio v-for="(item) in item.options" :label="item.inputValue" :key="item.inputValue" >{{item.label}}</el-radio> </el-radio-group> <el-checkbox-group v-else-if="item.filed=='checkbox'" v-model="resetForm[key]"> <el-checkbox v-for="(items) in item.options" :label="items.label" :name="item.type" :key="items.label+items.inputValue" ></el-checkbox> </el-checkbox-group> <el-input v-else-if="item.filed=='textarea'" type="textarea" v-model="resetForm[key]" :rows="item.rows" :placeholder="item.placeholder" style="width:100%" ></el-input> </el-form-item> </el-form> <div slot="footer" class="dialog-footer"> <el-button @click="close">{{cancelText}}</el-button> <el-button type="primary" @click="send('resetForm')">{{submitText}}</el-button> </div> </div></template><script>export default { props: { visible: { type: Boolean, default: false }, form: {}, query: {} }, data() { return { resetForm: {}, rules: {}, style: "", isInline: false, labelPosition: "right", submitText: "确 定", cancelText: "取 消" }; }, created() {}, methods: { initForm() { let data = this.form; let objForm = {}; let objRules = {}; let _this = this; let { style, isInline, labelPosition, submitText, cancelText } = this.query; this.style = style || ""; this.labelPosition = labelPosition || "top"; this.isInline = isInline || false; this.submitText = submitText || "确 定"; this.cancelText = cancelText || "取 消"; Object.keys(data).map((item, index, key) => { objForm[item] = data[item]["inputValue"]; let rules = data[item]["rules"]; if (rules) { if (rules == "required") { if (data[item]["filed"] == "checkbox") { objRules[item] = [ { type: "array", required: true, message: `请至多抉择一个${data[item]["label"]}`, trigger: "change" } ]; } else if (data[item]["filed"] == "date") { objRules[item] = [ { required: true, message: `请抉择${data[item]["label"]}`, trigger: "change" } ]; } else { objRules[item] = [ { required: true, message: `请输出${data[item]["label"]}`, trigger: "blur" } ]; } } else if (rules == "phone") { objRules[item] = [ { required: true, message: "请输出手机号码", trigger: "blur" }, { validator: function(rule, value, callback) { if ( /^1[34578]\d{9}$|(^5\d{2,3}-\d{3,9}$)/.test(value) == false ) { callback(new Error("请输出正确的手机号")); } else { callback(); } }, trigger: "blur" } ]; } else if (rules == "num") { objRules[item] = [ { required: true, message: "请输出数字", trigger: "blur" }, { validator: function(rule, value, callback) { if (/^\d+$|^\d+[.]?\d+$/.test(value) == false) { callback(new Error("请输出数字")); } else { callback(); } }, trigger: "blur" } ]; } else if (rules == "pwd") { objRules[item] = [ { required: true, message: "请输出明码", trigger: "blur" }, { validator: function(rule, value, callback) { if ( !/^(?![\d]+$)(?![a-zA-Z]+$)(?![^\da-zA-Z]+$)([^\u4e00-\u9fa5\s]){8,20}$/.test( value ) ) { callback( new Error( "请输出8-20位英文字母、数字或者符号(除空格),且字母、数字和标点符号至多蕴含两种" ) ); } else { callback(); } }, trigger: "blur" } ]; } else if (rules == "checkpwd") { objRules[item] = [ { required: true, message: "请输出明码", trigger: "blur" }, { validator: function(rule, value, callback) { if (value !== _this.resetForm[data[item]["compare"]]) { callback(new Error("两次输出明码不统一!")); } else { callback(); } }, trigger: "blur" } ]; } else { objRules[item] = rules; } } }); this.resetForm = { ...objForm }; this.rules = { ...objRules }; }, destoryForm() { this.resetForm = {}; this.rules = {}; }, createdOverBg() { let div = document.createElement("div"); let overClass = document.createAttribute("class"); overClass.value = "over-bg"; div.setAttributeNode(overClass); document .getElementsByTagName("body") .item(0) .appendChild(div); }, close() { this.closeDailog(); this.$emit("close-edit-form", ""); }, closeDailog() { let overDiv = document.getElementsByClassName("over-bg")[0]; if (overDiv) { overDiv.parentNode.removeChild(overDiv); } this.destoryForm(); }, send(formName) { this.$refs.resetForm.validate((valid) => { if (valid) { this.$emit("close-edit-form", this.resetForm); this.closeDailog(); } else { return false; } }); } }, watch: { form: { immediate: true, handler(val) { //this.form=val; } }, visible: { handler(val) { if (val) { this.createdOverBg(); this.initForm(); } else { } } } }};</script><style scoped>.item-inline-50 { width: 50%; box-sizing: border-box; padding: 0px 0px 0px 8px; margin-right: 0px !important ;}.item-oneline { display: block; width: 90%;}.dialog-footer { text-align: center;}.form-wrap { position: fixed; top: 0; right: 0; bottom: 0; left: 50%; overflow: auto; margin-top: 12vh; padding: 16px; z-index: 2001; width: 50vw; max-height: 85vh; height: fit-content; box-sizing: border-box; border-radius: 16px; background: white;}.edit-form { height: fit-content; overflow: auto; /* padding-bottom: 44px; */ max-height: 70vh;}.form-wrap::-webkit-scrollbar,.edit-form::-webkit-scrollbar { /*滚动条整体款式*/ width: 1px; /*高宽别离对应横竖滚动条的尺寸*/ height: 1px;}</style>