vue2 el-dialog中创建和编辑使用同一个el-form 导致数据回显的bug

关于vue2 el-dialog中创建和编辑使用同一个el-form 导致数据回显的bug

问题描述

 新增和编辑是同一个表单。

 先新增后编辑,编辑弹框可以正常赋值;

 先编辑后新增,新增弹框会初始化编辑的数据;

解决办法

编辑时回显数据时,使用this.nextTick()进行包裹。

    editItem(rows){
      this.editId = rows.id
      this.dialogTitle = '更新'
      // 打开对话框
      this.dialogVisible = true
      this.$nextTick(()=> {
        // 数据回显
        this.userInfo =  {...rows}
      })
    },

问题解析

 根据文档显示,resetFields是对整个表单进行重置,将所有字段值重置为空并移除校验结果。但是实际上resetFields是清空validateMessage,然后把值重置成了上一次初始化的值。
 如果你编辑时,第一次打开dialog的时候给表单绑定的model赋值了,这时候这个model的初始值就变成了你所赋值的值,所以resetFields的时候,会将model对应的每个值重置到初始值,这时候的初始值就是你编辑时赋值的那个值。
 所以:页面一进入, form表单就是原始的。点击编辑后,会一个个给form进行赋值,那么重置时,就会重置给给form赋值后的效果。
 resetFields()方法是初始化值,并不是清空所有值。这个初始值是在form mounted生命周期被赋值上去的。所以,在form mounted之前,如果form表单赋值了,那么后面调用resetFields()都是无效的,因为form表单的初始值已经在mounted之前就被赋值了。

  • 8
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue,在el-dialog再打开一个el-dialog可以通过嵌套组件的方式来实现。 具体实现方法如下: 1. 创建一个弹窗组件,例如MyDialog,用于显示一个el-dialog。 2. 在MyDialog组件,添加一个插槽用于显示弹窗内容,并在插槽使用el-dialog组件来实现弹窗的显示和隐藏。 例如,在MyDialog组件实现一个弹窗: ``` <template> <el-dialog :title="dialogTitle" :visible.sync="dialogVisible" @close="onClose"> <slot></slot> <el-dialog v-if="showChildDialog" :visible.sync="childDialogVisible" @close="onChildDialogClose"> <div>子弹窗内容</div> </el-dialog> </el-dialog> </template> <script> export default { props: { dialogTitle: String }, data() { return { dialogVisible: true, showChildDialog: false, childDialogVisible: false } }, methods: { onClose() { this.$emit('close'); }, onChildDialogClose() { this.showChildDialog = false; } } } </script> ``` 在上面的代码使用el-dialog组件来实现弹窗的显示和隐藏,同时添加了一个插槽用于显示弹窗内容。在插槽,再次使用el-dialog组件来实现子弹窗的显示和隐藏。 3. 在需要打开弹窗的地方,引入MyDialog组件,并通过v-if或v-show指令来控制弹窗的显示和隐藏。 例如,在父组件引入MyDialog组件并打开弹窗: ``` <template> <div> <button @click="showDialog = true">打开弹窗</button> <my-dialog v-if="showDialog" :dialogTitle="dialogTitle" @close="showDialog = false"> <div> 弹窗内容 <button @click="showChildDialog = true">打开子弹窗</button> </div> </my-dialog> </div> </template> <script> import MyDialog from './MyDialog.vue' export default { components: { MyDialog }, data() { return { showDialog: false, dialogTitle: '弹窗标题' } } } </script> ``` 在上面的代码,通过v-if指令来控制弹窗的显示和隐藏,使用了MyDialog组件,并传递了相应的props和事件。 通过以上步骤,就可以在一个el-dialog再打开一个el-dialog了。注意,在嵌套的el-dialog,需要使用v-if或v-show指令来控制显示和隐藏,并在组件添加相应的事件来关闭弹窗。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值