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字典探测用户名工具
Oct 05 Javascript
基于jquery的地址栏射击游戏代码
Mar 10 Javascript
StringTemplate遇见jQuery冲突的解决方法
Sep 22 Javascript
根据json字符串生成Html的一种方式
Jan 09 Javascript
js实现简洁大方的二级下拉菜单效果代码
Sep 01 Javascript
基于Phantomjs生成PDF的实现方法
Nov 07 Javascript
JavaScript实现移动端轮播效果
Jun 06 Javascript
详解vue-router 路由元信息
Sep 13 Javascript
layui radio性别单选框赋值方法
Aug 15 Javascript
Vue中Quill富文本编辑器的使用教程
Sep 21 Javascript
何时/使用 Vue3 render 函数的教程详解
Jul 25 Javascript
微信小程序实现页面左右滑动
Nov 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
php遍历所有文件及文件夹的方法深入解析
2013/06/08 PHP
全面了解PHP中的全局变量
2016/06/17 PHP
PHP中define() 与 const定义常量的区别详解
2019/06/25 PHP
Javascript 中 null、NaN和undefined的区别总结
2013/04/10 Javascript
Javascript事件实例详解
2013/11/06 Javascript
js中settimeout方法加参数
2014/02/28 Javascript
jQuery实现网页顶部固定导航效果代码
2015/12/24 Javascript
js控制文本框只能输入中文、英文、数字与指定特殊符号的实现代码
2016/09/09 Javascript
使用jsonp实现跨域获取数据实例讲解
2016/12/25 Javascript
jQuery插件HighCharts实现的2D对数饼图效果示例【附demo源码下载】
2017/03/09 Javascript
微信小程序商品到详情的实现
2017/06/27 Javascript
基于JS实现仿京东搜索栏随滑动透明度渐变效果
2017/07/10 Javascript
js中console在一行内打印字符串和对象的方法
2019/09/10 Javascript
浅谈vue异步数据影响页面渲染
2019/10/29 Javascript
jQuery实现聊天对话框
2020/02/08 jQuery
Vue js with语句原理及用法解析
2020/09/03 Javascript
[56:45]DOTA2上海特级锦标赛D组小组赛#1 EG VS COL第一局
2016/02/28 DOTA
python通过pil为png图片填充上背景颜色的方法
2015/03/17 Python
一个月入门Python爬虫学习,轻松爬取大规模数据
2018/01/03 Python
详解Python核心编程中的浅拷贝与深拷贝
2018/01/07 Python
详解python字节码
2018/02/07 Python
Python中property属性实例解析
2018/02/10 Python
树莓派动作捕捉抓拍存储图像脚本
2019/06/22 Python
Python实现语音识别和语音合成功能
2019/09/20 Python
python字符串,元组,列表,字典互转代码实例详解
2020/02/14 Python
THE OUTNET英国官网:国际设计师品牌折扣网站
2016/08/14 全球购物
英国户外装备商店:Ultimate Outdoors
2019/05/07 全球购物
什么是用户模式(User Mode)与内核模式(Kernel Mode) ?
2015/09/07 面试题
《识字五》教学反思
2014/03/01 职场文书
大学毕业感言200字
2014/03/09 职场文书
市政管理求职信范文
2014/05/07 职场文书
法定代表人身份证明书(含说明)
2014/10/02 职场文书
2015年超市工作总结
2015/04/09 职场文书
2015初一年级组工作总结
2015/07/24 职场文书
深入详解JS函数的柯里化
2021/06/09 Javascript
深入理解mysql事务隔离级别和存储引擎
2022/04/12 MySQL