谈谈对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之可拖动的iframe效果代码
Aug 01 Javascript
StringTemplate遇见jQuery冲突的解决方法
Sep 22 Javascript
jquery提示效果实例分析
Nov 25 Javascript
JavaScript中遍历对象的property的3种方法介绍
Dec 30 Javascript
javascript验证身份证号
Mar 03 Javascript
javascript url几种编码方式详解
Jun 06 Javascript
jQuery实现调整表格单列顺序完整实例
Jun 20 Javascript
使用JQuery中的trim()方法去掉前后空格
Sep 16 Javascript
ES6新特性之数组、Math和扩展操作符用法示例
Apr 01 Javascript
详解vue2父组件传递props异步数据到子组件的问题
Jun 29 Javascript
taro小程序添加骨架屏的实现代码
Nov 15 Javascript
Vue中引入svg图标的两种方式
Jan 14 Vue.js
详解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/06/04 PHP
PHP使用strstr()函数获取指定字符串后所有字符的方法
2016/01/07 PHP
php 函数使用可变数量的参数方法
2017/05/02 PHP
JQUERY CHECKBOX全选,取消全选,反选方法三
2008/08/30 Javascript
jquery特效 幻灯片效果示例代码
2013/07/16 Javascript
基于javascript的JSON格式页面展示美化方法
2014/07/02 Javascript
JavaScript中的类数组对象介绍
2014/12/30 Javascript
JavaScript几种数组去掉重复值的方法推荐
2016/04/12 Javascript
jQuery Chart图表制作组件Highcharts用法详解
2016/06/01 Javascript
jQuery实现iframe父窗体和子窗体的相互调用
2016/06/17 Javascript
JavaScript 函数模式详解及示例
2016/09/07 Javascript
vue实现提示保存后退出的方法
2018/03/15 Javascript
使用jquery的cookie实现登录页记住用户名和密码的方法
2019/03/13 jQuery
node.js Promise对象的使用方法实例分析
2019/12/26 Javascript
vue路由缓存的几种实现方式小结
2020/02/02 Javascript
Javascript节流函数throttle和防抖函数debounce
2020/12/03 Javascript
[01:06:07]2014 DOTA2国际邀请赛中国区预选赛5.21 DT VS CIS
2014/05/22 DOTA
详解MySQL数据类型int(M)中M的含义
2016/11/20 Python
python基础教程项目二之画幅好画
2018/04/02 Python
Python实现购物车购物小程序
2018/04/18 Python
Python中如何使用if语句处理列表实例代码
2019/02/24 Python
Python OpenCV之图片缩放的实现(cv2.resize)
2019/06/28 Python
Python基于Dlib的人脸识别系统的实现
2020/02/26 Python
使用Python构造hive insert语句说明
2020/06/06 Python
Python使用jpype模块调用jar包过程解析
2020/07/29 Python
如何把python项目部署到linux服务器
2020/08/26 Python
python中的yield from语法快速学习
2020/11/06 Python
python爬虫 requests-html的使用
2020/11/30 Python
浅谈react路由传参的几种方式
2021/03/23 Javascript
如何客观的进行自我评价
2013/12/17 职场文书
护士毕业实习感言
2014/03/05 职场文书
副主任竞聘演讲稿
2014/08/18 职场文书
开展党的群众路线教育实践活动个人对照检查材料
2014/11/05 职场文书
有关西游记的读书笔记
2015/06/25 职场文书
读鲁迅先生的经典名言
2019/08/20 职场文书
一次线上mongo慢查询问题排查处理记录
2022/03/18 MongoDB