谈谈对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日历 推荐
Dec 03 Javascript
JavaScript的parseInt 进制问题
May 07 Javascript
CutePsWheel javascript libary 控制输入文本框为可使用滚轮控制的js库
Feb 07 Javascript
Jquery 最近浏览过的商品的功能实现代码
May 14 Javascript
jquery图片倾斜层叠切换特效代码分享
Aug 27 Javascript
jQuery热气球动画半透明背景的后台登录界面代码分享
Aug 28 Javascript
js 原型对象和原型链理解
Feb 09 Javascript
Angular企业级开发——MVC之控制器详解
Feb 20 Javascript
jQuery实现动态给table赋值的方法示例
Jul 04 jQuery
JavaScript+HTML5实现的日期比较功能示例
Jul 12 Javascript
原生js的ajax和解决跨域的jsonp(实例讲解)
Oct 16 Javascript
使用vue2实现购物车和地址选配功能
Mar 29 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
改造一台复古桌面收音机
2021/03/02 无线电
php+mysql分页代码详解
2008/03/27 PHP
PHP扩展编写点滴 技巧收集
2010/03/09 PHP
mysql_num_rows VS COUNT 效率问题分析
2011/04/23 PHP
允许phpmyadmin空密码登录的配置方法
2011/05/29 PHP
php中heredoc与nowdoc介绍
2014/12/25 PHP
PHP5.5基于mysqli连接MySQL数据库和读取数据操作实例详解
2019/02/16 PHP
JQuery实现自定义对话框的代码
2008/06/15 Javascript
关于img的href和src取变量及赋值的方法
2014/04/28 Javascript
jQuery控制的不同方向的滑动(向左、向右滑动等)
2014/07/18 Javascript
JavaScript数值转换的三种方式总结
2014/07/31 Javascript
Javascript 读取操作Sql中的Xml字段
2014/10/09 Javascript
JS响应鼠标点击实现两个滑块区间拖动效果
2015/10/26 Javascript
如何解决ligerUI布局时Center中的Tab高度大小
2015/11/24 Javascript
Bootstrap3制作搜索框样式的方法
2016/07/11 Javascript
Bootstrap模态框使用详解
2017/02/15 Javascript
js上下视差滚动简单实现代码
2017/03/07 Javascript
JS中把函数作为另一函数的参数传递方法(总结)
2017/06/28 Javascript
react native仿微信PopupWindow效果的实例代码
2017/08/07 Javascript
JavaScript解决浮点数计算不准确问题的方法分析
2018/07/09 Javascript
微信小程序和百度的语音识别接口详解
2019/05/06 Javascript
d3.js实现图形缩放平移
2019/12/19 Javascript
[02:41]辉夜杯现场一家三口 “我爸玩风行 我玩血魔”
2015/12/27 DOTA
python读取文本中的坐标方法
2018/10/14 Python
CSS3 绘制BMW logo实的现代码
2013/04/25 HTML / CSS
html5适合移动应用开发的12大特性
2014/03/19 HTML / CSS
银行柜员应聘推荐信范文
2013/11/24 职场文书
办公室保洁员岗位职责
2013/12/02 职场文书
优秀毕业生求职信
2014/06/05 职场文书
公司领导班子民主生活会对照检查材料
2014/10/02 职场文书
2014年物业管理工作总结
2014/11/21 职场文书
父亲婚礼答谢词
2015/01/04 职场文书
2015年测量员工作总结
2015/05/23 职场文书
2015年教务处干事工作总结
2015/07/22 职场文书
java协程框架quasar和kotlin中的协程对比分析
2022/02/24 Java/Android
python数字图像处理数据类型及颜色空间转换
2022/06/28 Python