谈谈对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监听输入框值的即时变化onpropertychange、oninput
Jul 13 Javascript
jquery html动态生成select标签出问题的解决方法
Nov 20 Javascript
Chrome扩展页面动态绑定JS事件提示错误
Feb 11 Javascript
url传递的参数值中包含&amp;时,url自动截断问题的解决方法
Aug 02 Javascript
Bootstrap 网站实例之单页营销网站
Oct 20 Javascript
JS实现经典的中国地区三级联动下拉菜单功能实例【测试可用】
Jun 06 Javascript
Vue.js实现输入框绑定的实例代码
Aug 24 Javascript
react-navigation 如何判断用户是否登录跳转到登录页的方法
Dec 01 Javascript
js 两数组去除重复数值的实例
Dec 06 Javascript
vue2.0自定义指令示例代码详解
Apr 25 Javascript
深入解析Vue源码实例挂载与编译流程实现思路详解
May 05 Javascript
实用Javascript调试技巧分享(小结)
Jun 18 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
造势之举?韩国总统候选人发布《星际争霸》地图
2017/04/22 星际争霸
如何让CI框架支持service层
2014/10/29 PHP
ajax页面无刷新 IE下遭遇Ajax缓存导致数据不更新的问题
2012/12/11 Javascript
js 验证密码强弱的小例子
2013/03/21 Javascript
超炫的jquery仿flash导航栏特效
2014/11/11 Javascript
jQuery带箭头提示框tooltips插件集锦
2014/11/17 Javascript
使用jquery菜单插件HoverTree仿京东无限级菜单
2014/12/18 Javascript
JavaScript reduce和reduceRight详解
2016/10/24 Javascript
详解Vue单元测试Karma+Mocha学习笔记
2018/01/31 Javascript
jQuery动态生成的元素绑定事件操作实例分析
2019/05/04 jQuery
VUE 直接通过JS 修改html对象的值导致没有更新到数据中解决方法分析
2019/12/02 Javascript
VUE table表格动态添加一列数据,新增的这些数据不可以编辑(v-model绑定的数据不能实时更新)
2020/04/03 Javascript
使用python在校内发人人网状态(人人网看状态)
2014/02/19 Python
python实现通过shelve修改对象实例
2014/09/26 Python
在Django框架中设置语言偏好的教程
2015/07/27 Python
Python实现二叉堆
2016/02/03 Python
Python3实现简单可学习的手写体识别(实例讲解)
2017/10/21 Python
python连接mongodb密码认证实例
2018/10/16 Python
[原创]Python入门教程4. 元组基本操作
2018/10/31 Python
python交易记录整合交易类详解
2019/07/03 Python
Django  ORM 练习题及答案
2019/07/19 Python
对Pytorch中Tensor的各种池化操作解析
2020/01/03 Python
django 文件上传功能的相关实例代码(简单易懂)
2020/01/22 Python
使用pygame编写Flappy bird小游戏
2020/03/14 Python
html5+css3之制作header实例与更新
2020/12/21 HTML / CSS
HTML5和CSS3实例教程总结(推荐)
2016/07/18 HTML / CSS
临床医学专业个人的自我评价
2013/09/27 职场文书
超市后勤自我鉴定
2014/01/17 职场文书
护士的自我鉴定
2014/02/07 职场文书
一年级学生评语
2014/04/23 职场文书
党员自我剖析材料
2014/08/31 职场文书
年度考核表个人总结
2015/03/06 职场文书
2015年远程教育工作总结
2015/05/20 职场文书
2016消防宣传标语口号
2015/12/26 职场文书
2016先进工作者事迹材料
2016/02/25 职场文书
2016年世界艾滋病日宣传活动总结
2016/04/01 职场文书