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 相关文章推荐
jQuery使用andSelf()来包含之前的选择集
May 19 Javascript
jquery实现翻动fadeIn显示的方法
Mar 05 Javascript
JavaScript脚本判断蜘蛛来源的方法
Sep 22 Javascript
JavaScript实现点击单元格改变背景色的方法
Feb 12 Javascript
javascript下使用Promise封装FileReader
Feb 19 Javascript
JavaScript中setter和getter方法介绍
Jul 11 Javascript
js 函数式编程学习笔记
Mar 25 Javascript
Javascript读写cookie的实例源码
Mar 16 Javascript
vue 解除鼠标的监听事件的方法
Nov 13 Javascript
微信小程序 wx:for 与 wx:for-items 与 wx:key的正确用法
May 19 Javascript
javascript实现前端分页功能
Nov 26 Javascript
Nest.js 授权验证的方法示例
Feb 22 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判断远程url是否有效的几种方法小结
2011/10/08 PHP
PHP 实现explort() 功能的详解
2013/06/20 PHP
Laravel 自定命令以及生成文件的例子
2019/10/23 PHP
动感效果的TAB选项卡jquery 插件
2011/07/09 Javascript
JavaScript在多浏览器下for循环的使用方法
2012/11/07 Javascript
javascript将浮点数转换成整数的三个方法
2014/06/23 Javascript
Jquery中$.post和$.ajax的用法小结
2015/04/28 Javascript
Javascript中Array用法实例分析
2015/06/13 Javascript
JavaScript取得WEB安全颜色列表的方法
2015/07/14 Javascript
原生js实现网易轮播图效果
2020/04/10 Javascript
微信小程序 绘图之饼图实现
2016/10/24 Javascript
jsp 网站引入外部css或者js失效问题解决
2016/10/31 Javascript
获取JavaScript异步函数的返回值
2016/12/21 Javascript
详解vue-cli + webpack 多页面实例应用
2017/04/25 Javascript
详解基于 axios 的 Vue 项目 http 请求优化
2017/09/04 Javascript
Vue 2.0学习笔记之Vue中的computed属性
2017/10/16 Javascript
npm 下载指定版本的组件方法
2018/05/17 Javascript
2分钟实现一个Vue实时直播系统的示例代码
2020/06/05 Javascript
js正则表达式简单校验方法
2021/01/03 Javascript
Python实现SMTP发送邮件详细教程
2021/03/02 Python
Python实现简单求解给定整数的质因数算法示例
2018/03/25 Python
python随机取list中的元素方法
2018/04/08 Python
手把手教你Python yLab的绘制折线图的画法
2019/10/23 Python
Python 用turtle实现用正方形画圆的例子
2019/11/21 Python
python获取array中指定元素的示例
2019/11/26 Python
html5 Canvas画图教程(9)—canvas中画出矩形和圆形
2013/01/09 HTML / CSS
cosme官方海外旗舰店:日本最大化妆品和美容产品的综合口碑网站
2017/01/18 全球购物
女性时尚网购:Chic Me
2019/07/30 全球购物
Zooplus罗马尼亚:宠物食品和配件
2019/11/02 全球购物
Android interview questions
2016/12/25 面试题
初中考试作弊检讨书
2014/02/01 职场文书
烹饪自我鉴定
2014/03/01 职场文书
消防安全责任书范本
2014/04/15 职场文书
党干部专题民主生活会对照检查材料思想汇报
2014/10/06 职场文书
小爸爸观后感
2015/06/15 职场文书
会计主管竞聘书
2015/09/15 职场文书