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 相关文章推荐
javascript轻量级模板引擎juicer使用指南
Jun 22 Javascript
js网页右下角提示框实例
Oct 14 Javascript
在其他地方你学不到的jQuery小贴士和技巧(欢迎收藏)
Jan 20 Javascript
JQuery ztree 异步加载实例讲解
Feb 25 Javascript
jquery的ajax提交form表单的两种方法小结(推荐)
May 25 Javascript
微信小程序 wxapp视图容器 view详解
Oct 31 Javascript
JavaScript仿微博输入框效果(案例分析)
Dec 06 Javascript
JS实现HTML页面中动态显示当前时间完整示例
Jul 30 Javascript
bootstrap模态框弹出和隐藏,动态改变中间内容的实例
Aug 10 Javascript
js 实现ajax发送步骤过程详解
Jul 25 Javascript
Vue-cli assets SubDirectory及PublicPath区别详解
Aug 18 Javascript
node中使用shell脚本的方法步骤
Mar 23 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
jquery的ajax从纯真网(cz88.net)获取IP地址对应地区名
2009/12/02 Javascript
js点击页面其它地方将某个显示的DIV隐藏
2012/07/12 Javascript
将HTML的左右尖括号等转义成实体形式的两种实现方式
2014/05/04 Javascript
js 动态修改css文件用到了cssRule
2014/08/20 Javascript
JavaScript版的TwoQueues缓存模型
2014/12/29 Javascript
jQuery简单实现图片预加载
2015/04/20 Javascript
javascript中SetInterval与setTimeout的定时器用法
2015/08/24 Javascript
vue路由懒加载的实现方法
2018/03/12 Javascript
Vue.js中的extend绑定节点并显示的方法
2019/06/20 Javascript
javascript绘制简单钟表效果
2020/04/07 Javascript
多个Vue项目部署到服务器的步骤记录
2020/10/22 Javascript
[03:00]《DAC最前线》之欧美新秀VS老将
2015/02/01 DOTA
Python标准库笔记struct模块的使用
2018/02/22 Python
Numpy数组的保存与读取方法
2018/04/04 Python
python递归实现快速排序
2018/08/18 Python
APIStar:一个专为Python3设计的API框架
2018/09/26 Python
Python实现一个简单的毕业生信息管理系统的示例代码
2020/06/08 Python
Python如何telnet到网络设备
2021/02/18 Python
HQhair美国/加拿大:英国化妆品、美容及美发产品商城
2019/04/15 全球购物
澳洲CFL商城:CHEMIST FOR LESS(中文)
2021/02/28 全球购物
可靠的数据流传输TCP
2016/03/15 面试题
普通院校学生的自荐信
2013/11/27 职场文书
应用化学专业职业生涯规划书
2014/01/22 职场文书
质量承诺书怎么写
2014/05/24 职场文书
调研汇报材料范文
2014/08/17 职场文书
个人对照检查剖析材料
2014/10/13 职场文书
大学生违纪检讨书300字
2014/10/25 职场文书
2014年采购部工作总结
2014/11/20 职场文书
五四青年节活动总结
2015/02/10 职场文书
导游词范文
2015/02/13 职场文书
休学证明范本
2015/06/19 职场文书
运动会800米赞词
2015/07/22 职场文书
2016年七夕爱情寄语
2015/12/04 职场文书
导游词之岳阳楼
2019/09/25 职场文书
详解Python内置模块Collections
2022/03/22 Python
HTML 里 img 元素的 src 和 srcset 属性的区别详解
2023/05/21 HTML / CSS