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写的操作系统
Apr 23 Javascript
非常漂亮的JS代码经典广告
Oct 21 Javascript
JavaScript中的prototype使用说明
Apr 13 Javascript
Javascript中的window.event.keyCode使用介绍
Apr 26 Javascript
一个关于jqGrid使用的小例子(行按钮)
Nov 04 Javascript
为EasyUI的Tab标签添加右键菜单的方法
Jul 14 Javascript
用js控制组织结构图可以任意拖拽到指定位置
Jan 17 Javascript
微信小程序 表单Form实例详解(附源码)
Dec 22 Javascript
浅谈js中function的参数默认值
Feb 20 Javascript
JS实现自动轮播图效果(自适应屏幕宽度+手机触屏滑动)
Jun 19 Javascript
JS实现点击链接切换显示隐藏内容的方法
Oct 19 Javascript
js HTML DOM EventListener功能与用法实例分析
Apr 27 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
Yii操作数据库的3种方法
2014/03/11 PHP
php获得文件大小和文件创建时间的方法
2015/03/13 PHP
基于PHP微信红包的算法探讨
2016/07/21 PHP
PHP面向对象多态性实现方法简单示例
2017/09/27 PHP
PHP的cookie与session原理及用法详解
2019/09/27 PHP
jQuery 事件队列调整方法
2009/09/18 Javascript
JavaScript的document对象和window对象详解
2010/12/30 Javascript
Dom操作之兼容技巧分享
2011/09/20 Javascript
JQUERY对单选框(radio)操作的小例子
2013/04/25 Javascript
Jquery带搜索框的下拉菜单
2013/05/06 Javascript
利用jQuery简单实现产品展示图片左右滚动功能(示例代码)
2014/01/02 Javascript
jquery中对于批量deferred的处理方法
2014/01/22 Javascript
javaScript中push函数用法实例分析
2015/06/08 Javascript
JavaScript函数学习总结以及相关的编程习惯指南
2015/11/16 Javascript
javascript实现倒计时跳转页面
2016/01/17 Javascript
js实现div在页面拖动效果
2016/05/04 Javascript
详解nodejs与javascript中的aes加密
2016/05/22 NodeJs
利用JS提交表单的几种方法和验证(必看篇)
2016/09/17 Javascript
AngularJs $parse、$eval和$observe、$watch详解
2016/09/21 Javascript
基于MVC方式实现三级联动(JavaScript)
2017/01/23 Javascript
简述Angular 5 快速入门
2017/11/04 Javascript
vue组件父子间通信之综合练习(聊天室)
2017/11/07 Javascript
bootstrap动态调用select下拉框的实例代码
2018/08/09 Javascript
JavaScript事件发布/订阅模式原理与用法分析
2018/08/21 Javascript
vue路由传参页面刷新参数丢失问题解决方案
2019/10/08 Javascript
[00:32]2018DOTA2亚洲邀请赛出场——LGD
2018/04/04 DOTA
浅谈Matplotlib简介和pyplot的简单使用——文本标注和箭头
2018/01/09 Python
查看python下OpenCV版本的方法
2018/08/03 Python
python字符串替换第一个字符串的方法
2019/06/26 Python
python getpass模块用法及实例详解
2019/10/07 Python
详解淘宝H5 sign加密算法
2020/08/25 HTML / CSS
End Clothing美国站:英国男士潮牌商城
2018/04/20 全球购物
写出SQL四条最基本的数据操作语句(DML)
2012/12/12 面试题
女儿满月酒致辞
2015/07/29 职场文书
springboot中的pom文件 project报错问题
2022/01/18 Java/Android
python实现学员管理系统(面向对象版)
2022/06/05 Python