百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

破防!Vue2 响应式原理(Vue2必会)(vuex响应式)

myzbx 2025-03-19 00:29 51 浏览

大家好,我是大澈!一个喜欢结交朋友、喜欢编程技术和科技前沿的老程序员,关注我,科技未来或许我能帮到你!

今天聊聊Vue生态前端一个老生常谈的问题,Vue2 响应式原理。

这个问题呢,是基础,也是重点。

网上有各种各样的理解,眼花缭乱。而这次,我会以一个全新的角度出发,主打一个简洁,通俗易懂。

话不多说,朋友们,开整!

一、重点描述

总的来说,Vue响应式设计,使得 Vue 能够在初始渲染时快速构建 DOM,而在数据更新时通过 diff 算法只更新实际变动的部分,从而提高了性能和响应速度。

所以,这里我把 Vue2 响应式原理,分为了2个阶段、5个步骤。

2个阶段:初始化阶段、数据更新阶段。

5个步骤:数据劫持、模板编译、虚拟 DOM 生成、虚拟 DOM 对比、DOM 更新。

5个步骤组合实现了2个阶段。

2个阶段分别对应了生命周期的创建、更新。

掌握了5个步骤后,组合起来就掌握了2个阶段,进而就掌握了Vue2实例的生命周期核心。

二、细节剖析

1、5个步骤

5个步骤:数据劫持、模板编译、虚拟 DOM 生成、虚拟 DOM 对比、DOM 更新。

1.1、数据劫持

在 Vue 实例创建时,数据劫持就开始执行。

Vue 遍历 data 中的所有属性,利用 Object.defineProperty 为每个属性设置 getter 和 setter。

当属性被读取或修改时,通过 getter/setter 拦截,实现对数据变化的监控。

1.2、模板编译

在数据劫持完成后,Vue 会将HTML模板转化为js渲染函数。

1.3、虚拟 DOM 生成

调用生成的渲染函数,会创建一个新的 watcher ,并根据当前的数据状态生成虚拟 DOM 树。

同时,渲染函数会访问数据属性,这时每个属性的 getter 会被触发,getter 内部会将当前渲染中的 watcher 添加到依赖列表中,建立数据与视图之间的关联。

此时,如果响应式数据发生变化,数据对应的 setter 会被触发。

setter 触发通知(如调用 dep.notify()),将依赖该数据的 watcher 加入更新队列。更新是异步批量处理的,避免频繁重渲染。

由于 watcher 被触发,渲染函数重新执行,同样会进行依赖收集,确保最新数据与视图绑定,最终生成新的虚拟 DOM 树。

1.4、虚拟 DOM 对比

如果有旧的虚拟 DOM,新旧虚拟 DOM 树通过 diff 算法进行比较,找出具体发生变化的部分。

1.5、DOM 更新

根据虚拟 DOM diff 得到的差异,进行 Patch 过程。

生成一个变更清单,记录所有需要修改的 DOM 节点,直接操作真实 DOM,但只修改变更清单中记录的部分,而不是整个页面重渲染,进而提高更新性能和页面响应速度。

此时,父组件更新时,子组件不会重新渲染,除非子组件使用的 props 发生变化。

当然,如果没有旧的虚拟 DOM,则无需进行 diff 对比,无需进行 Patch 过程,直接一次性生成完整的 DOM 结构。

2、2个阶段

2个阶段:初始化阶段、数据更新阶段。

1.1、初始化阶段

Vue 实例创建后首次渲染页面时的过程。

经历了4个步骤:数据劫持、模板编译、虚拟 DOM 生成、DOM 更新。

注意,这个阶段没有旧的虚拟 DOM,无需进行 diff 对比,无需进行 Patch 过程,直接一次性生成完整的 DOM 结构。

1.2、数据更新阶段

在数据发生变化后重新渲染页面的过程。

经历了3个步骤:虚拟 DOM 生成、虚拟 DOM 对比、DOM 更新。

注意,这个阶段是在响应式数据发生变化时,数据对应的 setter 会被触发,进而执行更新流程。

好了,今天要分享的内容就是这么多,最后感谢朋友们给个点赞、分享、推荐,拜拜~

相关推荐

vue:生命周期钩子函数及顺序_列举出5个vue中常用的生命周期钩子函数

