Vue学习计划-Vue3--核心语法(十)Proxy响应式原理

Proxy响应式原理
1.Vue2的响应式
  • 实现原理:
    • 对象类型:通过Object.defineProperty()对属性的读取、修改进行拦截(数据劫持)
    • 数组类型:通过重写更新数组的一系列方法来实现拦截,(对数组的变更方法进行了包裹)
    Object.defineProperty(data, 'count', {
      get(){},
      set(){}
    })
    
  • 存在问题:
    • 新增属性、删除属性,界面不会更新

    解决方式: this.$set()\Vue.set()this.$delete()\Vue.delete()

    • 直接通过下标修改数组,界面不会更新

    解决方式: this.$set()\Vue.set(),Array.splice(0,1,‘demo’)

2. Vue3的响应式(Proxy)
  • 实现原理:
    • 通过Proxy(代理):拦截对象中任意属性的变化,包括:属性值的读写、属性的添加、属性的删除等
    • 通过Reflect(反射):对被代理的对象的属性进行操作
    • MDN文档中描述的ProxyReflect:
      • Proxy:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Proxy
      • Reflect:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Reflect
  1. 示例Proxy
<script>
let data = {
  name: '张三',
  age: 19
}
// 模拟Vue3响应式
const p = new Proxy(data, {
  // 接收参数 target:传入对象, propName: 读取到的具体属性名
  // 有人读取了某个属性
  get(target, propName){
    console.log(`有人读取了p身上的${propName}属性`,target, propName)
    return target[propName]
  },
  // 有人修改了p的某个属性、或新增某个属性
  set(target, propName, value){
    console.log(`有人修改或新增了p身上的${propName}属性`)
    target[propName] = value
  },
  // 有人删除某个属性
  deleteProperty(target, propName){
    console.log(`有人删除了p身上的${propName}属性`)
    return delete target[propName]
  }
})
</script>

效果图:
在这里插入图片描述

  1. 示例Reflect:
  1. Reflect.get(target, propertyKey[, receiver])
    获取对象身上某个属性的值,类似于 target[name]
  2. Reflect.set(target, propertyKey, value[, receiver])
    将值分配给属性的函数。返回一个Boolean,如果更新成功,则返回true。
  3. Reflect.deleteProperty(target, propertyKey)
    作为函数的delete操作符,相当于执行 delete target[name]
  4. Reflect.defineProperty(target, propertyKey, attributes)
    Object.defineProperty() 类似。如果设置成功就会返回 true

举个例子:

<script>
  let data = {
    name: '小明'
  }
  // Object.defineProperty操作, 重复定义会报错,不能继续往下执行,检验错误写在try...catch中
  // Object.defineProperty(data, 'age',{
  //   get(){
  //     return 19
  //   }
  // })
  // Object.defineProperty(data, 'age',{
  //   get(){
  //     return 20
  //   }
  // })
  // Reflect操作,直接返回Boolean,不会打断运行
  let x1 = Reflect.defineProperty(data, 'age',{
    get(){
      return 19
    }
  })
  console.log(x1)
  let x2 = Reflect.defineProperty(data, 'age',{
    get(){
      return 20
    }
  })
  console.log(x2)
  if(x1){
    console.log('设置成功')
  } else{
    console.log('设置失败')
  }
  console.log('@@@')
</script>

3.所以模拟Proxy响应:

// 模拟Vue3响应式
const p = new Proxy(data, {
  // 接收参数 target:传入对象, propName: 读取到的具体属性名
  // 有人读取了某个属性
  get(target, propName){
    console.log(`有人读取了p身上的${propName}属性`,target, propName)
    // return target[propName]
    return Reflect.get(target, propName)
  },
  // 有人修改了p的某个属性、或新增某个属性
  set(target, propName, value){
    console.log(`有人修改或新增了p身上的${propName}属性`)
    // target[propName] = value
    return Reflect.set(target, propName, value)
  },
  // 有人删除某个属性
  deleteProperty(target, propName){
    console.log(`有人删除了p身上的${propName}属性`)
    // return delete target[propName]
    return Reflect.deleteProperty(target, propName)
  }
})

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Linux】各目录说明

