简述vue响应式原理

vue官方阐述:https://cn.vuejs.org/v2/guide/reactivity.html

响应式数据的最终目标,是当对象本身或对象属性发生变化时,将会运行一些函数,最常见的就是render函数。

在具体实现上,vue用到了几个核心部件

  1. Observer
  2. Dep
  3. Watcher
  4. Scheduler

Observer

Observer要实现的目标非常简单,就是把一个普通的对象转换为响应式的对象

为了实现这一点,Observer把对象的每个属性通过Object.defineProperty转换为带有gettersetter的属性,这样一来,当访问或设置属性时,vue就有机会做一些别的事情。
在这里插入图片描述

Observer是vue内部的构造器,我们可以通过Vue提供的静态方法Vue.observable( object )间接的使用该功能。

在组件生命周期中,这件事发生在beforeCreate之后,created之前。

具体实现上,它会递归遍历对象的所有属性,以完成深度的属性转换。

由于遍历时只能遍历到对象的当前属性,因此无法监测到将来动态增加或删除的属性,因此vue提供了$set$delete两个实例方法,让开发者通过这两个实例方法对已有响应式对象添加或删除属性。

对于数组,vue会更改它的隐式原型,之所以这样做,是因为vue需要监听那些可能改变数组内容的方法
在这里插入图片描述

总之,Observer的目标,就是要让一个对象,它属性的读取、赋值,内部数组的变化都要能够被vue感知到。

Dep

这里有两个问题没解决,就是读取属性时要做什么事,而属性变化时要做什么事,这个问题需要依靠Dep来解决。

Dep的含义是Dependency,表示依赖的意思。

Vue会为响应式对象中的每个属性、对象本身、数组本身创建一个Dep实例,每个Dep实例都有能力做以下两件事:

  • 记录依赖:是谁在用我
  • 派发更新:我变了,我要通知那些用到我的人

当读取响应式对象的某个属性时,它会进行依赖收集:有人用到了我

当改变某个属性时,它会派发更新:那些用我的人听好了,我变了

Watcher

这里又出现一个问题,就是Dep如何知道是谁在用我?

要解决这个问题,需要依靠另一个东西,就是Watcher。

当某个函数执行的过程中,用到了响应式数据,响应式数据是无法知道是哪个函数在用自己的

因此,vue通过一种巧妙的办法来解决这个问题

我们不要直接执行函数,而是把函数交给一个叫做watcher的东西去执行,watcher是一个对象,每个这样的函数执行时都应该创建一个watcher,通过watcher去执行

watcher会设置一个全局变量,让全局变量记录当前负责执行的watcher等于自己,然后再去执行函数,在函数的执行过程中,如果发生了依赖记录dep.depend(),那么Dep就会把这个全局变量记录下来,表示:有一个watcher用到了我这个属性

当Dep进行派发更新时,它会通知之前记录的所有watcher:我变了

每一个vue组件实例,都至少对应一个watcher,该watcher中记录了该组件的render函数。

watcher首先会把render函数运行一次以收集依赖,于是那些在render中用到的响应式数据就会记录这个watcher。

当数据变化时,dep就会通知该watcher,而watcher将重新运行render函数,从而让界面重新渲染同时重新记录当前的依赖。

Scheduler

现在还剩下最后一个问题,就是Dep通知watcher之后,如果watcher执行重运行对应的函数,就有可能导致函数频繁运行,从而导致效率低下

试想,如果一个交给watcher的函数,它里面用到了属性a、b、c、d,那么a、b、c、d属性都会记录依赖,于是下面的代码将触发4次更新:

state.a = "new data";
state.b = "new data";
state.c = "new data";
state.d = "new data";

这样显然是不合适的,因此,watcher收到派发更新的通知后,实际上不是立即执行对应函数,而是把自己交给一个叫调度器的东西

调度器维护一个执行队列,该队列同一个watcher仅会存在一次,队列中的watcher不是立即执行,它会通过一个叫做nextTick的工具方法,把这些需要执行的watcher放入到事件循环的微队列中,nextTick的具体做法是通过Promise完成的

nextTick 通过 this.$nextTick 暴露给开发者

nextTick 的具体处理方式见:https://cn.vuejs.org/v2/guide/reactivity.html#%E5%BC%82%E6%AD%A5%E6%9B%B4%E6%96%B0%E9%98%9F%E5%88%97

