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页面滚动浮动层智能定位实例代码
Aug 23 Javascript
深入分析js中的constructor和prototype
Apr 07 Javascript
推荐JavaScript实现继承的最佳方式
Nov 11 Javascript
基于JavaScript实现鼠标悬浮弹出跟随鼠标移动的带箭头的信息层
Jan 18 Javascript
jQuery实现指定区域外单击关闭指定层的方法【经典】
Jun 22 Javascript
javascirpt实现2个iframe之间传值的方法
Jun 30 Javascript
微信小程序 navigation API实例详解
Oct 02 Javascript
用jquery快速解决IE输入框不能输入的问题
Oct 04 Javascript
微信小程序 MINA文件结构
Oct 17 Javascript
vue router动态路由下让每个子路由都是独立组件的解决方案
Apr 24 Javascript
Vuex新手的理解与使用详解
May 31 Javascript
详解JavaScript之Array.reduce源码解读
Nov 01 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
4.与数据库的连接
2006/10/09 PHP
php遍历所有文件及文件夹的方法深入解析
2013/06/08 PHP
php生成excel列名超过26列大于Z时的解决方法
2014/12/29 PHP
php自动加载方式集合
2016/04/04 PHP
PHP的消息通信机制测试实例
2016/11/10 PHP
JavaScript prototype属性使用说明
2010/05/13 Javascript
不使用中间变量,交换int型的 a, b两个变量的值。
2010/10/29 Javascript
基于jquery的固定表头和列头的代码
2012/05/03 Javascript
简单的两种Extjs formpanel加载数据的方式
2013/11/09 Javascript
JS跨域问题详解
2014/11/25 Javascript
EasyUi datagrid 实现表格分页
2015/02/10 Javascript
移除AngularJS下URL中的#字符的方法
2015/06/19 Javascript
JS实现三个层重叠点击互相切换的方法
2015/10/06 Javascript
浅析$.getJSON异步请求和同步请求
2016/06/06 Javascript
移动适配的几种方案(三种方案)
2016/11/25 Javascript
Bootstrap导航简单实现代码
2017/03/06 Javascript
jQuery实现验证表单密码一致性及正则表达式验证邮箱、手机号的方法
2017/12/05 jQuery
一个Vue页面的内存泄露分析详解
2018/06/25 Javascript
基于vue循环列表时点击跳转页面的方法
2018/08/31 Javascript
ES6基础之解构赋值(destructuring assignment)
2019/02/21 Javascript
JS开发自己的类库实例分析
2019/08/28 Javascript
layui table 表格模板按钮的实例代码
2019/09/21 Javascript
python编写网页爬虫脚本并实现APScheduler调度
2014/07/28 Python
python基础之入门必看操作
2017/07/26 Python
Python多线程扫描端口代码示例
2018/02/09 Python
Python装饰器简单用法实例小结
2018/12/03 Python
python的set处理二维数组转一维数组的方法示例
2019/05/31 Python
基于TensorBoard中graph模块图结构分析
2020/02/15 Python
Python通过2种方法输出带颜色字体
2020/03/02 Python
夏威夷航空官网:Hawaiian Airlines
2016/09/11 全球购物
法务专员岗位职责
2014/01/02 职场文书
2014年司法局工作总结
2014/12/11 职场文书
党员反邪教心得体会
2016/01/15 职场文书
2016年教育局“我们的节日——端午节”主题活动总结
2016/04/01 职场文书
私人贷款担保书该怎么写呢?
2019/07/02 职场文书
python和Appium的移动端多设备自动化测试框架
2022/04/26 Python