【常见目录说明】 目录 /bin 存放二进制可执行文件(ls,cat,mkdir等)&#xff0c;常用命令一般都在这里。 /etc 存放系统管理和配置文件 /home 存放所有用户文件的根目录&#xff0c;是用户主目录的基点&#xff0c;比如用户user的主目录就是/home/user&#xff0c;可以…

浅谈智慧路灯安全智能供电方案设计

摘要: 智慧路灯&#xff0c;作为智慧城市、新基建、城市更新的主要组成部分&#xff0c;近些年在各大城市已得到很好的落地和 应用&#xff0c;但其与传统路灯相比集成大量异元异构电子设备&#xff0c;这些设备的供电电压、接口形式、权属单位各不相同&#xff0c; 如何设计一…

houdini rnn

1.3.RNN模型_哔哩哔哩_bilibili 此公式来自于吴恩达P1.3视频 按公式推测rnn内部结构,如有错误&#xff0c;敬请指正

mysql-锁

文章目录 概念隔离级别未提交读&#xff08;READ UNCOMMITTED&#xff09;提交读&#xff08;READ COMMITTED&#xff09;可重复读&#xff08;REPEATABLE READ&#xff09;可串行化&#xff08;SERIALIZABLE&#xff09; 锁分类按性能乐观锁&#xff08;用版本对比来实现&…

python入门,数据容器的通用操作(len,max,min,sorted)

1.len统计容器内元素个数 2.max统计元素最大元素 3.min统计元素最小元素 4.容器的转化功能 list&#xff08;容器&#xff09;将给定容器转化为列表 字符串转列表将字符串内的每一个元素都取了出来作为列表的每一个元素 字典则只会取出它的key&#xff0c;value会消失 str&…

在线SM2密钥生成工具

在线SM2密钥生成工具 - BTool在线工具软件&#xff0c;为开发者提供方便。本工具为你提供便捷的SM2密钥生成功能。SM2是中国国家密码管理局颁布的中国商用公钥密码标准算法(一种非对称加密算法)&#xff0c;SM2采用的是ECC 256位的一种椭圆曲线的加密算法,其密钥长度256bit&…

go中如何进行单元测试案例

一. 基础介绍 1. 创建测试文件 测试文件通常与要测试的代码文件位于同一个包中。测试文件的名称应该以 _test.go 结尾。例如&#xff0c;如果你要测试的文件是 math.go&#xff0c;那么测试文件可以命名为 math_test.go。 2. 编写测试函数 测试函数必须导入 testing 包。每…

HIve项目入门 环境部署遇到的问题及解决方案

环境布置的步骤建议是jdk, hadoop hive这几个分别去下载&#xff0c;参考以下几个安装教程&#xff1a; 【主要参考&#xff1a;傻瓜式教程】Windows下安装Hive MySQL版【附安装Hadoop教程】全网最详细的图文教程 【有一些补充的内容】&#xff1a;Windows下安装Hive 遇到的几个…

2024.1.16每日一题

LeetCode 2719.统计整数数目 2719. 统计整数数目 - 力扣&#xff08;LeetCode&#xff09; 题目描述 给你两个数字字符串 num1 和 num2 &#xff0c;以及两个整数 max_sum 和 min_sum 。如果一个整数 x 满足以下条件&#xff0c;我们称它是一个好整数&#xff1a; num1 &l…

QT 原生布局和QML的区别

一、QML 与 Qt Quick的区别 1.1 从概念上区分 为了更精确地对两者进行说明&#xff0c;先看助手对 QML 的描述&#xff1a; QML is a user interface specification and programming language. QML 是一种用户界面规范和标记语言&#xff0c;允许开发人员和设计师创建高性能、流…

招生官怒批ChatGPT文书质量“缺少灵魂”

