首页 > 其他分享 >Vue2 校验不通过的表单,赋正确的值后,再次校验结果不变

Vue2 校验不通过的表单,赋正确的值后,再次校验结果不变

时间:2023-12-14 16:57:49浏览次数:40  
标签:name Object 校验 表单 123 Vue2 model assign

前言

在工作中遇到了这个问题,多次排查,耗费了不少时间才解决这个问题。问题的解决很简单,但发现根本原因还是有点困难,因此在此做个记录,以防忘记。

问题发现步骤

例如有以下 Ant Design Vue 表单

<a-form-model ref="formRef" :model="model">

  <a-form-model-item label="姓名" prop="name" :rules="[{ required: true, message: '请填写姓名', trigger: 'blur' }]">
    <a-input v-model="model.name" placeholder="请输入姓名"></a-input>
  </a-form-model-item>
  
  <a-form-model-item label="留言" prop="notes" :rules="[{ required: true, message: '请填写留言', trigger: 'blur' }]">
    <a-input v-model="model.notes" placeholder="请输入留言"></a-input>
  </a-form-model-item>
  
<a-form-model/>

然后进行以下步骤

1.留言项输入内容,然后通过 this.$refs.refForm.validate() 进行表单校验,这时候会报姓名项为必填项的错误;
2.然后通过事件为 model.name 赋值,例如 this.model = Object.assign(this.model, { name: '123' }),赋值后重新进行表单校验,此时依旧报姓名项为必填项的错误;

其他现象

3.打印 this.model ,得到的是正确的值

console.log(this.model) // { name: '123', notes: '之前输入的内容' }

4.直接在 input 输入框上填写内容,把内容从 ‘123’,改为 ‘test’,填写完后,刚填写的 ‘test’ 又变回了 ‘123’,打印 this.model ,得到的是新的值

console.log(this.model) // { name: 'test', notes: '之前输入的内容' }

后续判断为 this.model 对象失去了响应性。

解决

去搜相关内容,搜到的大都说 Object.assign() 会保留对象的响应性,直接赋值才会丢失响应性

this.model = Object.assign(this.model, { name: '123' }) // 保留响应性 ?
this.model = { name: '123', notes: '之前输入的内容' } // 丢失响应性 ?

但根据实际情况和这个问题的表现,证明 this.model = Object.assign(this.model, { name: '123' }) 这样也会丢失响应性。
最终的解决方法在官方文档 深入响应式原理 这部分

有时你可能需要为已有对象赋值多个新 property,比如使用 Object.assign() 或 _.extend()。但是,这样添加到对象上的新 property 不会触发更新。在这种情况下,你应该用原对象与要混合进去的对象的 property 一起创建一个新的对象。

// 代替 `Object.assign(this.someObject, { a: 1, b: 2 })`
this.someObject = Object.assign({}, this.someObject, { a: 1, b: 2 })

所以实际是:

this.model = Object.assign(this.model, { name: '123' }) // 丢失响应性

this.model = Object.assign({}, this.model, { name: '123' }) // 保留响应性

标签:name,Object,校验,表单,123,Vue2,model,assign
From: https://www.cnblogs.com/FanJPson/p/17901517.html

相关文章

  • vue2 中 el-table 实现树形列表,支持增删改等操作
    需求场景:el-table构造一个树形列表,支持新增节点,删除,修改等操作。实现效果思路 一般的el-table增删改,我们都很熟悉;关键在于实现一个纯前端的树形列表,最终再调接口存列表数据。     树形el-table,需要设置 row-key,一般为id,所以每新增一条数据,都必须有id。需......
  • MIRO相关的增强,EXTENSION,校验替代
    EXTENSION:  校验替代: BADI:INVOICE_UPDATE点击保存按钮或模拟过账,校验直接message报错,替代改内存 ......
  • 【转载】SpringBoot2.x使用Assert校验(非单元测试)
    参考https://blog.csdn.net/yangshangwei/article/details/123105926环境环境版本操作windows10JDK11Springboot2.3.12.RELEASE注意引入的包为importorg.springframework.util.Assert;介绍对象和类型断言函数说明notNull()假设对......
  • 在线表单有什么特点?可以用在哪些行业?
    随着各行各业行业竞争越来越激烈,很多企业需要找到能提升办公效率的工具来提质增效。传统的表单制作工具虽然有其可取的地方,但是在满足不断激增和复杂化的业务量方面,明显表现得比较吃力。采用低代码在线表单制作工具,可以实现可视化设计,简单又灵活、操作简便又好维护,是不少行业里常......
  • CRC校验计算
    循环冗余校验(英语:Cyclicredundancycheck,通称“CRC”)是数据通信领域中最常用的一种查错校验码,其特征是信息字段和校验字段的长度可以任意选定。循环冗余检查(CRC)是一种数据传输检错功能,对数据进行多项式计算,并将得到的结果附在帧的后面,接收设备也执行类似的算法,以保证数据传输的正......
  • element-ui表单校验|标红提示
    elementUI表单校验1.表单上加rules{object}(常用)增加普通校验规则<el-form:model="form":rules="rules"ref="form"><el-form-itemlabel="姓名:":label-width="formLabelWidth"prop="uname"><el-in......
  • vue2项目webpack打包的优化策略,降低打包文件后的大小
    1.区分开发模式和打包模式的main.js入口文件首先,在项目的根目录下创建一个名为vue.config.js的文件(如果已存在,请跳过此步骤)。然后对于你的项目中的mian.js新建一个相同内容的js文件,然后将这2个mian.js文件分别命名为打包模式的入口文件:main-prod.js开发模式的入口文件:mian-dev.js......
  • vue2环境变量配置开发环境和生产环境
    在项目根目录下新建.env文件写入变量比如本地链接VUE_APP_BASE_API=http://127.0.0.1:5000/在读取的时候使用process.env.VUE_APP_BASE_API就可以读到这个全局变量process.env.NODE_ENV有两个值开发环境:development,部署环境:production都为Srting字符串下面示例给baseurl添......
  • 【APP小程序测试】APP抓包Frida反代理绕过和证书校验绕过
    前期准备逍遥模拟器Burp(抓包)测试APPfridawiresharkr0capture反代理和证书校验绕过解决app证书校验无法抓包问题使用工具:FridaFirda是一款易用的跨平Hook工具,Java层到Native层的Hook无所不能,是一种动态的插桩工具,可以插入代码到原生App的内存空间中,动态的......
  • 动态表单存储设计
    转载:https://www.yesdotnet.com/archive/post/1637668579.html目录前言方案一:动态添加字段方案二:预留空白字段,动态分配方案三:属性使用KEY/VALUE格式存储方案四:MongoDB方案设计总结前言Flowable,Activiti等开源解决方案所提供的表单引擎是没有业务表单数据持久化......