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如何从listbox里同时删除多个项目
Oct 12 Javascript
jQuery中bind,live,delegate与one方法的用法及区别解析
Dec 30 Javascript
jquery做的一个简单的屏幕锁定提示框
Mar 26 Javascript
jQuery实现鼠标可拖动调整表格列宽度
May 26 Javascript
Eclipse引入jquery报错如何解决
Dec 01 Javascript
Bootstrap响应式导航由768px变成992px的实现代码
Jun 15 Javascript
Node.js中流(stream)的使用方法示例
Jul 16 Javascript
vue 计时器组件的实现代码
Sep 14 Javascript
vue 登录滑动验证实现代码
Aug 24 Javascript
解决betterScroll在vue中存在图片时,出现拉不动的问题
Sep 27 Javascript
vue-cli基础配置及webpack配置修改的完整步骤
Oct 20 Javascript
微信小程序实现音乐播放页面布局
Dec 11 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合并数组+与array_merge的区别分析
2010/08/01 PHP
php动态变量定义及使用
2015/06/10 PHP
php注册登录系统简化版
2020/12/28 PHP
PHP培训要多少钱
2017/06/06 PHP
php设计模式之工厂方法模式分析【星际争霸游戏案例】
2020/01/23 PHP
Extjs Ajax 乱码问题解决方案
2009/04/15 Javascript
javascript 浏览器判断 绑定事件 arguments 转换数组 数组遍历
2009/07/06 Javascript
JQuery入门—JQuery程序的代码风格详细介绍
2013/01/03 Javascript
JS链式调用的实现方法
2013/03/07 Javascript
JavaScript strike方法入门实例(给字符串加上删除线)
2014/10/17 Javascript
浅谈JavaScript事件绑定的常用方法及其优缺点分析
2016/11/01 Javascript
详谈Angular 2+ 的表单(一)之模板驱动型表单
2017/04/25 Javascript
javascript实现非常简单的小数取整功能示例
2017/06/13 Javascript
react-navigation 如何判断用户是否登录跳转到登录页的方法
2017/12/01 Javascript
nodejs实现连接mongodb数据库的方法示例
2018/03/15 NodeJs
Node.js Windows Binary二进制文件安装方法
2019/05/16 Javascript
jquery图片预览插件实现方法详解
2019/07/18 jQuery
Echarts实现多条折线可拖拽效果
2019/12/19 Javascript
详解webpack-dev-middleware 源码解读
2020/03/23 Javascript
编写Python的web框架中的Model的教程
2015/04/29 Python
Python实现注册登录系统
2017/08/08 Python
分析Python中解析构建数据知识
2018/01/20 Python
tensorflow TFRecords文件的生成和读取的方法
2018/02/06 Python
Python实现线程状态监测简单示例
2018/03/28 Python
Python requests模块实例用法
2019/02/11 Python
Python异常处理例题整理
2019/07/07 Python
SELENIUM自动化模拟键盘快捷键操作实现解析
2019/10/28 Python
python opencv根据颜色进行目标检测的方法示例
2020/01/15 Python
Python中关于logging模块的学习笔记
2020/06/03 Python
Python 添加文件注释和函数注释操作
2020/08/09 Python
swtich是否能作用在byte上,是否能作用在long上,是否能作用在String上
2013/07/06 面试题
PyQt 如何创建自定义QWidget
2021/03/24 Python
北大研究生linux应用求职信
2013/10/29 职场文书
花木兰观后感
2015/06/10 职场文书
2015元旦感言
2015/12/09 职场文书
如何基于python实现单目三维重建详解
2022/06/25 Python