谈谈对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中的window.open返回object的错误的解决方法
Aug 15 Javascript
jquery validate使用攻略 第四步
Jul 01 Javascript
js实现select跳转功能代码
Oct 22 Javascript
Javascript限制网页只能在微信内置浏览器中访问
Nov 09 Javascript
js中hash和ico的关联分析
Feb 05 Javascript
js实现精美的银灰色竖排折叠菜单
May 16 Javascript
微信小程序 PHP生成带参数二维码
Feb 21 Javascript
详解数组Array.sort()排序的方法
May 09 Javascript
详解用webpack2.0构建vue2.0超详细精简版
Apr 05 Javascript
微信小程序使用wxParse解析html的实现示例
Aug 30 Javascript
详解@angular/cli 改变默认启动端口两种方式
Nov 29 Javascript
微信小程序语音同步智能识别的实现案例代码解析
May 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
PHP弹出提示框并跳转到新页面即重定向到新页面
2014/01/24 PHP
PHP实现数组递归转义的方法
2014/08/28 PHP
laravel框架邮箱认证实现方法详解
2019/11/22 PHP
PHP7 新增功能
2021/03/09 PHP
发布BlueShow v1.0 图片浏览器(类似lightbox)blueshow.js 打包下载
2007/07/21 Javascript
jQuery DOM操作小结与实例
2010/01/07 Javascript
Javascript 静态页面实现随机显示广告的办法
2010/11/17 Javascript
使用jQuery避免鼠标双击的解决方案
2013/08/21 Javascript
sencha touch 模仿tabpanel导航栏TabBar的实例代码
2013/10/24 Javascript
window.location.href的用法(动态输出跳转)
2014/08/09 Javascript
JavaScript实现网页截图功能
2014/10/16 Javascript
node.js使用require()函数加载模块
2014/11/26 Javascript
使用JavaScript链式编程实现模拟Jquery函数
2014/12/21 Javascript
详解JavaScript对象序列化
2016/01/19 Javascript
jQuery中借助deferred来请求及判断AJAX加载的实例讲解
2016/05/24 Javascript
vue-router 学习快速入门
2017/03/01 Javascript
vue单页面打包文件大?首次加载慢?nginx带你飞,从7.5M到1.3M蜕变过程(推荐)
2018/01/16 Javascript
Vue2.2.0+新特性整理及注意事项
2018/08/22 Javascript
解决微信小程序中转换时间格式IOS不兼容的问题
2019/02/15 Javascript
Vue 递归多级菜单的实例代码
2019/05/05 Javascript
高效测试用例组织算法pairwise之Python实现方法
2017/07/19 Python
基于Python 装饰器装饰类中的方法实例
2018/04/21 Python
python scipy卷积运算的实现方法
2019/09/16 Python
python读取word 中指定位置的表格及表格数据
2019/10/23 Python
Pytorch通过保存为ONNX模型转TensorRT5的实现
2020/05/25 Python
如何编写python的daemon程序
2021/01/07 Python
No module named ‘win32gui‘ 的解决方法(踩坑之旅)
2021/02/18 Python
使用纯HTML5编写一款网页上的时钟的代码分享
2015/11/16 HTML / CSS
医药营销专业个人自荐信
2013/09/29 职场文书
医学专业毕业生个人求职信
2013/12/25 职场文书
幼儿园校车司机的岗位职责
2014/01/30 职场文书
村抢险救灾方案
2014/05/09 职场文书
工程部文员岗位职责
2015/02/04 职场文书
工作态度恶劣检讨书
2015/05/06 职场文书
教师节领导致辞
2015/07/29 职场文书
MySQL数据迁移相关总结
2021/04/29 MySQL