谈谈对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 相关文章推荐
JS面向对象编程 for Cookie
Sep 19 Javascript
JS时间选择器 兼容IE6,7,8,9
Jun 26 Javascript
Javascript核心读书有感之类型、值和变量
Feb 11 Javascript
详解JavaScript的另类写法
Apr 11 Javascript
jquery实现图片上传前本地预览功能
May 10 Javascript
微信小程序 教程之模块化
Oct 17 Javascript
详解vue 实例方法和数据
Oct 23 Javascript
微信小程序自定义组件components(代码详解)
Oct 21 Javascript
微信小程序实现左侧滑动导航栏
Apr 08 Javascript
mpvue微信小程序开发之实现一个弹幕评论
Nov 24 Javascript
Vue中nprogress页面加载进度条的方法实现
Nov 13 Javascript
webpack的移动端适配方案小结
Jul 25 Javascript
详解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
15个小时----从修改程序到自己些程序
2006/10/09 PHP
php下载远程文件类(支持断点续传)
2008/11/14 PHP
gd库图片下载类实现下载网页所有图片的php代码
2012/08/20 PHP
php更新mysql后获取改变行数的方法
2014/12/25 PHP
JavaScript中this关键字使用方法详解
2007/03/08 Javascript
js 加载并解析XML字符串的代码
2009/12/13 Javascript
JavaScript日历实现代码
2010/09/12 Javascript
js的写法基础分析
2011/01/17 Javascript
Three.js源码阅读笔记(物体是如何组织的)
2012/12/27 Javascript
Node.js与PHP、Python的字符处理性能对比
2014/07/06 Javascript
jQuery ajax serialize() 方法使用示例
2014/11/02 Javascript
jquery计算鼠标和指定元素之间距离的方法
2015/06/26 Javascript
node.js下LDAP查询实例分享
2015/09/30 Javascript
nodejs的HTML分析利器node-jquery用法浅析
2016/11/08 NodeJs
jQuery Easyui datagrid editor为combobox时指定数据源实例
2016/12/19 Javascript
js判断传入时间和当前时间大小实例(超简单)
2018/01/11 Javascript
使用vscode快速建立vue模板过程详解
2019/10/10 Javascript
vantUI 获得piker选中值的自定义ID操作
2020/11/04 Javascript
Python实现抓取网页并且解析的实例
2014/09/20 Python
利用Python如何将数据写到CSV文件中
2018/06/05 Python
python实现简单多人聊天室
2018/12/11 Python
python适合人工智能的理由和优势
2019/06/28 Python
Python字节单位转换实例
2019/12/05 Python
python GUI库图形界面开发之PyQt5信号与槽多窗口数据传递详细使用方法与实例
2020/03/08 Python
Python 线性回归分析以及评价指标详解
2020/04/02 Python
Python基于codecs模块实现文件读写案例解析
2020/05/11 Python
Old Navy加拿大官网:美式休闲服饰品牌
2017/09/26 全球购物
中科方德软件测试面试题
2016/04/21 面试题
车祸赔偿收入证明
2014/01/09 职场文书
建筑安全标语
2014/06/07 职场文书
党员干部观看《周恩来四个昼夜》思想汇报
2014/09/10 职场文书
护士医德医风自我评价
2014/09/15 职场文书
中小学生学籍证明
2014/10/25 职场文书
解决golang 关于全局变量的坑
2021/05/06 Golang
如何自己动手写SQL执行引擎
2021/06/02 MySQL
教你如何使用Python Tkinter库制作记事本
2021/06/10 Python