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的对话框详解与参数
Mar 08 Javascript
基于jquery的下拉框改变动态添加和删除表格实现代码
Sep 12 Javascript
原生js实现查找/添加/删除/指定元素的class
Apr 12 Javascript
js获取某元素的class里面的css属性值代码
Jan 16 Javascript
基于Jquery实现表单验证
Jul 20 Javascript
Js 获取、判断浏览器版本信息的简单方法
Aug 08 Javascript
Bootstrap基本组件学习笔记之列表组(11)
Dec 07 Javascript
JS库之wow.js使用方法
Sep 14 Javascript
mongoose更新对象的两种方法示例比较
Dec 19 Javascript
JS实现将二维数组转为json格式字符串操作示例
Jul 12 Javascript
如何用JS模拟实现数组的map方法
Jul 30 Javascript
JavaScript文档对象模型DOM
Nov 20 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 杂谈《重构-改善既有代码的设计》之三 重新组织数据
2012/04/09 PHP
PHP变量内存分配问题记录整理
2013/11/27 PHP
PHP如何通过AJAX方式实现登录功能
2015/11/23 PHP
PHP实现基于图的深度优先遍历输出1,2,3...n的全排列功能
2017/11/10 PHP
PHP随机数函数rand()与mt_rand()的讲解
2019/03/25 PHP
JS加ASP二级域名转向的代码
2007/05/17 Javascript
extJs 下拉框联动实现代码
2010/04/09 Javascript
javascript:;与javascript:void(0)使用介绍
2013/06/05 Javascript
js获取电脑分辨率的思路及操作
2013/11/22 Javascript
jquery实现鼠标滑过小图时显示大图的方法
2015/01/14 Javascript
jQuery删除一个元素后淡出效果展示删除过程的方法
2015/03/18 Javascript
AngularJS基础知识笔记之表格
2015/05/10 Javascript
jQuery事件绑定on()、bind()与delegate() 方法详解
2015/06/03 Javascript
js从数组中删除指定值(不是指定位置)的元素实现代码
2016/09/13 Javascript
js浏览器html5表单验证
2016/10/17 Javascript
浅析jsopn跨域请求原理及cors(跨域资源共享)的完美解决方法
2017/02/06 Javascript
解决layui弹框失效的问题
2019/09/09 Javascript
简单实现节流函数和防抖函数过程解析
2019/10/08 Javascript
Python中的filter()函数的用法
2015/04/27 Python
Python使用 Beanstalkd 做异步任务处理的方法
2018/04/24 Python
用python标准库difflib比较两份文件的异同详解
2018/11/16 Python
在Django model中设置多个字段联合唯一约束的实例
2019/07/17 Python
Python 离线工作环境搭建的方法步骤
2019/07/29 Python
pytorch程序异常后删除占用的显存操作
2020/01/13 Python
基于Tensorflow读取MNIST数据集时网络超时的解决方式
2020/06/22 Python
ManoMano英国:欧洲第一家专注于DIY和园艺市场的电商平台
2020/03/12 全球购物
护士岗位求职应聘自荐书范文
2014/02/12 职场文书
《在大海中永生》教学反思
2014/02/24 职场文书
国际经济与贸易专业大学生职业规划书
2014/03/01 职场文书
党员批评与自我批评发言稿
2014/10/14 职场文书
毕业生党员个人总结
2015/02/14 职场文书
2015年派出所工作总结
2015/04/24 职场文书
人为什么会“幸灾乐祸”?
2019/08/06 职场文书
MySQL 外键约束和表关系相关总结
2021/06/20 MySQL
教你使用一行Python代码玩遍童年的小游戏
2021/08/23 Python
浅谈JavaScript作用域
2021/12/06 Javascript