时间:2021-05-25
对于刚接触vue的同学会经常遇到数据更新了但是模板没有更新的问题,下面将结合vue的响应式特性以及异步更新机制分析常见的错误:
异步更新带来的数据响应式误解
异步数据的处理基本是一定会遇到的,处理不好就会遇到数据不更新的问题,但有一种情况是在未正确处理的情况下也能正常更新,这就会造成一种误解,详情如下所示:
模板
js
上面的代码非常简单,我们都知道vue中在data里面声明的数据才具有响应式的特性,所以我们一开始在data中声明了一个dataObj空对象,然后在异步请求中执行了两行代码,如下:
self.dataObj = {}; self.dataObj['text'] = 'new text';首先清空原始数据,然后添加一个text属性并赋值。到这里为止一切都如我们所想的,数据和模板都更新了。
那么问题来了,dataObj.text具有响应式的特性吗?
模板更新了,应该具有响应式特性,如果这么想那么你就已经走入了误区,一开始我们并没有在data中声明.text属性,所以该属性是不具有响应式的特性的。
但模板切切实实已经更新了,这又是怎么回事呢?
那是因为vue的dom更新是异步的,即当setter操作发生后,指令并不会立马更新,指令的更新操作会有一个延迟,当指令更新真正执行的时候,此时.text属性已经赋值,所以指令更新模板时得到的是新值。
具体流程如下所示:
所以真正的触发更新操作是self.dataObj = {};这一句引起的,所以单看上述例子,具有响应式特性的数据只有dataObj这一层,它的子属性是不具备的。
对比示例:
模板
<div id="app"> <h2>{{dataObj&&dataObj.text}}</h2></div>js
new Vue({ el: '#app', data: { dataObj: {} }, ready: function () { var self = this; /** * 异步请求模拟 */ setTimeout(function () { self.dataObj['text'] = 'new text'; }, 3000); } })上述例子的模板是不会更新的。
Vue.$set
通过$set方法可以将添加一个具备响应式特性的属性,并且其子属性也具备响应式特性,但是必须是新属性才可以,如果是本身已有的属性该方法是不起作用的。
new Vue({ el: '#app', data: { dataObj: {} }, ready: function () { var self = this; /** * 异步请求模拟 */ setTimeout(function () { var data = { name: 'xiaofu', age: 18 }; var data01 = { name: 'yangxiaofu', age: 19 }; self.dataObj['person'] = {}; self.$set('dataObj.info', data); self.$set('dataObj.person', data01); }, 3000); } })如上所示, .person属性是不具备响应式特性的。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
分析vue是如何实现数据改变更新视图的.前记三个月前看了vue源码来分析如何做到响应式数据的,文章名字叫vue源码之响应式数据,最后分析到,数据变化后会调用Wa
目前,响应式网站的普及程度还不是很高,因为用户对响应式网站的了解不多,这导致了误解。在这方面,我做了一些概括,希望用户在进行德州响应式网站建设和网站设计时考虑响
介绍observer是Vue核心中最重要的一个模块(个人认为),能够实现视图与数据的响应式更新,底层全凭observer的支持。注意:本文是针对Vue@2.1.
vue官网关于此解释说明如下:vue2.0里面的深入响应式原理的异步更新队列官网说明如下:只要观察到数据变化,Vue将开启一个队列,并缓冲在同一事件循环中发生的
简介:Vue最独特的特性之一,是其非侵入性的响应式系统。数据模型仅仅是普通的JavaScript对象。而当你修改它们时,视图会进行更新。简单的说,就是数据变视图