全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

谈谈对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响应式数据  # vue  # 响应式  # Vue3关于响应式数据类型详解(ref、reactive、toRef、及toRefs)  # vue3中如何使用ref和reactive定义和修改响应式数据(最新推荐)  # Vue.js响应式数据的简单实现方法(一看就会)  # Vue.js中provide/inject实现响应式数据更新的方法示例  # Vue实现双向绑定的原理以及响应式数据的方法  # Vue创建浅层响应式数据的实例详解  # 所示  # 这一  # 不具备  # 的是  # 就会  # 是在  # 来了  # 会有  # 你就  # 也能  # 有一种  # 一切都  # 才可以  # 那是因为  # 大家多多  # 两行  # 这又  # 清空  # 正确处理  # 其子 


相关文章: 建站之星24小时客服电话如何获取?  高端云建站费用究竟需要多少预算?  定制建站如何定义?其核心优势是什么?  如何快速上传建站程序避免常见错误?  家庭服务器如何搭建个人网站?  c# Task.Yield 的作用是什么 它和Task.Delay(1)有区别吗  成都网站制作报价公司,成都工业用气开户费用?  制作电商网页,电商供应链怎么做?  如何在云虚拟主机上快速搭建个人网站?  建站之星安装后界面空白如何解决?  详解免费开源的.NET多类型文件解压缩组件SharpZipLib(.NET组件介绍之七)  建站之星×万网:智能建站系统+自助建站平台一键生成  宝塔新建站点为何无法访问?如何排查?  网站制作哪家好,cc、.co、.cm哪个域名更适合做网站?  TestNG的testng.xml配置文件怎么写  微信小程序 input输入框控件详解及实例(多种示例)  制作网站的软件免费下载,免费制作app哪个平台好?  如何快速配置高效服务器建站软件?  建站之星云端配置指南:模板选择与SEO优化一键生成  七夕网站制作视频,七夕大促活动怎么报名?  如何通过wdcp面板快速创建网站?  青岛网站建设如何选择本地服务器?  阿里云高弹*务器配置方案|支持分布式架构与多节点部署  怎么制作网站设计模板图片,有电商商品详情页面的免费模板素材网站推荐吗?  图册素材网站设计制作软件,图册的导出方式有几种?  如何确保西部建站助手FTP传输的安全性?  高端建站三要素:定制模板、企业官网与响应式设计优化  专业企业网站设计制作公司,如何理解商贸企业的统一配送和分销网络建设?  在线制作视频的网站有哪些,电脑如何制作视频短片?  广东企业建站网站优化与SEO营销核心策略指南  如何快速搭建高效香港服务器网站?  一键制作网站软件下载安装,一键自动采集网页文档制作步骤?  建站之星上传入口如何快速找到?  如何通过VPS建站实现广告与增值服务盈利?  制作网站的网址是什么,请问后缀为.com和.com.cn还有.cn的这三种网站是分别是什么类型的网站?  Avalonia如何实现跨窗口通信 Avalonia窗口间数据传递  高端智能建站公司优选:品牌定制与SEO优化一站式服务  孙琪峥织梦建站教程如何优化数据库安全?  如何通过万网虚拟主机快速搭建网站?  代刷网站制作软件,别人代刷火车票靠谱吗?  宝塔面板如何快速创建新站点?  黑客如何通过漏洞一步步攻陷网站服务器?  为什么Go需要go mod文件_Go go mod文件作用说明  百度网页制作网站有哪些,谁能告诉我百度网站是怎么联系?  ppt制作免费网站有哪些,ppt模板免费下载网站?  网站制作报价单模板图片,小松挖机官方网站报价?  制作农业网站的软件,比较好的农业网站推荐一下?  ,柠檬视频怎样兑换vip?  焦点电影公司作品,电影焦点结局是什么?  如何在IIS中新建站点并配置端口与物理路径? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。