当前位置:首页 > 技术分析 > 正文内容

vue3的响应式设计原理

ruisui8820小时前技术分析2

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

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


一、核心机制概览

  1. 使用 Proxy 实现响应式
  2. Vue 3 用 Proxy 包装对象,实现对属性的读取和设置的拦截(get 和 set)。
  3. 相比 Vue 2,Proxy 可以监听新增属性和删除属性,避免 Vue 2 的 Vue.set 限制。
  4. 依赖收集(Dep)与触发更新(Trigger)
  5. Vue 会在 getter 中收集当前运行的副作用函数(例如组件的渲染函数)。
  6. 当数据发生变化时,setter 会触发这些副作用函数,重新执行。
  7. 响应式核心工具函数
  8. reactive():将对象转换为响应式对象。
  9. ref():将基本类型(如 number、string)或对象封装成响应式引用。
  10. computed():计算属性,具备缓存能力。
  11. 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,从而 track
  activeEffect = 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 2

Vue 3

基础实现

Object.defineProperty

Proxy

新增/删除属性

需要手动使用 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++ // 自动触发更新

如果你需要可视化原理图,我可以为你画一个响应式原理的流程图,要我帮你画一个吗?#前端开发##后端开发##全栈开发##vue3#vue3#

扫描二维码推送至手机访问。

版权声明:本文由ruisui88发布,如需转载请注明出处。

本文链接:http://www.ruisui88.com/post/4223.html

标签: vue递归
分享给朋友:

“vue3的响应式设计原理” 的相关文章

「Git迁移」三行命令迁移Git包含提交历史,分支,tag标签等信息

问题描述:公司需要将一个git远程服务器的全部已有项目迁移到一台新服务器的Gitlab中,其中需要包含全部的提交纪录,已有的全部分支与全部打tag标签,目前此工作已全部迁移完毕,特此记录一下操作步骤环境描述:1. 要迁移的远程Git:Gitblit2. 迁移目的Git:Gitlab3. 暂存代码的P...

Vue从入门到实践 丨Vue-router基本使用

1. 什么是 vue-routervue-router 是 vue.js 官方给出的路由解决方案。它只能结合 vue 项目进行使用,能够轻松的管理 SPA 项目中组件的切换。vue-router 的官方文档地址:https://router.vuejs.org/zh/2. vue-router 安装...

分享15个基于Vue3.0全家桶的优秀开源项目

大家好,我是 Echa。今天来分享 15 个基于 Vue3.0 全家桶的优秀开源项目!1. Vue Admin Bettergithub : https://github.com/chuzhixin/vue-admin-bettervue admin better 对比其他来源 admin 框架有如...

推荐一个Java微服务商业级Sass开源电商小程序(开源,企业级项目)

使用Java微服务开发,SpringBoot2框架、MyBatis-plus持久层框架、Redis作为缓存、MySql8作为数据库。 前端vuejs作为开发语言,使用uniapp编码,同时支持微信小程序、安卓App、苹果App。 支持集群部署,单机部署。 unimall 针对中小商户、企业和个人消...

面试官:给我说说什么是同步异步?

今天是刘小爱自学Java的第95天。感谢你的观看,谢谢你。话不多说,开始今天的学习:一、同步、异步请求浏览器发送请求给服务器,其有同步请求和异步请求两种方式。1同步请求什么叫同步请求呢?就是在发送一个请求之后,需要等待服务器响应返回,才能够发送下一个请求。之前学的请求是通过浏览器地址栏发送请求,这种...

vue 如何实现跨域

跨域问题是因为浏览器的同源策略引起的,一种浏览器的安全机制,要求协议,域名,端口,都要一致!出于浏览器的同源策略限制,浏览器会拒绝跨域请求。什么叫跨域?非同源请求,均为跨域。名词解释:同源 —— 如果两个页面拥有相同的协议(protocol),端口(port)和主机(host),那么这两个页面就属于...