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语言本身谈项目实战
Dec 27 Javascript
学习ExtJS border布局
Oct 08 Javascript
最佳的addEvent事件绑定是怎样诞生的
Oct 24 Javascript
jQuery is()函数用法3例
May 06 Javascript
用box固定长宽实现图片自动轮播js代码
Jun 09 Javascript
javascript中日期函数new Date()的浏览器兼容性问题
Sep 05 Javascript
JS实现的新浪微博大厅文字内容滚动效果代码
Nov 05 Javascript
JavaScript中各种引用类型的常用操作方法小结
May 05 Javascript
Javascript 闭包详解及实例代码
Nov 30 Javascript
AngularJS实现网站换肤实例
Feb 19 Javascript
javascript 判断用户有没有操作页面
Oct 17 Javascript
vue 实现tab切换保持数据状态
Jul 21 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第一季视频教程(李炎恢+php100 不断更新)
2011/05/29 PHP
PHP屏蔽蜘蛛访问代码及常用搜索引擎的HTTP_USER_AGENT
2013/03/06 PHP
php class中self,parent,this的区别以及实例介绍
2013/04/24 PHP
php上传图片获取路径及给表单字段赋值的方法
2016/01/23 PHP
filemanage功能中用到的lib.js
2007/04/08 Javascript
Uglifyjs(JS代码优化工具)入门 安装使用
2020/04/13 Javascript
JAVASCRIPT模式窗口中下载文件无法接收iframe的流
2013/10/11 Javascript
举例讲解JavaScript substring()的使用方法
2015/11/09 Javascript
Bootstrap所支持的表单控件实例详解
2016/05/16 Javascript
js实现控制textarea输入字符串的个数,鼠标按下抬起判断输入字符数
2016/10/25 Javascript
Node.js连接MongoDB数据库产生的问题
2017/02/08 Javascript
javascript 动态生成css代码的两种方法
2017/03/17 Javascript
vue自定义全局组件(自定义插件)的用法
2018/01/30 Javascript
JS简单判断是否在微信浏览器打开的方法示例
2019/01/08 Javascript
详解微信小程序胶囊按钮返回|首页自定义导航栏功能
2019/06/14 Javascript
JS eval代码快速解密实例解析
2020/04/23 Javascript
python中将阿拉伯数字转换成中文的实现代码
2011/05/19 Python
理解Python中的With语句
2015/02/02 Python
python中sleep函数用法实例分析
2015/04/29 Python
深入讲解Python编程中的字符串
2015/10/14 Python
Python实现获取命令行输出结果的方法
2017/06/10 Python
Python实现七彩蟒蛇绘制实例代码
2018/01/16 Python
Python读取Word(.docx)正文信息的方法
2018/03/15 Python
对Python使用mfcc的两种方式详解
2019/01/09 Python
pymysql模块的操作实例
2019/12/17 Python
python使用SQLAlchemy操作MySQL
2020/01/02 Python
在tensorflow实现直接读取网络的参数(weight and bias)的值
2020/06/24 Python
CSS3实现圆角、阴影、透明效果并兼容各大浏览器
2014/08/08 HTML / CSS
简单介绍Object类的功能、常用方法
2013/10/02 面试题
2014年道德讲堂实施方案
2014/03/05 职场文书
党校培训自我鉴定范文
2014/03/20 职场文书
小学优秀班主任材料
2014/12/17 职场文书
顶岗实习计划书
2015/01/16 职场文书
vue如何批量引入组件、注册和使用详解
2021/05/12 Vue.js
如何利用golang运用mysql数据库
2022/03/13 Golang
我国拿下天问一号火星着陆区附近 22 个地理实体命名:平乐、西柏坡、古田、漠河等
2022/04/29 数码科技