有没有一个好的方式基于 vue3 封装 dialog 这种公共视图组件?

问题:有没有一个好的方式基于 vue3 封装 dialog 这种公共视图组件?

比如通过很多列表页通过 dialog 弹出编辑表单,提交更新数据。
在这个弹出框里,分为新建表单和编辑表单,其中表单几乎是一模一样,在其他页面中的弹出框里标题、提交按钮、关闭按钮几乎是一模一样。

那么能不能做成函数式调用弹出 dialog 编辑表单呢?

比如我期待的伪代码如下:
JS部分只有这些业务逻辑

    methods:{
        // 页面用户数据 编辑按钮绑定事件
        editRowData(data,id ) {
            const is_update = id?true:false
            const dialog =this.createDialog({
                title:id?"编辑用户数据":"新增用户数据",
                element_form_id:"#userEditForm",
                form:data,
                rules:[
                    //...
                ]
            }).then((submitData) =>{
                if(is_update){
                    axios.post(`/user/{id}`,submitData).then(this.dialog("更新成功"))
                }else{
                    axios.post('/user/new',submitData).then(this.dialog("新建成功"))
                }
                dialog.close() // 关闭模态框
            }).catch(()=>{
                // ...
            })
        },
}

视图部分,也只需要填写表单部分:

<el-form :model="form" label-width="120px" id="userEditForm">
    <el-form-item label="form.name">
      <el-input v-model="form.name" />
    </el-form-item>
    <el-form-item label="Activity zone">
      <el-select v-model="form.region" placeholder="please select your zone">
        <el-option label="Zone one" value="shanghai" />
        <el-option label="Zone two" value="beijing" />
      </el-select>
    </el-form-item>
</el-form> 

以上的好处是不需要定义一堆的表单变量到 data 中,不需要定义标题到 data 中,也不需要维护dialog 的显示隐藏的变量,关闭dialog的事件,因为写的多了,会发现到处都是重复性的事件定义。一个页面有多个可弹出式编辑的功能,就会存在多处重复代码。

        groupHandleClose() {
            this.groupDialogVisible = false
        },
        groupHandleSubmitForm() {
            //...
        },

        userHandleClose() {
            this.userDialogVisible = false
        },
        userHandleSubmitForm() {
            //...
        },

我使用的element plus的ui组件,在实践过程中遇到了一些问题。
比如统一维护一个模态框的标题,按钮等外部框架:

<template>
    <el-dialog v-model="FormDialogVisible" @closed="closedDialog" :title="FormDialogTitle" width="400px">
        <slot></slot>

        <template #footer>
            <span class="dialog-footer">
                <el-button type="danger" @click="FormHandleClose()">Cancel</el-button>
                <el-button type="primary" @click="FormHandleSubmitForm()">Submit</el-button>
            </span>
        </template>
    </el-dialog>
</template

想着在外部通过组件形式进行引用,并用 <slot></slot> 进行将表单数据嵌入到组件中使用,实际发现他的数据访问是访问不到组件内部的。

<CommonDialogVue @submit="userEditSubmit" @close="userEditClose" :dialogVisible="userEditVisible">
<el-form :model="form" label-width="120px" id="userEditForm">
    <el-form-item label="form.name">
      <el-input v-model="form.name" />
    </el-form-item>
    <el-form-item label="Activity zone">
      <el-select v-model="form.region" placeholder="please select your zone">
        <el-option label="Zone one" value="shanghai" />
        <el-option label="Zone two" value="beijing" />
      </el-select>
    </el-form-item>
</el-form> 
</CommonDialogVue>

而且也并不能很好的动态创建组件,以及调用组件绑定事件。所以目前我还是用老的方式,哪里用到,就复制一份代码改改,求助大佬,对于一个页面多处dialog表单,以及多个页面多个 dialog 表单,有没有更好的代码维护方式?

阅读 1.4k
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题