谈谈对vue响应式数据更新的误解

 更新时间:2017年08月01日 15:20:16   作者:杨小福  
本篇文章主要介绍了谈谈对vue响应式数据更新的误解,深入了解了vue响应式数据,有兴趣的可以了解一下

对于刚接触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属性是不具备响应式特性的。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • Vue.js每天必学之方法与事件处理器

    Vue.js每天必学之方法与事件处理器

    Vue.js每天必学之方法与事件处理器,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-09-09
  • vue spa应用中的路由缓存问题与解决方案

    vue spa应用中的路由缓存问题与解决方案

    这篇文章主要介绍了vue spa应用中的路由缓存问题与解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-05-05
  • vue指令之表单控件绑定v-model v-model与v-bind结合使用

    vue指令之表单控件绑定v-model v-model与v-bind结合使用

    这篇文章主要介绍了vue指令之表单控件绑定v-model v-model与v-bind结合使用,需要的朋友可以参考下
    2019-04-04
  • 如何巧用Vue缓存函数浅析

    如何巧用Vue缓存函数浅析

    有时候不希望已经请求过的数据,再次请求重复执行刷新操作,我们就需要使用数据缓存,这篇文章主要给大家介绍了关于如何巧用Vue缓存函数的相关资料,需要的朋友可以参考下
    2021-09-09
  • 详解vue中点击空白处隐藏div的实现(用指令实现)

    详解vue中点击空白处隐藏div的实现(用指令实现)

    本篇文章主要介绍了详解vue中点击空白处隐藏div的实现(用指令实现),小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-04-04
  • vue实现元素拖动并互换位置的实现代码

    vue实现元素拖动并互换位置的实现代码

    在使用Vue的场景下,需要实现对元素进行拖动交换位置,接下来通过本文给大家介绍vue实现元素拖动并互换位置的实现代码,需要的朋友可以参考下
    2023-09-09
  • vant Cascader级联选择实现可以选择任意一层级

    vant Cascader级联选择实现可以选择任意一层级

    这篇文章主要介绍了vant Cascader级联选择实现可以选择任意一层级方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-07-07
  • vue实现点击当前标签高亮效果【推荐】

    vue实现点击当前标签高亮效果【推荐】

    这篇文章主要介绍了vue实现点击当前标签高亮效果的思路详解,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友参考下吧
    2018-06-06
  • Vue首屏白屏问题的原因和解决方法讲解

    Vue首屏白屏问题的原因和解决方法讲解

    这篇文章主要介绍了Vue首屏白屏问题的原因和解决方法讲解,Vue首屏白屏问题是指在页面初次加载时,部分或全部内容无法正常显示,出现空白的情况。其原因可能是因为页面渲染速度过慢,或者是因为网络请求等问题导致数据无法及时加载
    2023-05-05
  • 如何在Vue中使用protobuf

    如何在Vue中使用protobuf

    这篇文章主要介绍了如何在Vue中使用protobuf,protobuf是由google推出的和语言无关和平台无关,几乎支持当前的大部分语言,如JavaScript,下文更多相关介绍需要的小伙伴可以参考一下
    2022-03-03

最新评论