首页 > 其他分享 >vue2响应式原理

vue2响应式原理

时间:2023-06-01 21:33:20浏览次数:54  
标签:Vue obj get data 视图 响应 vue2 原理 数据

一、初识响应式原理

如果我们在 Vue 实例中声明过的数据发生了改变,那么所有用到这份数据的视图都会更新重新渲染,我们称这些数据就是响应式数据。响应式概括来说就是 数据驱动视图的自动更新。

<div id="app">
  {{ obj.message }}
</div>
let data = {
  obj: {
    message: 'Hello Vue!',
  },
}

new Vue({
  el: '#app',
  data,
})

setTimeout(() => {
  data.obj = {
    message: 'Obj have changed!',
  }
}, 1000)
setTimeout(() => {
  data.obj.message = 'Message have changed!'
}, 2000)

分析:

初次渲染时 Vue 会将 “ Hello Vue! ” 渲染在页面中,在一秒后修改了 data.obj 发生变化,页面也随之更新为 “ Obj have changed! ”,随后又过一秒 data.obj.message 被修改,页面显示为 “ Message have changed! ”

二、响应式原理的实现

为了实现响应式,vue必须要做以下两件事:

(1)数据什么时候变化了 --- 监视数据/数据劫持
(2)哪些地方用到了数据 --- 解析模板

 

1、监视数据

Vue 使用了 3 个类,实现了数据的拦截、更新订阅与发布:

Observer(监视者类):监视数据的变化,在数据变化时告诉通知者,在这个类中将数据的所有属性用 Object.defineProperty 重新定义一遍,绑定了存取器(getter/setter)。

Dep(通知者类):通知订阅者更新视图,因为一个数据可能被多处使用,所以一个通知者会存储多位订阅者。

Watcher(订阅者类):用于存储数据变化后要执行的更新函数,调用更新函数可以使用新的数据更新视图。

Vue 在初始化数据时,会使用 Object.defineProperty 重新定义 data 中的所有属性,为对象中的每一个属性,设置 get 和 set 方法,进行数据劫持/监听;get 值是一个函数,当属性被访问时,会触发 get 函数,set 值同样是一个函数,当属性被赋值时,会触发 set 函数;

var obj={    
    name:Vue是响应式吗?
}

Object.defineProperty(obj,"name",{
    get(){        
        console.log("get方法被触发")
    },
    set(val){        
        console.log("set方法被触发")
    }
})

var str = obj.name  //get方法被触发
obj.name = "Vue是响应式的"  // set方法被触发

2、解析模板

数据监视完毕后,Vue 会解析模板,模板解析的内容较为复杂,这一过程会创建虚拟节点 vnode,匹配到 {{ }} v- 等响应式写法,会根据当前节点的类型、响应式语法等建立该节点的更新函数 patch ,将数据与视图绑定。

Vue通过依赖收集去更新视图:data 中每个声明的属性都会有一个专属的依赖收集器dep.subs数组,当页面使用到 某个属性时,触发 ObjectdefineProperty - get函数,页面的 watcher 就会被放到属性的依赖收集器 subs 中进行保存。它知道谁依赖它之后,它就可以在发生改变的时候,通知 依赖它的页面,从而让页面完成更新;watcher可用于 进行视图更新。

 

标签:Vue,obj,get,data,视图,响应,vue2,原理,数据
From: https://www.cnblogs.com/cyy22321-blog/p/17450274.html

相关文章

  • uniapp 组件中使用页面的生命周期(vue2)
    用于直接在组件中使用onLoad,onBackPress等因为之前在写App的时候有许多弹窗,希望可以在有弹窗的时候先关闭弹窗,没有弹窗在执行返回事件,因此需要在页面onBackPress里面写很多判断,因此找了一些方法,写了可以直接在组件中调用页面生命周期的方法!使用mixinthis.$children去循环查询......
  • R数据分析:多项式回归与响应面分析的理解与实操
    今天给大家分享一个新的统计方法,叫做响应面分析,响应面分析是用来探究变量一致性假设的(Congruencehypotheses)。本身是一个工程学方法,目前在组织行为学,管理,市场营销等等领域中使用越来越多。Congruencehypothesesstatethattheagreement(i.e.,congruence)betweentwoconst......
  • BLE中SMP的配对原理分析
    蓝牙SMP层中的配对原理分析本文作为蓝牙SM协议的学习笔记,大部分内容取自于网上资料(密码学知识)和蓝牙核心规范。阅读需要有一定的蓝牙技术知识和密码学知识基础密码学基础基本的安全问题在通信中,安全问题至关重要,基本的安全入侵手段包括窃听、伪装和篡改。假设:Alice和Bob分别......
  • vue2项目中使用dhtmlx gantt甘特图插件
    官网示例地址:https://docs.dhtmlx.com/gantt/samples/可以在这里查看绑定数据的格式安装依赖npminstalldhtmlx-gantt--save创建一个甘特图组件<template><el-scrollbarref="gantt_scrollbar"class="gantt-box"><divref="gantt"class=&qu......
  • Round-Robin轮询调度法及其实现原理
    轮询调度算法(Round-RobinScheduling)轮询调度算法的原理是每一次把来自用户的请求轮流分配给内部中的服务器,从1开始,直到N(内部服务器个数),然后重新开始循环。算法的优点是其简洁性,它无需记录当前所有连接的状态,所以它是一种无状态调度。轮询调度算法流程假设有......
  • Flask 会话技术 cookies原理
    cookies#首页@blue.route('/')@blue.route('/home/')#装饰器可以用多个,这两个路由都能访问到home函数defhome()#4.获取cookieusername=request.cookies.get('user')returnrender_template('home.html',username=username)#......
  • 前后端分离的架构,前端使用Vue2.6.10,后端使用SpringBoot2.0.0的ERP实现
    技术架构技术框架:SpringBoot2.0.0+Mybatis1.3.2+SLF4J1.7+Vue2.6.10+Ant-Design-Vue1.5.2+Mysql5.7+Redis运行环境:jdk8+IntelliJIDEA+maven+宝塔面板本地部署:1.小皮面板创建一个数据库,导入jsh_erp.sql文件至数据库中,该文件在后端程序的docs文件夹下。2.使用......
  • ffprobe提取元数据的原理
    ffprobe是FFmpeg工具集中的一个组件,它用于对多媒体文件进行分析和元数据提取。ffprobe的原理是解析多媒体文件的容器格式,从中提取相关的元数据信息。多媒体文件通常由一个容器格式(例如MP4、AVI、MKV)包裹着音频、视频或图像流以及其他元数据。容器格式包含了描述多媒体文件结构和......
  • sparkSQL原理和使用——一般在生产中,基本都是使用hive做数据仓库存储数据,然后用spark
    一、sparkSQL概述1.1什么是sparkSQLSparkSQL是Spark用来处理结构化数据的一个模块,它提供了一个编程抽象叫做DataFrame并且作为分布式SQL查询引擎的作用。类似于hive的作用。1.2sparkSQL的特点1、容易集成:安装Spark的时候,已经集成好了。不需要单独安装。2、统一的数据访问方......
  • JS垃圾回收——和其他语言一样,JavaScript 的 GC 策略也无法避免一个问题:GC 时,停止响应
    JavaScript内存管理&垃圾回收机制标记清除js中最常用的垃圾回收方式就是标记清除。当变量进入环境时,例如,在函数中声明一个变量,就将这个而变量标记为“进入环境”。从逻辑上讲,永远不能释放进入环境的变量所占用的内存,因为只要执行流进入相应的环境,就可能会用到它们。而当变量离......