谈谈对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 获取url参数和script标签中获取url参数函数代码
Jan 22 Javascript
IE不支持getElementsByClassName最终完美解决方案
Dec 17 Javascript
jQuery实现在列表的首行添加数据
May 19 Javascript
第一次接触神奇的前端框架vue.js
Dec 01 Javascript
Vue.js组件tree实现无限级树形菜单
Dec 02 Javascript
利用jQuery实现简单的拖曳效果实例代码
Oct 20 jQuery
解决Vue中mounted钩子函数获取节点高度出错问题
May 18 Javascript
详解Angular中通过$location获取地址栏的参数
Aug 02 Javascript
基于vue和react的spa进行按需加载的实现方法
Sep 29 Javascript
jQuery 常用特效实例小结【显示与隐藏、淡入淡出、滑动、动画等】
May 19 jQuery
AJAX学习笔记
May 18 Javascript
React如何创建组件
Jun 27 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
php 时间计算问题小结
2009/01/04 PHP
php下目前为目最全的CURL中文说明
2010/08/01 PHP
php5.4以上版本GBK编码下htmlspecialchars输出为空问题解决方法汇总
2015/04/03 PHP
windows server 2008/2012安装php iis7 mysql环境搭建教程
2016/06/30 PHP
PHP实现文件上传功能实例代码
2017/05/18 PHP
新浪中用来显示flash的函数
2007/04/02 Javascript
JavaScript中按位“异或”运算符使用介绍
2014/03/14 Javascript
jquery统计用户选中的复选框的个数
2014/06/06 Javascript
原生JavaScript+LESS实现瀑布流
2014/12/12 Javascript
javascript实现的右下角弹窗实例
2015/04/24 Javascript
js变量提升深入理解
2016/09/16 Javascript
js返回顶部实例分享
2016/12/21 Javascript
深入理解Javascript中的观察者模式
2017/02/20 Javascript
vue双向绑定简要分析
2017/03/23 Javascript
详解VUE的状态控制与延时加载刷新
2017/03/27 Javascript
Angularjs2不同组件间的通信实例代码
2017/05/06 Javascript
vue v-on监听事件详解
2017/05/17 Javascript
angularjs性能优化的方法
2018/09/05 Javascript
深入浅出了解Node.js Streams
2019/05/27 Javascript
vue设置导航栏、侧边栏为公共页面的例子
2019/11/01 Javascript
vue点击自增和求和的实例代码
2019/11/06 Javascript
Python中的is和id用法分析
2015/01/26 Python
浅谈python函数之作用域(python3.5)
2017/10/27 Python
Python 打印中文字符的三种方法
2018/08/14 Python
python 使用while写猜年龄小游戏过程解析
2019/10/07 Python
Pandas操作CSV文件的读写实现方法
2019/11/13 Python
win10下opencv-python特定版本手动安装与pip自动安装教程
2020/03/05 Python
python如何从键盘获取输入实例
2020/06/18 Python
EJB需直接实现它的业务接口或Home接口吗,请简述理由
2016/11/23 面试题
2014村务公开实施方案
2014/02/25 职场文书
优秀班主任申报材料
2014/12/16 职场文书
2015感人爱情寄语
2015/02/26 职场文书
如何使用flask将模型部署为服务
2021/05/13 Python
如何用python清洗文件中的数据
2021/06/18 Python
Python Pandas pandas.read_sql函数实例用法
2021/06/21 Python
Vue h函数的使用详解
2022/02/18 Vue.js