当前位置: 首页 > news >正文

Vue3 Vue3中的响应式原理

一、vue2.x的响应式

        1.实现原理:

                (1).对象类型:通过Object.defineProperty()对属性的读取、修改进行拦截(数据劫持)。

                (2).数组类型:通过重写更新数组的一系列方法来实现拦截。(对数组的变更方法进行了包裹)。

                Object.defineProperty(data,'count',{

                        get(){}

                        set(){}

                }

        2.存在问题:

                (1).新增属性、删除属性,界面不会更新。

                (2).直接通过下标修改数组,界面不会自动更新。

        具体Vue2响应式解析参考文章Vue 数据监视-CSDN博客。

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Vue2响应式原理</title>
</head>
<body><script>let person ={name:'张三',age:18}//模拟Vue2中的响应式let p={}Object.defineProperty(p,'name',{get(){console.log('有人访问了name')return person.name},set(value){console.log('有人修改了name')person.name = value}})Object.defineProperty(p,'age',{get(){console.log('有人访问了age')return person.age},set(value){console.log('有人修改了age')person.age = value}})</script>
</body>
</html>

二、vue3.0的响应式        

         1.实现原理:

                (1).通过Proxy(代理):拦截对象中任意属性的变化,包含:属性值的读写、属性的添加、属性的删除等。

                (2).通过Reflect(反射):对源对象的属性进行操作。

                (3).MDN文档中描述的Proxy与Reflect:

                        (1).Proxy:Proxy - JavaScript | MDN

                        (2).Reflect:Reflect - JavaScript | MDN

        //模拟Vue3中的响应式
        const p = new Proxy(person,{

            // 拦截读取属性值
            get(target,propName){
                return Reflect.get(target,propName)
            },

            // 拦截设置属性值或添加新属性
            set(target,propName,value){
                Reflect.set(target,propName,value)
            },

            // 拦截删除属性
            deleteProperty(target,propName){
                return Reflect.deleteProperty(target,propName)
            }
        })

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Vue3响应式原理</title>
</head>
<body><script>let person ={name:'张三',age:18}//模拟Vue3中的响应式const p = new Proxy(person,{get(target,propName){// console.log('@@@@',target,propName)// return target[propName]return Reflect.get(target,propName)},set(target,propName,value){// console.log(target,propName,value)// target[propName] =valueReflect.set(target,propName,value)},deleteProperty(target,propName){// return delete target[propName]return Reflect.deleteProperty(target,propName)}})</script>
</body>
</html>
http://www.dtcms.com/a/310248.html

相关文章:

  • 从零开始:Python编程快速入门指南
  • 超算中尝试安装dify(失败)
  • Docker 实战 -- Nextcloud
  • 茶叶蛋大冒险小游戏流量主微信抖音小程序开源
  • Nginx 配置导致 “无法建立到 ws://xxx/_stcore/stream 的连接” 的解决方案
  • 使用ai的共识,技巧,避坑。
  • 低速信号设计之 FSI 篇
  • 简单打包应用
  • 栈和队列(Java实现)
  • 代码审计工具Checkmarx9.5安装与激活
  • 【Linux】System V - 责任链模式与消息队列
  • CPU 占用升高 ≠ 卡顿:浏览器硬件加速的真正价值
  • 元宇宙的法律暗礁:从政策蓝海到合规红线
  • Dynamics 365 business central 与Shopify集成
  • 美团进军折扣超市,外卖未平、超市大战再起?
  • go-zero 详解
  • Web Serial API实战指南:在浏览器中实现串口通信
  • 8.1 Java Web(HTML P1-P14)
  • 智慧社区项目开发(五)—— 小区管理模块前后端实现详解:从数据模型到业务逻辑
  • vue+element 实现下拉框共享options
  • Js引用数据类型和ES6新特性
  • 幂等性校验(订单重复提交问题)
  • 生物医药研究数据分析工具测评:衍因科技如何重塑科研范式?
  • 鸿蒙 ArkWeb 加载优化方案详解(2025 最佳实践)
  • Linux文件操作:从C接口到系统调用
  • 8.1IO进程线程——文件IO函数
  • S7-1200 /1500 PLC 进阶技巧:组织块(OB1、OB10)理论到实战
  • 代码随想录day52图论3
  • ReAct模式深度解析:构建具备推理能力的AI智能体架构
  • 日志归档存储策略在海外云服务器环境的容量规划方法