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 相关文章推荐
用js实现输入提示(自动完成)的实例代码
Jun 14 Javascript
JS实现随机数生成算法示例代码
Aug 08 Javascript
js控制多图左右滚动切换效果代码分享
Aug 26 Javascript
利用jQuery中的ajax分页实现代码
Feb 25 Javascript
深入解析jQuery中Deferred的deferred.promise()方法
May 03 Javascript
jQuery实现的仿百度,仿谷歌搜索下拉框效果示例
Dec 30 Javascript
Mongoose学习全面理解(推荐)
Jan 21 Javascript
js实现显示手机号码效果
Mar 09 Javascript
jQuery实现菜单栏导航效果
Aug 15 jQuery
Vue中的基础过渡动画及实现原理解析
Dec 04 Javascript
详解vue配置后台接口方式
Mar 29 Javascript
AJAX实现省市县三级联动效果
Oct 16 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
PHP4 与 MySQL 交互使用
2006/10/09 PHP
NT IIS下用ODBC连接数据库
2006/10/09 PHP
php随机取mysql记录方法小结
2014/12/27 PHP
php使用正则表达式获取图片url的方法
2015/01/16 PHP
PHP简单实现欧拉函数Euler功能示例
2017/11/06 PHP
php-msf源码详解
2017/12/25 PHP
php下的原生ajax请求用法实例分析
2020/02/28 PHP
ThinkPHP 框架实现的读取excel导入数据库操作示例
2020/04/14 PHP
jQuery ajax serialize()方法的使用以及常见问题解决
2013/01/27 Javascript
JavaScript实现维吉尼亚(Vigenere)密码算法实例
2013/11/22 Javascript
JS中getYear()和getFullYear()区别分析
2014/07/04 Javascript
jQuery/CSS3图片特效插件整理推荐
2014/12/07 Javascript
JavaScript的Polymer框架中dom-repeat与VM的相关操作
2015/07/29 Javascript
jQuery CSS3自定义美化Checkbox实现代码
2016/05/12 Javascript
Bootstrap中的表单验证插件bootstrapValidator使用方法整理(推荐)
2016/06/21 Javascript
JavaScript跨域调用基于JSON的RESTful API
2016/07/09 Javascript
JS实现课堂随机点名和顺序点名
2017/03/09 Javascript
vue.js $refs和$emit 父子组件交互的方法
2017/12/20 Javascript
JS滚轮控制图片缩放大小和拖动的实例代码
2018/11/20 Javascript
深入浅析Vue中mixin和extend的区别和使用场景
2019/08/01 Javascript
Postman动态获取返回值过程详解
2020/06/30 Javascript
Python文件和目录操作详解
2015/02/08 Python
简单介绍Python的轻便web框架Bottle
2015/04/08 Python
Python正则抓取网易新闻的方法示例
2017/04/21 Python
Python竟能画这么漂亮的花,帅呆了(代码分享)
2017/11/15 Python
Python实现删除时保留特定文件夹和文件的示例
2018/04/27 Python
Python爬虫常用库的安装及其环境配置
2018/09/19 Python
python如何实现从视频中提取每秒图片
2020/10/22 Python
Keras构建神经网络踩坑(解决model.predict预测值全为0.0的问题)
2020/07/07 Python
意大利时尚奢侈品店:D’Aniello Boutique
2021/01/19 全球购物
叙述DBMS对数据控制功能有哪些
2016/06/12 面试题
优秀中专生推荐信
2013/11/17 职场文书
记者岗位职责
2014/01/06 职场文书
企业办公室岗位职责
2014/03/12 职场文书
慰问信格式
2015/02/14 职场文书
html5移动端禁止长按图片保存的实现
2021/04/20 HTML / CSS