vue3的响应式设计原理

Vue 3 的响应式设计是其核心特性之一,依赖于 Proxy依赖收集机制,相比 Vue 2 的 Object.defineProperty,Vue 3 的响应式系统更加高效、灵活且易于维护。

以下是 Vue 3 响应式设计的核心原理:


一、核心机制概览

  1. 使用 Proxy 实现响应式

    • Vue 3 用 Proxy 包装对象,实现对属性的读取和设置的拦截(getset)。

    • 相比 Vue 2,Proxy 可以监听新增属性和删除属性,避免 Vue 2 的 Vue.set 限制。

  2. 依赖收集(Dep)与触发更新(Trigger)

    • Vue 会在 getter 中收集当前运行的副作用函数(例如组件的渲染函数)。

    • 当数据发生变化时,setter 会触发这些副作用函数,重新执行。

  3. 响应式核心工具函数

    • reactive():将对象转换为响应式对象。

    • ref():将基本类型(如 numberstring)或对象封装成响应式引用。

    • computed():计算属性,具备缓存能力。

    • effect()(Vue 内部 API):注册副作用函数,用于响应式依赖追踪。


二、基本流程图

  1. 调用 reactive(obj) -> 返回 Proxy 包装对象

  2. 首次访问属性 proxy.a -> 执行 get,收集依赖

  3. 修改属性 proxy.a = 2 -> 执行 set,触发依赖更新


三、依赖追踪与触发的简化示意

// 模拟一个简单响应式系统
let targetMap = new WeakMap();function track(target, key) {const effect = activeEffect;if (!effect) return;let depsMap = targetMap.get(target);if (!depsMap) {depsMap = new Map();targetMap.set(target, depsMap);}let deps = depsMap.get(key);if (!deps) {deps = new Set();depsMap.set(key, deps);}deps.add(effect);
}function trigger(target, key) {const depsMap = targetMap.get(target);if (!depsMap) return;const deps = depsMap.get(key);deps && deps.forEach(effect => effect());
}let activeEffect = null;
function effect(fn) {activeEffect = fn;fn(); // 执行函数,会触发 get,从而 trackactiveEffect = null;
}function reactive(obj) {return new Proxy(obj, {get(target, key, receiver) {track(target, key);return Reflect.get(target, key, receiver);},set(target, key, value, receiver) {const result = Reflect.set(target, key, value, receiver);trigger(target, key);return result;}});
}

四、Vue 3 中响应式的优势

特性Vue 2Vue 3
基础实现Object.definePropertyProxy
新增/删除属性需要手动使用 Vue.set原生支持
性能多层嵌套对象递归劫持,性能差延迟代理,性能好
API 风格Options API 为主支持 Composition API

五、实战示例

import { reactive, effect } from 'vue'const state = reactive({ count: 0 })effect(() => {console.log(`count is: ${state.count}`)  // 自动收集依赖
})state.count++ // 自动触发更新

如果你需要可视化原理图,我可以为你画一个响应式原理的流程图,要我帮你画一个吗?

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/80506.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++模板笔记

Cpp模板笔记 文章目录 Cpp模板笔记1. 为什么要定义模板2. 模板的定义2.1 函数模板2.1.1 函数模板的重载2.1.2 头文件与实现文件形式(重要)2.1.3 模板的特化2.1.4 模板的参数类型2.1.5 成员函数模板2.1.6 使用模板的规则 2.2 类模板2.3 可变参数模板 模板…

递归函数(斐波那契数列0,1,1,2,3,5,8,13,21,34,55...)

