• vue 封装一个Dialog组件


    基于element-plus封装一个Dialog组件

    <template>
        <section class="dialog-wrap">
            <el-dialog 
    	        :title="title" 
    	        v-model="visible" 
    	        :close-on-click-modal="false">
                <section class="content-wrap">
                    <Form 
    	                :propList="props.propList" 
    	                ref="editForm"
    	                @close="cancel">
                   	</Form>
                </section>
                <template #footer>
                    <MyButton @click="cancel">取消</MyButton>
                    <MyButton type="primary" @click="confirm">确定</MyButton>
                </template>
            </el-dialog>
        </section>
    </template>
    
    <script setup>
    import { ref, reactive, toRefs, watch, inject } from 'vue'
    import MyButton from '@/components/MyButton.vue';
    import Form from '@/components/Form.vue'
    
    const visible = ref(false)
    
    const { title } = inject('formObj')
    
    const propList = ref([
         {
             id: 1,
             type: 'input',
             label: '姓名',
             prop: 'name',
             width: '100%',
             placeholder: '请输入姓名',
             disabled: false,
             show: true,
         },
         {
             id: 2,
             type: 'input',
             label: '用户名',
             prop: 'username',
             width: '100%',
             placeholder: '请输入用户名',
             disabled: false,
             show: true,
         },
         {
             id: 3,
             type: 'input',
             label: '联系电话',
             prop: 'phone',
             width: '100%',
             placeholder: '请输入联系电话',
             disabled: false,
             show: true,
    
         },
         {
             id: 4,
             type: 'input',
             label: '网址',
             prop: 'website',
             width: '100%',
             placeholder: '请输入网址',
             disabled: true,
             show: true,
         },
         {
             id: 5,
             type: 'input',
             label: '邮箱',
             prop: 'email',
             width: '100%',
             placeholder: '请输入邮箱地址',
             disabled: false,
             show: true,
         }
     ])
    
    const props = defineProps({
        propList: {
            type: Array,
            default: []
        }
        // formData: {
        //     type: Object,
        //     default: () => { }
        // },
        // title: {
        //     type: String,
        //     default: '',
        //     required: true
        // }
    })
    
    const editForm = ref()
    
    watch([() => props.formData, () => props.title], ([newFormData, newTitle]) => {
        // if (props.title === '编辑') {
        //     formData.value = newFormData
        // }
    })
    
    // const data = reactive({
    //     formData: {
    //         name: '',
    //         username: '',
    //         phone: '',
    //         website: '',
    //         email: ''
    //     }
    // })
    
    const cancel = () => {
        visible.value = false
        editForm.value.resetForm()
    }
    
    // 提交表单
    const confirm = async () => {
        editForm.value.formValidate()
    }
    
    const openDialog = () => {
        visible.value = true
    }
    
    // const { formData } = toRefs(data)
    
    defineExpose({
        openDialog
    })
    
    </script>
    <style lang="scss" scoped>
    .dialog-wrap {
        padding: 5px;
        .content-wrap {
            margin: 5px;
        }
        .footer {
            margin: 5px;
        }
    }
    </style>
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 111
    • 112
    • 113
    • 114
    • 115
    • 116
    • 117
    • 118
    • 119
    • 120
    • 121
    • 122
    • 123
    • 124
    • 125
    • 126
    • 127
    • 128
    • 129
    • 130
    • 131
    • 132
    • 133
    • 134
    • 135
    • 136
    • 137
    • 138
    • 139
    • 140
    • 141
    • 142
    • 143
    • 144
    • 145
    • 146
    • 147
    • 148
    • 149
    • 150
    • 151
  • 相关阅读:
    《C++程序设计原理与实践》笔记 第18章 向量和数组
    【计算机网络】http协议
    深度解析“链动2+1”模式的商业逻辑
    javascript IP地址正则表达式
    ffmpeg docker 编排
    阿里云贾朝辉:云XR平台支持彼真科技呈现国风科幻虚拟演唱会
    不可复制的PDF转成双层可复制PDF
    JAVA中线程池的定义及使用
    B. Good Kid
    Python 操作 lxml库与Xpath(爬取网页指定内容)
  • 原文地址:https://blog.csdn.net/qyl_0316/article/details/132813505