也就是说,当响应式数据变化时,render函数的执行是异步的,并且在微队列中

总体流程

image-20210226163936839

静水流深,沧海一粟
关注 关注
  • 2
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
vue响应式原理
垂耳兔的博客
04-28 8628
一、reduce 1.数值的累加 作用:将****前一项*和*后一项****的值进行运算,返回累积的结果 格式:数组.reduce(function(prev,next){…}) 其中,prev表示前一项,next表示后一项。 运算规则: 默认情况下,会把数组的第一个元素作为prev的初始值。 每循环一次,把累积的结果赋给prev,next就变为下一个数组元素 var arr3 = [10,22,23,25,50]; const total = arr3.reduce(function(pre,ne
Vue 响应式实现原理深入浅出
小王的技术库
09-30 2326
vue 是一个易上手的框架,许多便捷功能都在其内部做了集成,其中最有区别性的功能就是其潜藏于底层的响应式系统。组件状态都是响应式的 JavaScript 对象。当更改它们时,视图会随即更新,这让状态管理更加简单直观。那么,Vue 响应性系统是如何实现的呢?本文也是在阅读了 Vue 源码后的理解以及模仿实现,所以跟随作者的思路,我们一起由浅入深的探索一下vue吧!本文 Vue 源码版本:2.6.14,为了便于理解,代码都最简化。方法会直接在一个对象上定义一个新属性,或者修改一个对象的现有属性,并返回此对象。
Vue-数据响应式原理
s8806479的博客
04-25 1134
什么是数据响应式? 数据变化,页面重新渲染。×不准确 数据是在对象里面,就是改变了对象的一个属性,运行了render函数。√稍微准确 改变了对象,运行了某些函数。√准确 响应式数据的最终目标,是当对象本身或对象属性发生变化时,将会运行一些函数,最常见的就是render函数。 以上两张图证明了对象改变,运行了某些函数。 在具体实现上,vue用到了几个核心部件: 0bserver Dep Watcher Scheduler 0bserver 我们先来思考,对象改变,怎么联动地运行某些函数? ES5数据劫持
vue响应式原理
热门推荐
weixin_48181168的博客
09-07 3万+
vue响应式原理 vue响应式也叫作数据双向绑定,大致原理阐述: ​ 首先我们需要通过Object.defineProperty()方法把数据(data)设置为getter和setter的访问形式,这样我们就可以在数据被修改时在setter方法设置监视修改页面信息,也就是说每当数据被修改,就会触发对应的set方法,然后我们可以在set方法中去调用操作dom的方法。 ​ 此外,如果页面有input用v-model绑定数据,我们需要在这种绑定了data的input元素上添加监听,添加input事件监听,每.
浅谈Vue响应式原理
XinKun的博客
02-02 2万+
一、Vue中的响应式 Vue 最独特的特性之一,是其非侵入性的响应式系统。数据模型仅仅是普通的 JavaScript 对象。而当你修改它们时,视图会进行更新。 二、响应式的基本原理 1.通过Object.definePropert来实现监听数据的改变和读取(属性中的getter和setter方法) 实现数据劫持 2.观察者模式(发布者-订阅者) 观察者(订阅者) – Watcher: update():当事件发生时,具体要做的事情 目标(发布者) – Dep: ①subs 数组:存储所有的观察者 ②
Vue3中的响应式原理
小田是个程序员的博客欢迎你的到来呀~
04-20 1万+
Vue2中,数据响应式主要借助Object.defineProperty()来实现,存在的缺陷是无法操作数据的增加和删除,在Vue3中,数据响应式主要借助proxy和Reffect配合实现,可以做到实现数据的增删改查。
详细分析vue响应式原理
10-15
主要介绍了vue响应式原理的的相关资料,文中讲解非常细致,代码帮助大家更好的理解和学习,感兴趣的朋友可以了解下
vue响应式原理.pdf
04-19
响应式原理:在读取属性的时候收集依赖,在改变属性值的时候触发依赖的更新 实现一个observer,劫持对象属性的getter和setter 实现一个全局的订阅器Dep,可以追加订阅者,和通知依赖更新 在读取属性的时候追加当前...
Vue响应式原理详解
08-30
本篇文章主要介绍了Vue响应式原理详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
Vue.js 中的响应式原理是什么?
最新发布
u013749113的博客
06-05 1231
Vue.js中,响应式是指当数据发生变化时,相关的视图将自动更新。这种自动更新是通过Vue.js内部的响应式系统实现的。响应式系统是Vue.js的核心组成部分之一,它的工作原理是将数据对象转换为响应式对象。响应式对象是一个包装了原始对象的代理对象,当我们访问响应式对象的属性时,实际上是访问了原始对象的属性。但是,当我们修改响应式对象的属性时,Vue.js会自动检测到这个变化,并通知相关的视图进行更新。Vue.js的响应式原理是通过将数据对象转换为响应式对象,利用ES6中的Proxy对象实现的。
vue原理面试题
克隆代码
07-07 1238
vue面试常问原理问题
Vue响应式原理
m0_73442777的博客
04-18 594
Vue.js的响应式原理Vue.js框架的核心之一。当你更新数据时,Vue.js能够自动地更新视图。这一过程实现了数据与视图之间的自动同步,使得应用程序的开发更加高效。
理解VUE响应式原理
buler_sky的博客
11-23 2564
1、响应式原理基础 响应式原理基础是基于Object.defineProperty(obj, prop, descriptor),descriptor里面可以定义get和set方法,可以在获取属性值事触发get方法(可以收集依赖),设置属性值时触发set方法(更新依赖)。 扩展:上面是vue2.0的基础原理vue3.0的基础原理是: 2、核心对象:Dep与Watcher Dep: vue在data里申明的每一个属性都会生成一个Dep的实例对象,De...
Vue响应式原理概述
Baron的技术blog
07-28 510
1. 侦测数据的变化(数据劫持 / 数据代理) – Vue2.0——Object.defineProperty() - 无法检测到对象属性的添加或删除 - 无法监听数组的变化,需要进行数组方法的重写 – Vue3.0——Proxy - 直接代理整个对象,不需要遍历对象的每个属性 - 支持代理数组的变化 2. 收集视图依赖了哪些数据(依赖收集) 在getter中收集依赖,在setter中触发依赖, 将观察者Watcher对象存放到当前闭包中的订阅者Dep的subs中。 3. 数据变化时,自动“通知”需要更
Vue响应式原理及总结
weixin_30624825的博客
08-08 395
Vue响应式原理是核心是通过 ES5 的保护对象的 Object.defindeProperty 中的访问器属性中的 get 和 set 方法,data 中声明的属性都被添加了访问器属性,当读取 data 中的数据时自动调用 get 方法,当修改 data 中的数据时,自动调用 set 方法,检测到数据的变化,会通知观察者 Wacher,观察者 Wacher自动触发重新...
简述vue2的响应式原理
03-27
Vue2的响应式原理是利用了ES5的Object.defineProperty()方法实现的。Vue将要监听的数据对象进行递归遍历,把每个属性都转化为getter/setter。当数据发生变化时,setter会被触发,通知所有依赖该数据的地方进行更新。 Vue还通过一个Dep类来管理所有的依赖,每个数据都对应一个Dep实例,当数据发生变化时,Dep实例会通知所有依赖于该数据的地方进行更新。 在模板中使用了数据,Vue会将模板中的表达式转化为AST,然后生成渲染函数。渲染函数会在组件实例化时执行,它会把模板中的数据和组件实例关联起来,当数据发生变化时,渲染函数会被重新执行,生成新的虚拟DOM,最终更新到页面上。 总之,Vue2的响应式原理实现了数据的双向绑定,当数据发生变化时,视图会自动更新,当视图发生变化时,数据也会自动更新,使得开发人员可以更加专注于业务逻辑的实现,提高了开发效率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
写文章

热门文章

  • vue3+vite+Eslint: Error [ERR_REQUIRE_ESM]: require() of ES Module 10870
  • fetch发送请求:Failed to fetch 3507
  • Vite + Eslint + Vue 3: Parsing error: ‘>‘ expected.eslint 3268
  • 简述vue响应式原理 3054
  • Invalid options object. Dev Server has been initialized using an options object that does not match 2768

分类专栏

  • react 41篇
  • 浏览器API 10篇
  • ECMAScript 3篇
  • 网络通信 11篇
  • 日常积累 3篇
  • AI 1篇
  • node 31篇
  • typeScript 1篇
  • vite 1篇
  • css 1篇
  • 设计模式 8篇
  • vue3 3篇
  • 项目踩坑 3篇
  • vue原理面试题 1篇

最新评论

  • React 第二十六章 React.memo

    静水流深,沧海一粟: 已互关,共同进步表情包

  • React 第二十六章 React.memo

    静水流深,沧海一粟: 已互关,共同进步表情包

  • React 第二十六章 React.memo

    2301_82243491: 优质好文,细节很到位!【我也写了一些相关领域的文章,希望能够得到博主的指导,共同进步!】

  • React 第二十六章 React.memo

    普通网友: 写的真好,细节很到位!【我也写了一些相关领域的文章,希望能够得到博主的指导,共同进步!】

  • React 第二十八章 Hook useMemo

    静水流深,沧海一粟: 感谢支持表情包

您愿意向朋友推荐“博客详情页”吗?

  • 强烈不推荐
  • 不推荐
  • 一般般
  • 推荐
  • 强烈推荐
提交

最新文章

  • React 第四十章 completeWork 工作流程
  • React 第三十九章 beginWork工作流程
  • React 第三十八章 React 中的位运算
2024
05月 34篇
04月 4篇
03月 12篇
02月 7篇
01月 22篇
2023年25篇
2022年17篇
2021年2篇

目录

目录

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

PHP网站源码云浮营销网站报价安庆网站搜索优化哪家好防城港seo网站推广多少钱南充网站关键词优化报价广安SEO按天扣费报价遵义网站排名优化白城网站建设设计多少钱坪地网站seo优化公司淮北SEO按天扣费价格木棉湾百姓网标王推广价格信阳外贸网站建设报价宜宾营销网站丽水关键词按天计费哪家好塔城百姓网标王推荐布吉关键词排名包年推广公司景德镇seo网站推广报价濮阳建网站推荐丽江百姓网标王推广报价济宁网站推广工具价格武威网站推广方案公司永州百度关键词包年推广多少钱益阳百度竞价报价楚雄关键词排名报价来宾seo网站优化哪家好鹤岗网站优化推广安庆网站优化排名价格绵阳百搜标王多少钱武威关键词按天计费公司大丰SEO按天计费哪家好拉萨网站推广方案报价歼20紧急升空逼退外机英媒称团队夜以继日筹划王妃复出草木蔓发 春山在望成都发生巨响 当地回应60岁老人炒菠菜未焯水致肾病恶化男子涉嫌走私被判11年却一天牢没坐劳斯莱斯右转逼停直行车网传落水者说“没让你救”系谣言广东通报13岁男孩性侵女童不予立案贵州小伙回应在美国卖三蹦子火了淀粉肠小王子日销售额涨超10倍有个姐真把千机伞做出来了近3万元金手镯仅含足金十克呼北高速交通事故已致14人死亡杨洋拄拐现身医院国产伟哥去年销售近13亿男子给前妻转账 现任妻子起诉要回新基金只募集到26元还是员工自购男孩疑遭霸凌 家长讨说法被踢出群充个话费竟沦为间接洗钱工具新的一天从800个哈欠开始单亲妈妈陷入热恋 14岁儿子报警#春分立蛋大挑战#中国投资客涌入日本东京买房两大学生合买彩票中奖一人不认账新加坡主帅:唯一目标击败中国队月嫂回应掌掴婴儿是在赶虫子19岁小伙救下5人后溺亡 多方发声清明节放假3天调休1天张家界的山上“长”满了韩国人?开封王婆为何火了主播靠辱骂母亲走红被批捕封号代拍被何赛飞拿着魔杖追着打阿根廷将发行1万与2万面值的纸币库克现身上海为江西彩礼“减负”的“试婚人”因自嘲式简历走红的教授更新简介殡仪馆花卉高于市场价3倍还重复用网友称在豆瓣酱里吃出老鼠头315晚会后胖东来又人满为患了网友建议重庆地铁不准乘客携带菜筐特朗普谈“凯特王妃P图照”罗斯否认插足凯特王妃婚姻青海通报栏杆断裂小学生跌落住进ICU恒大被罚41.75亿到底怎么缴湖南一县政协主席疑涉刑案被控制茶百道就改标签日期致歉王树国3次鞠躬告别西交大师生张立群任西安交通大学校长杨倩无缘巴黎奥运

PHP网站源码 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化