ChatGPT无疑是最近两年留学届的热门话题&#xff0c;也成为了不少留学生再也离不开的万能工具&#xff0c;从总结文献、润色论文、给教授写email似乎无所不能。甚至还有不少同学在考虑直接提交ChatGPT生成的文书。 那么ChatGPT生成的文书质量高吗&#xff1f;各大高校对于学生…

【NI国产替代】PXI-6254,32 AI(16位,1 MS/s),48 DIO,PXI多功能I/O模块

32 AI&#xff08;16位&#xff0c;1 MS/s&#xff09;&#xff0c;48 DIO&#xff0c;PXI多功能I/O模块 PXI-6254提供模拟输入、关联数字I/O、两个32位计数器/定时器以及模拟和数字触发。该设备为从实验室自动化、研究、设计验证/测试到制造测试等各种应用提供了低成本的可靠D…

基于ssm的疫苗预约系统论文

摘 要 传统办法管理信息首先需要花费的时间比较多&#xff0c;其次数据出错率比较高&#xff0c;而且对错误的数据进行更改也比较困难&#xff0c;最后&#xff0c;检索数据费事费力。因此&#xff0c;在计算机上安装疫苗预约系统软件来发挥其高效地信息处理的作用&#xff0c…

Vue-API

$parent 和 $children $parent 父传子--在子组件中使用&#xff0c;放在计算属性、生命周期中&#xff1a; $children 子传父--方法中使用&#xff1a; $nextTick: $ref: 操作dom $set、$delete:

Docker-01-安装基础命令

Docker-01-安装&基础命令 文章目录 Docker-01-安装&基础命令一、Docker是什么&#xff1f;二、安装Docker①&#xff1a;卸载旧版②&#xff1a;配置Docker的yum库③&#xff1a;安装Docker④&#xff1a;启动和校验⑤&#xff1a;配置镜像加速01&#xff1a;注册阿里云…

第二证券:旅游股大涨 “预热”春节黄金周

在淄博烧烤热、哈尔滨冰雪热火爆出圈后&#xff0c;希望能接住文旅下一波“泼天富贵”的各地文旅局各出奇招并“卷”出新高度&#xff0c;被各地网友谈论“杀疯了”。 其间&#xff0c;A股游览概念股迎来一波集体上涨&#xff0c;成为不少出资者的重视热点&#xff0c;而行将到…

人机协同中存在一个独特的时空体系

一、在人机协同中存在一个独特的时空体系 在人机这个独特的时空体系中&#xff0c;人和机器之间的时间和空间的交织和共同作用。 在时间维度上&#xff0c;人机协同体系中的人和机器具有不同的时间节奏和速度。人类有限的生命周期和有时候需要休息的需求使得他们的工作时间和生…

Java 使用 EasyExcel 爬取数据

一、爬取数据的基本思路 分析要爬取数据的来源 1. 查找数据来源&#xff1a;浏览器按 F12 或右键单击“检查”打开开发者工具查看数据获取时的请求地址 2. 查看接口信息&#xff1a;复制请求地址直接到浏览器地址栏输入看能不能取到数据 3. 推荐安装插件&#xff1a;FeHelper&a…

Dockerfile: CMD与ENTRYPOINT区别

CMD和ENTRYPOINT的作用 CMD和ENTRYPOINT这两个命令&#xff0c;我接触到的是用在了Dockerfile中用于构建容器。 CMD&#xff1a;The main purpose of a CMD is to provide defaults for an executing container. CMD的主要用途是为正在执行的容器提供默认值。也就是指定这个容…

力扣hot100 多数元素 摩尔投票

Problem: 169. 多数元素 文章目录 思路解题方法复杂度&#x1f496; Code&#x1f468;‍&#x1f3eb; 参考代码 思路 &#x1f468;‍&#x1f3eb; 参考题解 &#x1f468;‍&#x1f3eb; 参考图解 解题方法 描述你的解题方法 复杂度 时间复杂度: 添加时间复杂度, 示例…