引言

闲来无事,在 GitHub 上找了一个开源项目玩玩。结果一打开就看傻了眼:引入了一堆库,用到的功能却屈指可数。
于是我顺手做了“减肥手术”——把没用的库都砍了。砍着砍着问题就来了:有个库删掉之后,项目居然报错,提示需要 Element Plus 2.3.7 版本。升级之后倒是能跑了,但我发现里面连基础组件封装都没有。

按照我一贯的习惯,我就重新封装了 Dialog > Form 这一层级的表单组件,让弹窗表单写起来更轻量、更一致。
不过,意外出现了一个老熟人:resetFields 重置不生效


问题1 resetFields 不重置初始值

el-dialog > el-form 中使用 resetFields() 理论上会把表单重置为“初始值”,即组件 model 初始化时的值。

const form = reactive({
  name: '',
  age: '',
})

const reset = () => {
  ruleFormRef.value?.resetFields()
}

const openDialog = (row) => {
    Object.assign(form, row)
    visible.value = true
}

问题是

  • 初次新增调用openDialog,row为空,正常
  • 初次编辑调用openDialog,row为正常表单数据,显示正常
  • 关闭编辑后,再打开新增,数据未被清除
form = reactive({})
ruleFormRef.value?.resetFields()

问题2 使用ref声明model,二次打开触发校验

在以上问题点出现后,使用ref声明model,在新增时,将model重新赋值为空对象

const form = ref({
  name: '',
  age: '',
})

const reset = () => {
  ruleFormRef.value?.resetFields()
}

const openDialog = (type, row) => {
    form.value = row
    if (type === 'add') form.value = {}
    visible.value = true
}

原因分析

  • restFields 有一个依赖初始值,不是在挂载,也不是在声明时,需要和代码书写分开。它是指第一次打开dialog声明的form,也就是visible=true的值
  • 那为什么触发校验呢,ref引用变了,触发了form中的校验,推荐使用Object.assign

解决方案

  • 手动删除model中的属性值
  • 在Dialog上加上destroy-on-close或者使用v-if来让每次的初始值基于声明的值
  • 在新增的时候传递一个初始对象,覆盖原值
  • 在弹窗打开之后再做赋值操作
  dialogVisible.value = true
  Object.assign(form, row || {
    toolTypeName: "",
    toolTypeId: 0
  })
本站提供的所有下载资源均来自互联网,仅提供学习交流使用,版权归原作者所有。如需商业使用,请联系原作者获得授权。 如您发现有涉嫌侵权的内容,请联系我们 邮箱:[email protected]