vue data对象重新赋值无效(未更改)的解决方式


Posted in Javascript onJuly 24, 2020

vue存在一个比较深的问题就是data中的属性对象如果在初始化的时候为{},那么后面在方法用普通的js语法赋值会无效

这里是data

data() {
 return {
  model: {}
 };
 }

这里是方法里的普通赋值

afterUpload(response) {
 this.model.icon = response.url;
}

普通方法会无效,需要使用vue提供的方法重新显示声明

afterUpload(response) {
 this.$set(this.model,'icon',response.url)
}

补充知识:Vue.js - 数组和对象的赋值动态变化 & 克隆

这篇文章主要介绍了 vue 数组和对象不能直接赋值动态变化 & 克隆情况和解决方法,需要的朋友可以参考下。

一、直接赋值动态变化

1.1、Vue 不能检测以下变动的数组

当你利用索引直接设置一个项时,例如

vm.items[indexOfItem] = newValue

当你修改数组的长度时,例如

vm.items.length = newLength

1.2、解决方案

当第一种情况需求时,可以使用

this.$set(this.arr,index,newVal)

this.arr = [新数组]

2.1、Vue 不能检测以下变动的对象

当你修改一个初始化时,不存在的对象里的属性时

this.obj.b = 3

Ps:在不刷新页面父子组件的情况下,二次触发就可以,因为由于第一次的触发渲染,但第一次并没有触发,只有第二次会显示。

2.2、解决方案

当修改一个初始化已存在的属性,可以直接检测到动态变化

this.obj.a = 3

上面不能检测到的另一种解决方案

this.$set(this.person,'age',12)

this.obj = { a: 3, b: 4 }

当需要添加多个对象时

Object.assign({},this.person,{age:12,name:'wee'})

二、数组、对象克隆

当组件间传递对象时,由于此对象的引用类型指向的都是一个地址(除了基本类型跟null,对象之间的赋值,只是将地址指向同一个,而不是真正意义上的拷贝),如下。

数组:

var a = [1,2,3];
var b = a;
b.push(4); // b中添加了一个4
alert(a); // a变成了[1,2,3,4]

对象:

var obj = {a:10};
var obj2 = obj;
obj2.a = 20; // obj2.a改变了
alert(obj.a); // 20,obj的a跟着改变

这就是由于对象类型直接赋值,只是将引用指向同一个地址,导致修改了 obj 会导致 obj2 也被修改。

所以在 vue 中,如果多个组件引用了同一个对象作为数据,那么当其中一个组件改动对象数据时,其他对象的数据也会同步改动。有这种双向绑定的需要的话,那么自然是最好的,但如果不需要这种绑定而希望各组件的对象数据之间相互独立,即是互不关联的对象副本的话,可以用下面的方法解决。

computed: { 
 data: function () { 
  var obj={}; 
  obj=JSON.parse(JSON.stringify(this.templateData)); //this.templateData是父组件传递的对象 
  return obj 
 } 
 }

当然日常的克隆也可以使用这句关键代码

JSON.parse(JSON.stringify(...));

以上这篇vue data对象重新赋值无效(未更改)的解决方式就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
IE中jquery.form中ajax提交没反应解决方法分享
Sep 11 Javascript
不同的jQuery API来处理不同的浏览器事件
Dec 09 Javascript
解决css和js的{}与smarty定界符冲突问题的两种方法
Sep 10 Javascript
javascript计时器事件使用详解
Jan 07 Javascript
JavaScript检查某个function是否是原生代码的方法
Aug 20 Javascript
js 截取或者替换字符串中的数字实现方法
Jun 13 Javascript
jQuery实现页面点击后退弹出提示框的方法
Aug 24 Javascript
jsp 网站引入外部css或者js失效问题解决
Oct 31 Javascript
关于vue-router的beforeEach无限循环的问题解决
Sep 09 Javascript
vue项目实战总结篇
Feb 11 Javascript
vue-router懒加载速度缓慢问题及解决方法
Nov 25 Javascript
javascript 内存模型实例详解
Apr 18 Javascript
VUE项目axios请求头更改Content-Type操作
Jul 24 #Javascript
vue+axios全局添加请求头和参数操作
Jul 24 #Javascript
vue在响应头response中获取自定义headers操作
Jul 24 #Javascript
vuex存取值和映射函数使用说明
Jul 24 #Javascript
js实现金山打字通小游戏
Jul 24 #Javascript
vuex中store存储store.commit和store.dispatch的用法
Jul 24 #Javascript
js实现滑动滑块验证登录
Jul 24 #Javascript
You might like
php自动注册登录验证机制实现代码
2011/12/20 PHP
PHP基础之运算符的使用方法
2013/04/28 PHP
关于PHP自动判断字符集并转码的详解
2013/06/26 PHP
PHP基于imap获取邮件实例
2014/11/11 PHP
PHP实现采集抓取淘宝网单个商品信息
2015/01/08 PHP
PHP 5.6.11中CURL模块问题的解决方法
2016/08/08 PHP
ubuntu下安装nodejs以及升级的办法
2015/05/08 NodeJs
在Mac OS上安装使用Node.js的项目自动化构建工具Gulp
2016/06/18 Javascript
jQuery实现鼠标经过时高亮,同时其他同级元素变暗的效果
2016/09/18 Javascript
CSS3 media queries结合jQuery实现响应式导航
2016/09/30 Javascript
JS声明式函数与赋值式函数实例分析
2016/12/13 Javascript
JS实现的简单轮播图运动效果示例
2016/12/22 Javascript
详解vuejs之v-for列表渲染
2017/06/22 Javascript
AngularJS使用ocLazyLoad实现js延迟加载
2017/07/05 Javascript
还不懂递归?读完这篇文章保证你会懂
2018/07/29 Javascript
vue 属性拦截实现双向绑定的实例代码
2018/10/24 Javascript
小程序server请求微信服务器超时的解决方法
2019/05/21 Javascript
VUE 直接通过JS 修改html对象的值导致没有更新到数据中解决方法分析
2019/12/02 Javascript
JavaScript实现电灯开关小案例
2020/03/30 Javascript
Node.js API详解之 vm模块用法实例分析
2020/05/27 Javascript
[02:52]2014DOTA2西雅图国际邀请赛 CIS战队巡礼
2014/07/07 DOTA
python中的内置函数getattr()介绍及示例
2014/07/20 Python
在Python3中初学者应会的一些基本的提升效率的小技巧
2015/03/31 Python
使用Django清空数据库并重新生成
2020/04/03 Python
使用npy转image图像并保存的实例
2020/07/01 Python
python matlab库简单用法讲解
2020/12/31 Python
Css3实现无缝滚动防抖
2020/09/14 HTML / CSS
css3 利用transform打造走动的2D时钟
2020/10/20 HTML / CSS
禁毒宣传工作方案
2014/05/23 职场文书
社区科普工作方案
2014/06/03 职场文书
社区党员志愿服务活动方案
2014/08/18 职场文书
道路交通事故赔偿协议书
2014/10/24 职场文书
英语辞职信怎么写
2015/02/28 职场文书
2015年小学教师培训工作总结
2015/07/21 职场文书
详解PHP Swoole与TCP三次握手
2021/05/27 PHP
js 实现验证码输入框示例详解
2022/09/23 Javascript