vue+elementui通用弹窗(新增+编辑)

image.png

组件模板

    
*{{col.name}}
取 消 确 定

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

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
}

代码在此

你可能感兴趣的:(vue.js,element-ui)