一、vue的钩子相关顺序Vue实例有一个完整的生命周期,在newVue()后,会初始化数据,如下://初始化的入口,各种初始化工作initMixin(Vue);//数据绑定的核心方法,包括常用...

最长递增子序列:从经典算法到 Vue3 运行时核心优化

最长递增子序列(LongestIncreasingSubsequence,LIS)正悄然成为性能分水岭。它不仅是面试的高频考点,更是Vue3快速Diff算法赖以实现O(nlogn)...

十分钟掌握Vue 3性能优化:实战技巧与避坑指南

「为什么我的Vue应用越做越卡?」这是最近团队新人最常问的问题。本文将从真实电商项目出发,手把手教你用Vue3的现代特性实现性能飞跃,文末还准备了可复用的优化检查清单!一、先看疗效:优化前后对比优...

JavaScript学习 -- 文本节点_html 文本节点

什么是文本节点在HTML文档中,文本节点是一种特殊的dom节点,它包含文本内容,没有任何标记或属性。<p>这是一段文本节点</p>在上面的代码中,<p>元素包含了...

JavaScript中this指向各种场景_javascript的this指向

在JavaScript中,this的指向是一个核心概念,其值取决于函数的调用方式,而非定义位置(箭头函数除外)。以下是this指向的常见场景及具体说明:1.全局作用域中的this在全局作用域(非...

v-if和v-for的优先级是什么?_v-if和v-for的区别,什么时候用

#一、作用v-if指令用于条件性地渲染一块内容。这块内容只会在指令的表达式返回true值的时候被渲染v-for指令基于一个数组来渲染一个列表。v-for指令需要使用iteminitems...

Vue插槽(Slot)深度解析:从匿名到作用域的组件复用革命

在Vue组件化开发中,内容分发始终是核心挑战之一。当我们需要让组件既能保持结构复用,又能灵活定制局部内容时,插槽(Slot)机制应运而生。从基础的匿名插槽到复杂的作用域插槽,Vue的插槽系统逐步解决了...

手摸手带你解决AI应用开发中Markdown渲染问题

使用Markdown-It+VueRender实现安全可控的Markdown渲染在前端项目中,Markdown的渲染经常使用markdown-it。它功能丰富、插件多,但默认的渲染方...

Vue3 新趋势:10 个最强 X 操作!_vue.3

Vue3为前端开发带来了诸多革新,它不仅提升了性能,还提供了更简洁、更强大的API。以下是十个最值得学习和使用的Vue3API,它们将助力你的开发工作迈向新高度。浅层响应式API:shall...

25个React最佳实践小技巧_reactor设计模式

以下是25个React开发中实用的最佳实践与小技巧,覆盖组件设计、状态管理、性能优化、代码规范、错误处理等核心场景,每个技巧均附示例和核心原因,帮助你写出更高效、可维护的React代码。一...

javascript函数的call、apply和bind的原理及作用详解

javascript函数的call、apply和bind本质是用来实现继承的,专业点说法就是改变函数体内部this的指向,当一个对象没有某个功能时,就可以用这3个来从有相关功能的对象里借用过来...

简单介绍一下前端各框架中的模板标签

在各大前端框架、小程序中,此类标签的作用主要是用来帮助我们包裹多个元素。在浏览器实际渲染中会将其移除只渲染其包裹的DOM元素,所以说不会增加额外的DOM节点在小程序中使用小程序中的模板标签是<...

面试官问我,后端一次性返回十万条数据,前端应该怎么处理 ?

问题描述面试官:后端一次性返回10万条数据给你,你如何处理?我:歪嘴一笑,马上给后端发送一百万次请求,干蹦他的服务器,让他给爷哭!问题考察点性能优化意识(能否识别出“10万条数据”会导致性能问题?是...

React系列十 - 高阶组件以及组件补充

源自:coderwhy一.高阶组件1.1.认识高阶组件什么是高阶组件呢?相信很多同学都听说过,也用过高阶函数,它们非常相似,所以我们可以先来回顾一下什么是高阶函数。高阶函数的维基百科定义:至少...

从0开始写一个虚拟滚动组件_虚拟滚动原理

如果一个页面有1W+条数据,该怎么渲染比较好。不管是在我们的实际项目开发中还是在面试的过程中都会遇到类似的问题。相信很多同学会想到分页。当然这也是最传统也是最保底的解决方案了。如果有开发过electr...