组件模板
<el-dialog :title="title" :visible.sync="dialogShow" :close-on-click-modal="false">    <div class="ym-common-dialog" :class="customClass">        <div v-for="(col,index) in cols">            <span><em v-if="!!col.isRequire">*</em>{{col.name}}</span>            <template v-if="col.type === 'text'">                <div>{{submitData[col.key]}}</div>            </template>            <template v-if="col.type === 'input'">                <input type="text" v-model="submitData[col.key]" :placeholder="'请输出' + col.name">            </template>            <template v-if="col.type === 'radio'">                <div class="flexX">                <el-radio v-for="radio in col.data" v-model="submitData[col.key]" :label="radio.label">{{radio.name}}</el-radio>                </div>            </template>            <template v-if="col.type === 'select'">                <el-select v-model="submitData[col.key]" placeholder="请抉择">                    <el-option                    v-for="option in col.data"                    :key="option.value"                    :label="option.label"                    :value="option.value">                    </el-option>                </el-select>            </template>        </div>    </div>    <span slot="footer" class="dialog-footer">        <el-button @click="dialogShow = false">取 消</el-button>        <el-button type="primary" @click="confirm">确 定</el-button>    </span></el-dialog>

弹窗的内容依据传入的数据去渲染,数据格式如下

cols: [{    name: '输入框',    key: 'ccc', // 提交时对应的字段    type: 'input', // 类型     isRequire: true  // 是否必填}, {    name: '单选框',    key: 'aaa',    type: 'radio',    data: [{        label: '1',        name: '长城'    }, {        label: '2',        name: '长安'    }],    isRequire: true}, {    name: '下拉框',    key: 'bbb',    type: 'select',    data: [{        value: '选项1',        label: '黄金糕'    }, {        value: '选项2',        label: '双皮奶'    }],    isRequire: true}],
组件data和props
data() {    return {        submitData: {}, // 提交数据汇合        dialogShow: false    }},props: {    //  弹窗显示/暗藏    dialogVisible: {        type: Number,        default: 0    },    // 弹窗Title    title: String,    // 自定义款式    customClass: String,    // 数据列    cols: {        type: Array,        default: () => []    },    // 编辑时传入初始值    data: {        type: Object,        default: () => {}    }},
组件数据的监听
watch: {    dialogVisible(val) {        if (val > 0) {            this.dialogShow = true        }    },    data: {        handler(val) {            this.submitData = val        },        immediate: true    },    submitData: {        // 应答 切换单选框暗藏其余元素的问题        // 父组件监听到单选框的值变动时,批改cols的值,即可实现元素的暗藏与显示        handler() {            this.$emit('change', this.submitData)        },        deep: true    }}
数据提交以及验证
confirm() {    // 验证必填项    let isMust = this.cols.filter(item => item.isRequire).map(item => item.key)    Object.keys(this.submitData).forEach(key => {        let index = isMust.indexOf(key)        if ((index > -1) && this.submitData[key] !== '' && !!this.submitData[key]) {            isMust.splice(index, 1)        }    })    if (isMust.length > 0) {        showDefaultTips('请留神必填项!', '', 3)        return    }    this.$emit('complete', this.submitData)    this.dialogShow = false}

代码在此