有没有一个好的方式基于 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 表单,有没有更好的代码维护方式?
以上是 有没有一个好的方式基于 vue3 封装 dialog 这种公共视图组件? 的全部内容, 来源链接: utcz.com/p/937288.html