当前位置: 首页 > 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.lryc.cn/news/606822.html

相关文章:

  • StarRocks vs. Trino
  • 九联UNT403HS_海思MV320处理器_安卓9-优盘强刷刷机包
  • 嵌入式 Linux 深度解析:架构、原理与工程实践(增强版)
  • 企业级LLM智能引擎 的完整解决方案,整合了 SpringAI框架、RAG技术、模型控制平台(MCP)和实时搜索,提供从架构设计到代码实现的全面指南:
  • cloudflare worker + Cloudflare AI Gateway
  • 如何在不依赖 Office 的情况下转换 PDF 为可编辑文档
  • python中appium
  • K8S周期性备份etcd数据实战案例
  • 精通分类:解析Scikit-learn中的KNN、朴素贝叶斯与决策树(含随机森林)
  • 应用药品注册证识别技术,为医药行业的合规、高效与创新发展提供核心驱动力
  • 智能图书馆管理系统开发实战系列(四):后端C++ DLL开发与模块化设计
  • Dify版本升级实操
  • 体育直播系统搭建:核心数据详细接入指南
  • 网络编程-加密算法
  • CCleaner是否被过誉了?C盘满了怎么办?用ccleaner清除C盘垃圾,3款电脑系统磁盘清理和优化软件
  • 应用Builder模式在C++中进行复杂对象构建
  • Vue与Ajax快速入门
  • GXP6040K压力传感器可应用于医疗/汽车/家电
  • Python Flask框架Web应用开发完全教程
  • 【stm32】GPIO
  • 第3章 AB实验的统计学知识
  • 从Web2.0到Web3.0:社交参与方式的重塑与延伸
  • 报错[Vue warn]: Failed to resolve directive: else如何解决?
  • Linux9 root密码修改
  • 数据结构第5问:什么是队列?
  • 【科普】怎么理解Modbus、TCP、UDP
  • C++入门自学Day4-- c++类与对象(友元)
  • 《软件测试与质量控制》实验报告一 测试用例设计
  • 新一代PLC控制软件平台EsDA-AWStudio
  • Linux文件系统理解2