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 相关文章推荐
10个新的最有前途的JavaScript框架
Mar 12 Javascript
JQuery中$之选择器用法介绍
Apr 05 Javascript
js模仿hover的具体实现代码
Dec 30 Javascript
JS中捕获console.log()输出的方法
Apr 16 Javascript
js实现的彩色方块飞舞奇幻效果
Jan 27 Javascript
jquery动态切换背景图片的简单实现方法
May 14 Javascript
jQuery购物车插件jsorder用法(支持后台处理程序直接转换成DataTable处理)
Jun 08 Javascript
js 动态给元素添加、移除事件的实现方法
Jul 19 Javascript
Vue.js实现表格动态增加删除的方法(附源码下载)
Jan 20 Javascript
JS实现页面跳转与刷新的方法汇总
Aug 30 Javascript
解决LayUI数据表格复选框不居中显示的问题
Sep 25 Javascript
JavaScript实现串行请求的示例代码
Sep 14 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 获得汉字拼音首字母的函数
2009/08/01 PHP
php中随机显示图片的函数代码
2011/06/23 PHP
PHP __autoload函数(自动载入类文件)的使用方法
2012/02/04 PHP
PHP使用GIFEncoder类生成gif动态滚动字幕
2014/07/01 PHP
php根据用户语言跳转相应网页
2015/11/04 PHP
PHP对象的浅复制与深复制的实例详解
2017/10/26 PHP
Yii2框架实现利用mpdf创建pdf文件功能示例
2019/02/08 PHP
PHP中“=>
2019/03/01 PHP
laravel 修改记住我功能的cookie保存时间的方法
2019/10/14 PHP
Nigma vs Alliance BO5 第一场2.14
2021/03/10 DOTA
jquery.validate分组验证代码
2011/03/17 Javascript
ExtJS下 Ext.Direct加载和提交过程排错小结
2013/04/02 Javascript
js创建一个input数组并绑定click事件的方法
2014/06/12 Javascript
使用AngularJS创建自定义的过滤器的方法
2015/06/18 Javascript
BootStrap table使用方法分析
2016/11/08 Javascript
jQuery简单实现MD5加密的方法
2017/03/03 Javascript
AngularJS 防止页面闪烁的方法
2017/03/09 Javascript
JS验证全角与半角及相互转化的介绍
2017/05/18 Javascript
javascript实现文字无缝滚动效果
2017/08/26 Javascript
Vue2 模板template的四种写法总结
2018/02/23 Javascript
PostgreSQL Node.js实现函数计算方法示例
2019/02/12 Javascript
[02:38]DOTA2超级联赛专访Loda 认为IG世界最强
2013/05/27 DOTA
Windows下安装python2和python3多版本教程
2017/03/30 Python
Python_查看sqlite3表结构,查询语句的示例代码
2019/07/17 Python
python中的RSA加密与解密实例解析
2019/11/18 Python
Python warning警告出现的原因及忽略方法
2020/01/31 Python
Python中断多重循环的几种方式详解
2020/02/10 Python
python 绘制国旗的示例
2020/09/27 Python
详解Canvas事件绑定
2018/06/27 HTML / CSS
Rowdy Gentleman服装和配饰:美好时光
2019/09/24 全球购物
《乌鸦和狐狸》教学反思
2014/02/08 职场文书
《大海那边》教学反思
2014/04/09 职场文书
触电现场处置方案
2014/05/14 职场文书
股东合作协议书
2014/09/12 职场文书
2015年重阳节活动总结
2015/03/24 职场文书
Python中seaborn库之countplot的数据可视化使用
2021/06/11 Python