ElementUI Form resetFields

news/2025/6/4 10:57:31

前言

在一次结合v-if/v-elseresetFields结合使用reset之后值不正常,看完源码提了issue,然后被告知答案原来就在vue文档里,打脸打脸,因此记录一次不看文档,并且出问题不第一时间找文档的教训。

结论

  1. 凡事先从文档下手,用element-ui不是光看element-ui的文档,还要看vue文档
  2. Form组件resetFieldsdata值没什么关系,只跟Form-Item创建时的初始值有关。
  3. 使用v-if/v-else时,要先确定组件是需要重新生成(用 key 管理可复用的元素),还是可以直接替换(新组件会使用旧组件的初始值,事实上这里新旧是同一个组件更改了属性)。
  4. 只有含有prop属性,并且当前存在的组件才会reset
  5. 如果Form组件不是一开始就创建,可以用nextTick等待Form/Form-Item第一次创建完再resetFields。(这个其实跟组件没多大关系)

事故现场

https://jsfiddle.net/s5ar1un3...

上面代码切换组件后,执行resetFields重置值,结果重置的值为别的组件绑定的初始值。

事故原因

Vue 会尽可能高效地渲染元素,通常会复用已有元素而不是从头开始渲染。

也就是说使用v-if/v-else时,虽然看似是多个组件切换,但实际上是1个组件切换了自身的属性。但问题的关键是,切换了vue的属性,element-ui添加的属性比如初始值并没有换。

解决

https://jsfiddle.net/s5ar1un3...

Vue 为你提供了一种方式来表达“这两个元素是完全独立的,不要复用它们”。只需添加一个具有唯一值的 key 属性即可。

在事故现场上加上key值绑定。用 key 管理可复用的元素

resetFields过程

form.vue

created() {this.$on('el.form.addField', (field) => {if (field) {this.fields.push(field);}}this.$on('el.form.removeField', (field) => {if (field.prop) {this.fields.splice(this.fields.indexOf(field), 1);}});
}resetFields() {...this.fields.forEach(field => {field.resetField();});},

form-item.vue

    mounted() {if (this.prop) {this.dispatch('ElForm', 'el.form.addField', [this]);...let initialValue = this.fieldValue;...Object.defineProperty(this, 'initialValue', {value: initialValue});...}}beforeDestroy() {this.dispatch('ElForm', 'el.form.removeField', [this]);}resetField() {...this.validateDisabled = true;if (Array.isArray(value)) {prop.o[prop.k] = [].concat(this.initialValue);} else {prop.o[prop.k] = this.initialValue;}}
  1. Formcreated阶段创建监听,保存下当前Form-Item
  2. Form-Itemmounted判断是否存在prop属性,如果有,设置好初始值。
  3. Form组件resetFields实际上是保存当前注册上来的子组件Form-ItemresetField方法。
  4. Form-ItemresetField方法重新赋值为this.initialValue。(之前事故原因就是组件属性更新initialValue值是不会变的)

参考

https://cn.vuejs.org/v2/guide...

https://github.com/ElemeFE/el...

http://element-cn.eleme.io/#/...

文章来源:https://blog.csdn.net/weixin_33962923/article/details/88810872
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:
https://dhexx.cn/news/show-1292099.html

相关文章

python练习笔记——编写一个装饰器,模拟登录的简单验证

编写一个装饰器,模拟登录的简单验证(至验证用户名和密码是否正确) 如果用户名为 root 密码为 123则正确,否则不正确。如果验证不通过则不执行被修饰函数 #编写一个装饰器,模拟登录的简单验证 #只验证用户名和密码是否正…

智能监控摄像机:解读视频分析的力量

随着网络摄像机不断取代模拟CCTV系统,为摄像机增添重要附加功能的发展趋势可谓日益显著。图像质量、高性能处理器、先进软件算法等逐步升级,为众多新型视频分析应用软件的发展铺平了道路。视频分析软件可以处理人类无法处理的海量数据,例如&a…

一套采购管理系统多少钱?有哪些厂商推荐?

采购作为企业生产运营中的重要环节,几乎每个企业都在追求降低采购成本,以达到采购效益的最大化的目的。而随着信息技术的不断发展,利用系统软件管理采购也越来越成为一种趋势。采购管理系统主要是对采购过程中的相关事项进行管理,…

Angular 英雄编辑器

应用程序现在有了基本的标题。 接下来你要创建一个新的组件来显示英雄信息并且把这个组件放到应用程序的外壳里去。 创建英雄组件 使用 Angular CLI 创建一个名为 heroes 的新组件。 ng generate component heroes CLI 创建了一个新的文件夹, src/app/heroes/&am…

Linux7/Centos7新特性之链路聚合

Rhel7链路聚合NIC teaming,简单的说就是多个物理端口绑定在一起当成一个逻辑端口使用,以便提高带宽,实现负载平衡或高可用的功能。RHEL7里面是通过runner (可以视作一段代码)来实现不同的目的。配置的基本过程就是配置…

d3.js中动态数据的请求、处理及使用

添加字母刻度值的坐标轴 前面添加的坐标轴是一种数值形式的连续缩放的坐标轴,例如0-10,这种方法是Quantitative Scales 而有些值是不连续的,每一个值都是独立的,例如:坐标轴以年份分割,年份是不连续的&…

HBase行锁原理及实现

请带着例如以下问题阅读本文。1、什么是行锁? 2、HBase行锁的原理是什么? 3、HBase行锁是怎样实现的? 4、HBase行锁是怎样应用的? 一、什么是行锁? 我们知道。数据库中存在事务的概念。事务是作为单个逻辑工作单元运行…

Angular 显示英雄列表

在本页面,你将扩展《英雄指南》应用,让它显示一个英雄列表, 并允许用户选择一个英雄,查看该英雄的详细信息。 创建模拟(mock)英雄数据 你需要一些英雄数据以供显示。 最终,你会从远端的数据服…

SRM系统可以为企业带来哪些帮助?

随着科技的高速发展,各种管理软件应运而生,为企业实现自动化、数字化管理。SRM系统(供应商关系管理系统)目标在于构建一个协同的共享信息平台,打通供应链脉络,它的功能一般表现在供应商评估策略&#xff0c…

自动化构建工具

一些前端构建工具: