首页 > 其他分享 >vue响应性原理

vue响应性原理

时间:2024-01-28 11:45:31浏览次数:29  
标签:触发 vue 实例 watcher 响应 依赖 原理 Watcher setter

 

核心实现类

  1. Observer : 它的作用是给对象的属性添加 getter 和 setter,用于依赖收集和派发更新
  2. Dep : 用于收集当前响应式对象的依赖关系,每个响应式对象包括子对象都拥有一个 Dep 实例(里面 subs 是 Watcher 实例数组),当数据有变更时,会通过 dep.notify()通知各个 watcher。
  3. Watcher : 观察者对象 , 实例分为渲染 watcher (render watcher),计算属性 watcher (computed watcher),侦听器 watcher(user watcher)三种

Watcher 和 Dep 的关系

watcher 中实例化了 dep 并向 dep.subs 中添加了订阅者,dep 通过 notify 遍历了 dep.subs 通知每个 watcher 更新。

依赖收集

initState 时,对 computed 属性初始化时,触发 computed watcher 依赖收集
initState 时,对侦听属性初始化时,触发 user watcher 依赖收集
render()的过程,触发 render watcher 依赖收集
re-render 时,vm.render()再次执行,会移除所有 subs 中的 watcer 的订阅,重新赋值。

派发更新

组件中对响应的数据进行了修改,触发 setter 的逻辑
调用 dep.notify()
遍历所有的 subs(Watcher 实例),调用每一个 watcher 的 update 方法。

原理

当创建 Vue 实例时,vue 会遍历 data 选项的属性,利用 Object.defineProperty 为属性添加 getter 和 setter 对数据的读取进行劫持(getter 用来依赖收集,setter 用来派发更新),并且在内部追踪依赖,在属性被访问和修改时通知变化。
每个组件实例会有相应的 watcher 实例,会在组件渲染的过程中记录依赖的所有数据属性(进行依赖收集,还有 computed watcher,user watcher 实例),之后依赖项被改动时,setter 方法会通知依赖与此 data 的 watcher 实例重新计算(派发更新),从而使它关联的组件重新渲染。

总结

  1. data 通过observer 转换成了getter/setter的形式来追踪变化
  2. 当外界通过Watcher读取数据时,会触发getter从而将Watcher添加到依赖中
  3. 当数据变化时,会触发setter从而向Dep中的依赖(watcher)发送通知
  4. Watcher接受通知之后,会向外界发送通知,变化通知到外界后可能会触发视图更新,也有可能触发用户的某一个回调函数等
    专业术语:
  • 数据劫持/数据代理
  • 依赖收集
  • 发布订阅

一句话总结:

vue.js 采用数据劫持结合发布-订阅模式,通过 Object.defineproperty 来劫持各个属性的 setter,getter,在数据变动时发布消息给订阅者,触发响应的监听回调

 

标签:触发,vue,实例,watcher,响应,依赖,原理,Watcher,setter
From: https://www.cnblogs.com/luluping/p/17992651

相关文章

  • 前端VUE
    1、   export和exportdefault的区别exportdefaultxxximportxxxfrom'./'exportxxximport{xxx}from'./'在一个文件或模块中,export、import可以有多个,exportdefault仅有一个通过export方式导出,在导入时要加{},exportdefault则不需要 2、    vuenextt......
  • Vue 之 Mixins (混入)
    Mixins是一种分发Vue组件中可复用功能的非常灵活的一种方式。什么时候使用Mixins 1.页面的风格不用,但是执行的方法和需要的数据类似,我们是选择每个都写呢还是提取出公共部分呢? 基础实例我们有一对不同的组件,它们的作用是切换一个状态布尔值,一个模态框和一个提示框。这些......
  • vue 中slot
    插槽使用场景 -该组件被多个地方使用-每个父组件中对该组件的内部有一部分需要特殊定制-slot可以让我们更好的复用组件的同时并对其定制化处理-可以理解为父组件想子组件传递了一段html文本要求:1.子组件模板包含至少一个插槽<slot></slot>2.父组件整个......
  • Vue 数据相关实例方法vm.$watch、vm.$set、vm.$delete介绍
    vm.$watch观察vue实例变化的一个表达式或计算属性函数。回调函数得到的参数为新值和旧值。表达式只接受监督的键路径。对于更复杂的表达式,用一个函数取代。//写法一:this.$watch('a.b.c',function(newVal,oldVal){})//键路径vm.$watch(function(){this.fullName=this.......
  • Vue 响应性
    一、响应性原理 数据模型是被代理的JavaScript对象。而当你修改它们时,视图会进行更新。这让状态管理非常简单直观。理解其工作原理同样重要,这样可以避开一些常见的问题。1什么是响应性?响应性是一种允许我们以声明式的方式去适应变化的一种编程范例。如excell。js如何实......
  • Oracle RAC SCAN ip的原理、配置及优缺点
    在oracle11g中,SCANIP还用的很少。到oracle12.2或者19c,用户已经基本上清一色的切换到了SCANIP。所以很有必要理解oracle的SCANIP运行机制和配置。先回顾下VIP。RAC的每个节点都需要有一个虚拟IP,这就是VIP。VIP需要和PUBLICIP同一个子网,它们是由GI的Clusterware来管理......
  • R数据分析:非劣效性研究设计的统计处理方法,原理和实例
    在我们经常接触的统计模式中,我们是在寻求推翻原假设,证明差异,这种统计模型在传统的临床试验中,在各种统计推断中已经成为默认了。在传统的临床试验中通常会将一种新的治疗方法与标准治疗或安慰剂进行比较,从而证明这种新治疗具有更好的疗效,这类试验的原假设是这两种治疗方案的治疗效......
  • .NetCore开发人员首选框架---Bridge(Abp-VNext + Vue3)
    bridge系统是基于Abp-VNext+Vue3开发的一套前后端分离的通用权限管理系统,不论是单体服务,还是微服务都可在此基础上自由扩展,此框架组合可以说是集成了.netcore在BS架构领域最前沿的技术,框架简介如下:##......
  • 利用vue-inline-svg实现将svg进行动态拆分
    构想是很好的,svg的优势在于矢量,可以随便实现异形控件就来说下这玩意怎么用吧先用npm导入(注意版本,第三方的玩意一版本般都比较新)vue的话是这个npminstallvue-inline-svg我是vue3所以用的版本不一样npminstallvue-inline-svg@next这个是npm那边的说明如果会看这个当......
  • 《深入理解Kafka:核心设计与实践原理》PDF
    内容简介《深入理解Kafka:核心设计与实践原理》从Kafka的基础概念切入,循序渐进地转入对其内部原理的剖析。《深入理解Kafka:核心设计与实践原理》主要阐述了Kafka中生产者客户端、消费者客户端、主题与分区、日志存储、原理解析、监控管理、应用扩展及流式计算等内容。虽然Kafka的内......