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

所属分类: 网络编程 / JavaScript 阅读数: 1821
收藏 0 赞 0 分享

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对象重新赋值无效(未更改)的解决方式就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。

更多精彩内容其他人还在看

js单独获取一个checkbox看其是否被选中

这篇文章主要与大家分享js获取一个checkbox看其是否被选中的具体实现,很简单,但很实用,需要的朋友可以参考下
收藏 0 赞 0 分享

js变量、作用域及内存详解

本文主要详细分析了JS变量,作用域以及内存问题,同时附上非常多的实例,方便大家理解这3个概念,是篇不可多得的文章,希望对大家有所帮助
收藏 0 赞 0 分享

深入理解javascript作用域和闭包

作用域和作用域链是javascript中非常重要的特性,对于他们的理解直接关系到对于整个javascript体系的理解,而闭包又是对作用域的延伸,也是在实际开发中经常使用的一个特性,实际上,不仅仅是javascript,在很多语言中都提供了闭包的特性。
收藏 0 赞 0 分享

IE6 hack for js 集锦

本文主要讲诉了使用js实现网站功能兼容IE6,非常的实用的小技巧,有需要的朋友可以参考下
收藏 0 赞 0 分享

Javascript的setTimeout()使用闭包特性时需要注意的问题

这篇文章主要介绍了Javascript的setTimeout(0)使用闭包特性时需要注意的问题,需要的朋友可以参考下
收藏 0 赞 0 分享

常用的jquery模板插件——jQuery Boilerplate介绍

Query Boilerplate是一个不错的jQuery插件开发工具,使用这个工具可以帮助你快速的构建一个jQuery框架。这个工具提供你很多评论用以帮助你使得开发变得简单和直接,它是个真正的面对对象的工具,你可以实现公开或者私有的方法或者公开或者私有的属性。
收藏 0 赞 0 分享

深入理解javascript构造函数和原型对象

对象,是javascript中非常重要的一个梗,是否能透彻的理解它直接关系到你对整个javascript体系的基础理解,说白了,javascript就是一群对象在搅。。(哔!)。
收藏 0 赞 0 分享

深入理解javascript原型链和继承

这篇文章主要介绍了javascript原型链和继承的概念,以及使用原型链实现继承、经典继承、组合式继承、寄生组合式继承。非常实用,是篇非常不错的文章,这里推荐给大家。
收藏 0 赞 0 分享

再探JavaScript作用域

这篇文章主要介绍了再探JavaScript作用域,本文用简洁的语言和直观的测试结果图片给大家讲解JavaScript的作用域,需要的朋友可以参考下
收藏 0 赞 0 分享

JavaScript获取图片真实大小代码实例

这篇文章主要介绍了JavaScript获取图片真实大小代码实例,本文使用onload事件来获取图片的真实大小,需要的朋友可以参考下
收藏 0 赞 0 分享
查看更多