如何解析Vue3的响应式原理
发表于:2025-11-07 作者:千家信息网编辑
千家信息网最后更新 2025年11月07日,本篇文章给大家分享的是有关如何解析Vue3的响应式原理,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。Vue2响应式原理回顾// 1.对象
千家信息网最后更新 2025年11月07日如何解析Vue3的响应式原理
本篇文章给大家分享的是有关如何解析Vue3的响应式原理,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。
Vue2响应式原理回顾
// 1.对象响应化:遍历每个key,定义getter、setter// 2.数组响应化:覆盖数组原型方法,额外增加通知逻辑const originalProto = Array.prototypeconst arrayProto = Object.create(originalProto) ;['push', 'pop', 'shift', 'unshift', 'splice', 'reverse', 'sort'].forEach( method => { arrayProto[method] = function () { originalProto[method].apply(this, arguments) notifyUpdate() } } )function observe (obj) { if (typeof obj !== 'object' || obj == null) { return } // 增加数组类型判断,若是数组则覆盖其原型 if (Array.isArray(obj)) { Object.setPrototypeOf(obj, arrayProto) } else { const keys = Object.keys(obj) for (let i = 0; i < keys.length; i++) { const key = keys[i] defineReactive(obj, key, obj[key]) } }}function defineReactive (obj, key, val) { observe(val) // 解决嵌套对象问题 Object.defineProperty(obj, key, { get () { return val }, set (newVal) { if (newVal !== val) { observe(newVal) // 新值是对象的情况 val = newVal notifyUpdate() } } })}function notifyUpdate () { console.log('页面更新!')}vue2响应式弊端:
响应化过程需要递归遍历,消耗较大
新加或删除属性无法监听
数组响应化需要额外实现
Map、Set、Class等无法响应式
修改语法有限制
Vue3响应式原理剖析
vue3使用ES6的Proxy特性来解决这些问题。
function reactive (obj) { if (typeof obj !== 'object' && obj != null) { return obj } // Proxy相当于在对象外层加拦截 // http://es6.ruanyifeng.com/#docs/proxy const observed = new Proxy(obj, { get (target, key, receiver) { // Reflect用于执行对象默认操作,更规范、更友好 // Proxy和Object的方法Reflect都有对应 // http://es6.ruanyifeng.com/#docs/reflect const res = Reflect.get(target, key, receiver) console.log(`获取${key}:${res}`) return res }, set (target, key, value, receiver) { const res = Reflect.set(target, key, value, receiver) console.log(`设置${key}:${value}`) return res }, deleteProperty (target, key) { const res = Reflect.deleteProperty(target, key) console.log(`删除${key}:${res}`) return res } }) return observed}//代码测试const state = reactive({ foo: 'foo', bar: { a: 1 }})// 1.获取state.foo // ok// 2.设置已存在属性state.foo = 'fooooooo' // ok// 3.设置不存在属性state.dong = 'dong' // ok// 4.删除属性delete state.dong // ok嵌套对象响应式
测试:嵌套对象不能响应
// 设置嵌套对象属性react.bar.a = 10 // no ok
添加对象类型递归
// 提取帮助方法 const isObject = val => val !== null && typeof val === 'object' function reactive (obj) { //判断是否对象 if (!isObject(obj)) { return obj } const observed = new Proxy(obj, { get (target, key, receiver) { // ... // 如果是对象需要递归 return isObject(res) ? reactive(res) : res }, //... }避免重复代理
重复代理,比如
reactive(data) // 已代理过的纯对象
reactive(react) // 代理对象
解决方式:将之前代理结果缓存,get时直接使用
const toProxy = new WeakMap() // 形如obj:observed const toRaw = new WeakMap() // 形如observed:obj function reactive (obj) { //... // 查找缓存,避免重复代理 if (toProxy.has(obj)) { return toProxy.get(obj) } if (toRaw.has(obj)) { return obj } const observed = new Proxy(...) // 缓存代理结果 toProxy.set(obj, observed) toRaw.set(observed, obj) return observed } // 测试效果 console.log(reactive(data) === state) console.log(reactive(state) === state)以上就是如何解析Vue3的响应式原理,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注行业资讯频道。
对象
代理
属性
数组
原理
方法
缓存
递归
测试
原型
更多
知识
篇文章
类型
结果
问题
实用
较大
代码
外层
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
ajax从数据库获取数据
数据库关联关系错误
使用数据库的基本要求
层次数据库
服务器数据库安全管理
免备案云服务器哪家好
网络安全应用的方法
温州工业网络技术推荐咨询
重庆网络安全测评技术
宏迈网络技术有限公司
香港服务器安全网站
思科服务器管理口ip
瀑布模型是软件开发方法
软件开发创业项目可行性分析
电信网络安全四级
车行终端数据库链接设置
混乱的服务器简介
2019网络安全宣传周口号
中国区域数字化发展数据库
60数据库大全
武汉宏川网络技术有限公司
软件开发数据结构和算法
it安全保障技术分册数据库
企业安全服务器版
大众点评服务器出现故障
安卓数据库怎么开发
关系数据库的作用
数据库如何解决数据访问困难
华硕主板带网络安全模式
eclipse查询数据库