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 相关文章推荐
用document.documentElement取代document.body的原因分析
Nov 12 Javascript
JavaScript高级程序设计 读书笔记之九 本地对象Array
Feb 27 Javascript
jQuery toggleClass应用实例(附效果图)
Apr 06 Javascript
基于jquery实现的图片在各种分辨率下未知的容器内上下左右居中
May 11 Javascript
jQuery插件实现适用于移动端的地址选择器
Feb 18 Javascript
Bootstrap CDN和本地化环境搭建
Oct 26 Javascript
JS实现获取汉字首字母拼音、全拼音及混拼音的方法
Nov 14 Javascript
MVVM框架下实现分页功能示例
Jun 14 Javascript
使用pkg打包ThinkJS项目的方法步骤
Dec 30 Javascript
vue中实现动态生成二维码的方法
Feb 21 Javascript
详解在Vue.js编写更好的v-for循环的6种技巧
Apr 14 Javascript
Javascript类型判断相关例题及解析
Aug 26 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实现MVC开发得最简单的方法――模型
2007/04/10 PHP
用php守护另一个php进程的例子
2015/02/13 PHP
分享php多功能图片处理类
2016/05/15 PHP
PHP5.4起内置web服务器使用方法
2016/08/09 PHP
QQ登录简单实现代码
2021/03/09 Javascript
基于jquery的一个拖拽到指定区域内的效果
2011/09/21 Javascript
Jquery图形报表插件 jqplot简介及参数详解
2012/10/10 Javascript
js加载读取内容及显示与隐藏div示例
2014/02/13 Javascript
Javascript中设置默认参数值示例
2014/09/11 Javascript
node.js实现微信JS-API封装接口的示例代码
2017/09/06 Javascript
几个你不知道的技巧助你写出更优雅的vue.js代码
2018/06/11 Javascript
jquery实现的简单轮播图功能【适合新手】
2018/08/17 jQuery
layui实现文件或图片上传记录
2018/08/28 Javascript
JS实现图片轮播效果实例详解【可自动和手动】
2019/04/04 Javascript
小程序登录/注册页面设计的实现代码
2019/05/24 Javascript
基于Taro的微信小程序模板消息-获取formId功能模块封装实践
2019/07/15 Javascript
Vue数组响应式操作及高阶函数使用代码详解
2020/08/01 Javascript
JS实现放大镜效果
2020/09/21 Javascript
聊聊vue 中的v-on参数问题
2021/01/29 Vue.js
使用TensorFlow实现简单线性回归模型
2019/07/19 Python
Python Selenium自动化获取页面信息的方法
2020/08/31 Python
python 调用API接口 获取和解析 Json数据
2020/09/28 Python
css3翻牌翻数字的示例代码
2020/02/07 HTML / CSS
Tory Burch美国官方网站:美国时尚生活品牌
2016/08/01 全球购物
EntityManager都有哪些方法
2013/11/01 面试题
初中生三年学习生活的自我评价
2013/11/03 职场文书
三个儿子教学反思
2014/02/03 职场文书
人事任命书格式
2014/06/05 职场文书
消防工作实施方案
2014/06/09 职场文书
卫生院艾滋病宣传活动小结
2014/07/09 职场文书
一份关于丢失公司财物的检讨书
2014/09/19 职场文书
2015年建筑工作总结报告
2015/05/04 职场文书
表彰大会新闻稿
2015/07/17 职场文书
导游词之无锡古运河
2019/11/14 职场文书
python前后端自定义分页器
2022/04/13 Python
Python中的socket网络模块介绍
2022/07/23 Python