vue2 重置表单失效

使用 this.$refs[‘form’].resetFields() 进行表单初始化时。有个致命的问题:this.$refs[‘form’].resetFields()这个做法其实是重置表单到初始值,不是清空表单,当表单第一次在页面中渲染时所用的数据就是初始数据

问题场景:vue中A页面跳转B页面,带有路由参数。B页面使用参数进行查询。当使用:this.$refs[‘form’].resetFields() 进行重置表单时,就会失效,始终重置不了。

watch: {
  // 根据名称筛选部门树
  orgName(val) {
    this.$refs.tree.filter(val);
  }
},
created() {
  if (this.$route.query.day != undefined) {
    this.dateRange[0] = this.$route.query.day
    this.dateRange[1] = this.$route.query.day
  }
  if (this.$route.query.orgId != undefined) {
    this.queryParams.orgId = this.$route.query.orgId
  }
  this.getList()
},
methods: {
    ......
    getList(){
        ....
    },
    /** 重置按钮操作 */
    resetQuery() {
      this.dateRange = [];
      this.queryParams.orgId = ''
      // this.$refs[‘form’].resetFields()这个做法其实是重置表单到初始值,
      // 不是清空表单,当表单第一次在页面中渲染时所用的数据就是初始数据。
      // 页面跳转后传递的参数直接参与页面查询,所以表单初始值就是传递过来的参数。
      // 在使用 this.$refs[‘form’].resetFields() 重置时,就会把最初的参
      // 数重置回来。
      // this.$refs[‘queryParams’].resetFields()
      this.handleQuery();
    },
}

 解决办法

不使用 this.$refs[‘queryParams’].resetFields() 重置;手动赋值的形式,清空表单对象

### ElementUI 表单重置无效的原因分析 表单重置功能失效通常由多种因素引起。一种常见原因是 `el-form-item` 元素未正确配置 `prop` 属性,这会阻止 `resetFields()` 正常工作[^2]。 另一种情况是在对话框(Dialog)场景下使用动态表单时可能出现的问题。当在同一弹窗内处理新增和编辑操作时,由于初始值设定不当可能导致重置行为不符合预期[^3]。 此外,在某些情况下即使调用了 `this.$refs[formName].resetFields()` 方法,实际的数据状态仍恢复到了之前的赋值状况,这是因为存在其他地方再次给这些字段设置了新值的情况[^4]。 对于 Vue 3 结合 Element Plus 使用的情形,需要注意的是 `resetField()` 的作用并非简单地将所有输入项设为空字符串或默认值,而是将其还原至最初渲染时所绑定的对象属性值。因此,如果希望实现真正的空白化效果,则需确保首次展示表单项时其关联模型即处于期望的初始化状态[^5]。 ### 解决方案示例代码 为了有效解决上述提到的各种潜在问题,可以采取如下措施: #### 确保 Form Item 设置 Prop 属性 ```html <template> <el-form :model="ruleForm" ref="ruleForm"> <!-- 添加 prop 属性 --> <el-form-item label="活动名称" prop="name"> <el-input v-model="ruleForm.name"></el-input> </el-form-item> </el-form> </template> <script setup lang="ts"> import { reactive, ref } from 'vue' const ruleForm = reactive({ name: '' }) // 定义模板引用 const ruleFormRef = ref(null) function resetForm() { if (ruleFormRef.value !== null) { ruleFormRef.value.resetFields() } } </script> ``` #### 处理 Dialog 中的表单逻辑 针对在 Dialog 内部使用的表单,可以通过调整显示顺序来规避已填充数据影响后续重置操作的问题: ```javascript let formDataCopy = {} // 创建副本用于保存原始数据 async function openEditDialog(data) { Object.assign(formDataCopy, data); // 将要编辑的数据复制一份 await nextTick(); // 等待DOM更新完成后再继续执行下一步 showEditDialogVisible(true); setTimeout(() => { Object.keys(ruleForm).forEach(key => { ruleForm[key] = formDataCopy[key]; }); }, 0); // 延迟设置具体数值以允许组件完全加载完毕 } function closeAndReset() { showEditDialogVisible(false); // 关闭后立即重置整个表单结构及其验证规则 resetForm(); } ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

绿竹痕

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值