目录 一、斐波那契数列(兔子问题) 二、迭代法(用while循环推下一项 ) 三、递归函数 (函数的定义中调用函数自身的一种函数定义方式) 四、递归函数的底层逻辑推理 (二叉树推倒最左下节点回退法) 一、斐波那契数列(兔子问题&…

光的本质(以暗物质维度粒子为介质的能量传导)

一、光的概要描述 1、光的本质是能量传导 空间中均匀分布着暗物质维度粒子。光不是粒子也不是波,而是没有质量和形态的能量,在临近暗物质粒子之间的一种能量传递。 2、光能传递类似牛顿钟摆(空间中的牛顿钟摆) 当光能能量骚动一个暗物质粒子后,该暗物质粒…

Open CASCADE学习|管道壳体生成

一、引言 在计算机辅助设计(CAD)和计算机图形学领域,OpenCASCADE 是一款功能强大的开源 3D 建模库。它提供了丰富的几何和拓扑建模工具,其中管道壳体(Pipe Shell)生成是其重要功能之一。管道壳体广泛应用于…

JS正则表达式介绍(JavaScript正则表达式)

文章目录 JavaScript正则表达式完全指南正则表达式基础元字符与特殊字符基本元字符. - 点号\d - 数字\D - 非数字\w - 单词字符\W - 非单词字符\s - 空白字符\S - 非空白字符 正则表达式标志常用标志详解g - 全局匹配i - 忽略大小写m - 多行匹配s - 点号匹配所有字符u - Unicod…

Kubernetes 使用 containerd 实现 GPU 支持及 GPU Operator 部署指南

目录 Kubernetes 使用 containerd 实现 GPU 支持及 GPU Operator 部署指南 一、为什么 containerd 是趋势? 二、目标 三、前提条件 四、方式一:containerd nvidia-container-toolkit(基础方式) 1️⃣ 安装 NVIDIA Containe…

leetcode 2918. 数组的最小相等和 中等

给你两个由正整数和 0 组成的数组 nums1 和 nums2 。 你必须将两个数组中的 所有 0 替换为 严格 正整数,并且满足两个数组中所有元素的和 相等 。 返回 最小 相等和 ,如果无法使两数组相等,则返回 -1 。 示例 1: 输入&#xf…

猿人学第十二题-js入门

1. 链接 https://match.yuanrenxue.cn/match/12 2. 抓包分析 2.1. m参数 通过观察,只有m参数要解决: 3. 逆向分析 3.1. 跟栈 直接跟栈吧,一下就出结果了: 可以看到m其实很简单,就是固定字符串 当前页数&#xf…

双系统电脑中如何把ubuntu装进外接移动固态硬盘

电脑:win11 ubuntu22.04 实体机 虚拟机:VMware17 镜像文件:ubuntu-22.04.4-desktop-amd64.iso 或者 ubuntu20.4的镜像 外接固态硬盘1个 一、首先win11中安装vmware17 具体安装方法,网上很多教程 二、磁盘分区 1.在笔…

202535| Kafka架构与重要概念+幂等性+事务

好的!以下是关于 Kafka 架构 以及其 重要概念 的详细介绍,结合 Mermaid 图形 和 表格,帮助你更好地理解各个概念的关系和作用。 Kafka 架构与重要概念 Kafka 是一个分布式消息系统,广泛应用于日志收集、流处理、事件驱动架构等场…

从0开始学习大模型--Day05--理解prompt工程

提示词工程原理 N-gram:通过统计,计算N个词共同出现的概率,从而预测下一个词是什么。 深度学习模型:有多层神经网络组成,可以自动从数据中学习特征,让模型通过不断地自我学习不断成长,直到模型…

Amazing晶焱科技:系统级 EOS 测试方法 - System Level EOS Testing Method

系统上常见的EOS测试端口以AC电源、电话线(RJ11)、同轴电缆(coaxial cable)以及以太网络(RJ45)最常见,这些端口因有机会布线至户外的关系,受到EOS/Surge冲击的几率也大大提升。因此电…

数据结构—(概述)

目录 一 数据结构,相关概念 1. 数据结构: 2. 数据(Data): 3. 数据元素(Data Element): 4. 数据项: 5. 数据对象(Data Object): 6. 容器(container): 7. 结点(Node)&#xff…

Vue 两种导航方式

目录 一、声明式导航 二、编程式导航 三、两句话总结 一、声明式导航 1. 传参跳转&#xff1a; <router-link :to"/user?nameCHEEMS&id114514">Query传参 </router-link><router-link :to"/user?参数名1参数值1&参数名2参数值2&a…

QTableWidget实现多级表头、表头冻结效果

最终效果&#xff1a; 实现思路&#xff1a;如果只用一个表格的话写起来比较麻烦&#xff0c;可以考虑使用两个QTableWidget组合&#xff0c;把复杂的表头一个用QTableWidget显示&#xff0c;其他内容用另一个QTableWidget。 #include "mainwindow.h" #include &qu…

2025年客运从业资格证备考单选练习题

客运从业资格证备考单选练习题 1、从事道路旅客运输活动时&#xff0c;应当采取必要措施保证旅客的人身和财产安全&#xff0c;发生紧急情况时&#xff0c;首先应&#xff08; &#xff09;。 A. 抢救财产 B. 抢救伤员 C. 向公司汇报 答案&#xff1a;B 解析&#xff1a;…

python打卡day21

常见的降维算法 知识点回顾&#xff1a; LDA线性判别PCA主成分分析t-sne降维 之前学了特征降维的两个思路&#xff0c;特征筛选&#xff08;如树模型重要性、方差筛选&#xff09;和特征组合&#xff08;如SVD/PCA&#xff09;。 现在引入特征降维的另一种分类&#xff1a;无/有…

专业级软件卸载工具:免费使用,彻底卸载无残留!

在数字生活节奏日益加快的今天&#xff0c;我们的电脑就像每天都在"吃进"各种软件。但您是否注意到&#xff0c;那些看似消失的程序其实悄悄留下了大量冗余文件&#xff1f;就像厨房角落里积攒的调味瓶空罐&#xff0c;日积月累就会让系统变得"消化不良"。…

【Linux】基础 IO(一)

&#x1f4dd;前言&#xff1a; 这篇文章我们来讲讲Linux——基础IO主要包括&#xff1a; 文件基本概念回顾 C文件的操作介绍系统关于文件的基本操作 &#x1f3ac;个人简介&#xff1a;努力学习ing &#x1f4cb;个人专栏&#xff1a;Linux &#x1f380;CSDN主页 愚润求学 …

Java 原生实现代码沙箱之Java 程序安全控制(OJ判题系统第2期)——设计思路、实现步骤、代码实现

在看这一期之前&#xff0c;需要先看上一期的文章&#xff1a; Java 原生实现代码沙箱&#xff08;OJ判题系统第1期&#xff09;——设计思路、实现步骤、代码实现-CSDN博客 Java 程序可能出现的异常情况 1、执行超时 占用时间资源&#xff0c;导致程序卡死&#xff0c;不释…