谈谈对vue响应式数据更新的误解


Posted in Javascript onAugust 01, 2017

对于刚接触vue的同学会经常遇到数据更新了但是模板没有更新的问题,下面将结合vue的响应式特性以及异步更新机制分析常见的错误:

异步更新带来的数据响应式误解

异步数据的处理基本是一定会遇到的,处理不好就会遇到数据不更新的问题,但有一种情况是在未正确处理的情况下也能正常更新,这就会造成一种误解,详情如下所示:

模板

<div id="app">
    <h2>{{dataObj.text}}</h2>
</div>

js

new Vue({
      el: '#app',
      data: {
        dataObj: {}
      },
      ready: function () {
        var self = this;

        /**
         * 异步请求模拟
         */
        setTimeout(function () {
          self.dataObj = {}; 
          self.dataObj['text'] = 'new text';
        }, 3000);
      }
    })

上面的代码非常简单,我们都知道vue中在data里面声明的数据才具有响应式的特性,所以我们一开始在data中声明了一个dataObj空对象,然后在异步请求中执行了两行代码,如下:

self.dataObj = {}; 
self.dataObj['text'] = 'new text';

首先清空原始数据,然后添加一个text属性并赋值。到这里为止一切都如我们所想的,数据和模板都更新了。

那么问题来了,dataObj.text具有响应式的特性吗?

模板更新了,应该具有响应式特性,如果这么想那么你就已经走入了误区,一开始我们并没有在data中声明.text属性,所以该属性是不具有响应式的特性的。

但模板切切实实已经更新了,这又是怎么回事呢?

那是因为vue的dom更新是异步的,即当setter操作发生后,指令并不会立马更新,指令的更新操作会有一个延迟,当指令更新真正执行的时候,此时.text属性已经赋值,所以指令更新模板时得到的是新值。

具体流程如下所示:

  1. self.dataObj = {};发生setter操作
  2. vue监测到setter操作,通知相关指令执行更新操作
  3. self.dataObj['text'] = 'new text';赋值语句
  4. 指令更新开始执行

所以真正的触发更新操作是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属性是不具备响应式特性的。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
Javascript学习笔记9 prototype封装继承
Jan 11 Javascript
input按钮的事件处理大全
Dec 10 Javascript
Javascript模块化编程(一)模块的写法最佳实践
Jan 17 Javascript
javascript抖动元素的小例子
Oct 28 Javascript
简单的ajax连接库分享(不用jquery的ajax)
Jan 19 Javascript
H5用户注册表单页 注册模态框!
Sep 17 Javascript
jquery ajax后台返回list,前台用jquery遍历list的实现
Oct 30 Javascript
Android中Okhttp3实现上传多张图片同时传递参数
Feb 18 Javascript
H5实现中奖记录逐行滚动切换效果
Mar 13 Javascript
vue2中使用less简易教程
Mar 27 Javascript
原生JS进行前后端同构
Apr 22 Javascript
Jquery的autocomplete插件用法及参数讲解
Mar 12 jQuery
详解jquery选择器的原理
Aug 01 #jQuery
浅谈node中的exports与module.exports的关系
Aug 01 #Javascript
Vue2.0 组件传值通讯的示例代码
Aug 01 #Javascript
谈谈VUE种methods watch和compute的区别和联系
Aug 01 #Javascript
Angular4学习笔记之实现绑定和分包
Aug 01 #Javascript
详解js静态资源文件请求的处理
Aug 01 #Javascript
Angular4学习笔记之准备和环境搭建项目
Aug 01 #Javascript
You might like
PHP pathinfo()获得文件的路径、名称等信息说明
2011/09/13 PHP
php setcookie函数的参数说明及其用法
2014/04/20 PHP
laravel 4安装及入门图文教程
2014/10/29 PHP
PHP编写daemon process详解及实例代码
2016/09/30 PHP
php微信开发之关注事件
2018/06/14 PHP
基于jQuery的试卷自动排版系统实现代码
2011/01/06 Javascript
ASP.NET jQuery 实例18 通过使用jQuery validation插件校验DropDownList
2012/02/03 Javascript
JS解析json数据并将json字符串转化为数组的实现方法
2012/12/25 Javascript
JS组件Bootstrap Table表格行拖拽效果实现代码
2020/08/27 Javascript
基于javascript实现根据身份证号码识别性别和年龄
2016/01/22 Javascript
JavaScript修改作用域外变量的方法
2016/03/25 Javascript
学习掌握JavaScript中this的使用技巧
2016/08/29 Javascript
js中动态创建json,动态为json添加属性、属性值的实例
2016/12/02 Javascript
js实现小窗口拖拽效果
2016/12/03 Javascript
BootStrapTable服务器分页实例解析
2016/12/20 Javascript
vue2.0 下拉框默认标题设置方法
2018/08/22 Javascript
vue.js实现二级菜单效果
2019/10/19 Javascript
vue中使用GraphQL的实例代码
2019/11/04 Javascript
Vue发布订阅模式实现过程图解
2020/04/30 Javascript
[13:39]2014 DOTA2华西杯精英邀请赛 5 25 NewBee VS DK第一场
2014/05/26 DOTA
[02:03]完美世界DOTA2联赛10月30日赛事集锦
2020/10/31 DOTA
Python处理JSON时的值报错及编码报错的两则解决实录
2016/06/26 Python
Python网络编程 Python套接字编程
2017/09/13 Python
pandas 对series和dataframe进行排序的实例
2018/06/09 Python
对python pandas读取剪贴板内容的方法详解
2019/01/24 Python
Python中的 sort 和 sorted的用法与区别
2019/08/10 Python
多个版本的python共存时使用pip的正确做法
2020/10/26 Python
英国No.1文具和办公用品在线:Euroffice
2016/09/21 全球购物
Banggood官网:面向全球客户的综合商城
2017/04/19 全球购物
香港士多网上超级市场:Ztore
2021/01/09 全球购物
计算机毕业大学生推荐信
2013/12/01 职场文书
销售内勤岗位职责
2014/04/15 职场文书
建筑院校毕业生求职信
2014/06/13 职场文书
过程装备与控制工程专业求职信
2014/07/02 职场文书
后进生评语大全
2015/01/04 职场文书
趵突泉导游词
2015/02/03 职场文书