竟然被element-plus背刺了

引言

闲来无事,在 GitHub 上找了一个开源项目玩玩。结果一打开就看傻了眼:引入了一堆库,用到的功能却屈指可数。

于是我顺手做了"减肥手术"------把没用的库都砍了。砍着砍着问题就来了:有个库删掉之后,项目居然报错,提示需要 Element Plus 2.3.7 版本。升级之后倒是能跑了,但我发现里面连基础组件封装都没有。

按照我一贯的习惯,我就重新封装了 Dialog > Form 这一层级的表单组件,让弹窗表单写起来更轻量、更一致。

不过,意外出现了一个老熟人:resetFields 重置不生效。


问题1 resetFields 不重置初始值

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

vue3 复制代码
const form = reactive({
  name: '',
  age: '',
})

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

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

问题是

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

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

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

ini 复制代码
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来让每次的初始值基于声明的值
  • 在新增的时候传递一个初始对象,覆盖原值
  • 在弹窗打开之后再做赋值操作
vue3 复制代码
  dialogVisible.value = true
  Object.assign(form, row || {
    toolTypeName: "",
    toolTypeId: 0
  })
相关推荐
码林鼠4 分钟前
dart语言教学
前端
光影少年4 分钟前
如果 React 组件的属性没有传值,它的默认值是什么?
前端·javascript·react.js
风骏时光牛马29 分钟前
AI_Coding:智能代码生成与工程实践
前端
颜进强34 分钟前
22 · NestJs InjectionScopes 注入作用域:默认单例不是偷懒,是最优——以及何时才该打破
前端·后端·ai编程
liangshanbo121543 分钟前
Web Worker 在 AI 前端应用中有什么具体使用场景?
前端·人工智能
Q26433650231 小时前
【有源码】基于Spring Boot和Vue的在线考试与交流系统-教育信息化背景下在线考试与交流一体化平台
java·vue.js·spring boot·mysql·spring·毕业设计·课程设计
拖孩1 小时前
一个全程 AI 写的小程序「厨菜记」,上线 20 天跑通流量主,收入几块钱,开心得不行
前端·后端·微信小程序
颜进强1 小时前
21 · NestJs AsyncProviders 异步提供者:useFactory 返回 Promise 之后,容器发生了什么
前端·后端·ai编程
莪_幻尘1 小时前
Agent 体检:乱编、连锁、失忆,给 Agent 做一次五维体检
前端·人工智能·agent
Helix2501 小时前
2026编程入门指南:零基础如何科学选择第一门编程语言?
java·c语言·javascript·零基础·编程语言·python入门·编程就业