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

news2024/12/28 5:12:04
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.coloradmin.cn/o/1388863.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【数学建模】图论模型

文章目录 图的基础理论及networkx简介图的基本概念图的表示及Networkx简介图的表示NetworkX简介 最短路算法及其Python实现固定起点到其余各点的最短路算法每对顶点间的最短路算法最短路应用 最小生成树算法及其networkx实现基本概念最小生成树算法最小生成树应用 匹配问题最大…

【JavaEE进阶】 利用Spring简单实现加法计算器和用户登录

文章目录 &#x1f38d;序言&#x1f333;加法计算器&#x1f6a9;准备工作&#x1f6a9;约定前后端交互接⼝&#x1f332;后端服务器代码的书写 &#x1f334;用户登录&#x1f6a9;效果展示&#x1f6a9;准备工作&#x1f6a9;约定前后端交互接⼝&#x1f388;需求分析&#…

【leetcode刷题】模拟专题

模拟 一、替换所有的问号1、题目链接2、解析3、代码 二、提莫攻击1、题目链接2、解析3、代码 三、Z字形变换1、题目链接2、解析3、代码 四、外观数列1、题目链接2、解析3、代码 五、数青蛙1、题目链接2、解析3、代码 一、替换所有的问号 1、题目链接 leetcode链接 2、解析 3、…

【排序算法】一、排序概念和直接插入排序(C/C++)

「前言」文章内容是排序算法之直接插入排序的讲解。&#xff08;所有文章已经分类好&#xff0c;放心食用&#xff09; 「归属专栏」排序算法 「主页链接」个人主页 「笔者」枫叶先生(fy) 目录 一、排序概念的介绍二、直接插入排序2.1 原理2.2 代码实现&#xff08;C/C&#xf…

鸿蒙开发-UI-布局-层叠布局

鸿蒙开发-UI-布局 鸿蒙开发-UI-布局-线性布局 文章目录 前言 一、基本概念 二、对齐方式 三、Z序控制 四、使用场景 总结 前言 上文详细学习了线性布局&#xff0c;学习了线性容器内子元素在主轴以及交叉轴上的排列方式&#xff0c;子元素自适应相关的知识点&#xff0c;本文继…

墙地砖外形检测的技术方案-图像形态学

基础理论 得到的灰度图像需进行二值化处理和区域填充&#xff0c;涉及两个步骤&#xff0c;第一&#xff0c;对图像进行分割&#xff0c;将图像分割成目标和背景&#xff1b; 第二&#xff0c;对分割后图像进行区域填充。本例中的背景为黑色&#xff0c;可以通过基本的全局阈…

智能管理护航制造企业安全生产:信息化升级解决方案解析-亿发

安全生产信息化是通过充分利用信息技术&#xff0c;及时采集安全生产管理中的各种要素和数据&#xff0c;并进行统计分析&#xff0c;随后将分析结果及时反馈&#xff0c;以实现对安全生产管理的指导和帮助&#xff0c;旨在提高安全生产管理的效能。 在提升安全生产管理水平方…

重磅!ESI高被引论文阈值发布

1月11日&#xff0c;科睿唯安&#xff08;Clarivate Analytics&#xff09;公布了最新的ESI数据。 注&#xff1a;ESI的更新时间为每奇数月的第二个星期四。 Essential Science Indicators (ESI) 是一种分析工具&#xff0c;可帮助识别 Web of Science 核心合集中表现最好的研…

浙江科聪完成A轮近亿元融资:持续领跑移动机器人控制系统市场

近日&#xff0c;中国移动机器人控制系统行业领军企业浙江科聪完成A轮近亿元融资&#xff0c;本轮融资由元璟资本投资。硬核资本加持硬核科技&#xff0c;本轮资金将主要用于加大研发投入&#xff0c;加速产品迭代和提升服务质量&#xff0c;加强公司全球营销网络的建设。 移动…

抖音弹幕直播玩法汉字找不同文字找不同无人值执守自动玩游戏自带语音播报的开发日志

#找不同# 要解决如下几个问题&#xff1a; 1.声音sprite的录制和调用&#xff0c;解决方案以及解决库如下&#xff1a; howler.min.js://一款不错的音频播放js库。 2.鼠标自动飘浮,使用的库 anime.min.js 3.资源预加载 preload.min.js 4.其它使用到的库 jquery,vue

自动化测试:fixture学得好,Pytest测试框架用到老

在pytest中&#xff0c;fixture是一种非常有用的特性&#xff0c;它允许我们在测试函数中注入数据或状态&#xff0c;以便进行测试。而参数化则是fixture的一个特性&#xff0c;它允许我们将不同的数据传递给fixture&#xff0c;从而进行多次测试。 本文将介绍如何在pytest中使…

【前端框架】Vue3合集

一、Vue3初识 1、create-vue create-vue是Vue官方新的脚手架工具&#xff0c;底层切换到了 vite &#xff08;下一代前端工具链&#xff09;&#xff0c;为开发提供极速响应 前置条件&#xff1a;16.0或更高版本的Node.js 安装并执行 create-vue npm init vuelatest2、项目…

MongoDB Compass当前版本及历史版本下载安装

mongoDB compass 当前版本下载 官网 https://www.mongodb.com/try/download/compass 官网下载一般只能下载最新版本。 github https://github.com/mongodb-js/compass MongoDB Compass与MongoDB的版本对应关系 MongoDB CompassMongoDB1.9.12MongoDB 2.6.11 Community

HNU-计算机网络-实验5(自选)-安全相关编程实验

计算机网络 课程综合实验安全相关编程实验&#xff08;RUST&#xff09; 计科210X 甘晴void 202108010XXX 【前言】 这个《课程综合实验》是21级开始新加的实验&#xff0c;之前都没有。具体的可以看实验指导书&#xff0c;是用的19级同学的毕设。我完成的这个实验需要一点点R…

VUE生命周期和生命周期四个阶段

Vue生命周期&#xff1a;一个Vue实例从 创建 到 销毁 的整个过程。 生命周期四个阶段&#xff1a;① 创建 ② 挂载 ③ 更新 ④ 销毁 vue的生命周期如图所示&#xff1a; Vue 生命周期函数&#xff08;钩子函数&#xff09;&#xff1a;Vue生命周期过程中&#xff0c;会自…

【机器学习 西瓜书】期末复习笔记整理

一些杂点&#xff1a; 测试集如何归一化&#xff1f; —— 不是用测试集的均值和标准差&#xff0c;而是用训练集的&#xff01; 机器学习&#xff1a; 对计算机一部分数据进行学习&#xff0c;然后对另外一些数据进行预测与判断。 参考计算例题&#xff1a; 机器学习【期末复习…

Few-shot Learning:知识点

目标&#xff1a; 让机器自己学会学习&#xff0c;学会理解和判断事物的异同&#xff08;如&#xff0c;区分两张图片内是相同的东西还是不同的东西&#xff0c;不是识别出是什么东西&#xff09; Pretraining 前景知识 C o s i n e S i m i l a r i t y Cosine \ Similarity…

组合模式介绍

目录 一、组合模式介绍 1.1组合模式定义 1.2 组合模式原理 1.2.1 组合模式类图 1.2.2 模式角色说明 1.2.3 示例代码 二、组合模式的应用 2.1 需求说明 2.2 需求实现 2.2.1 类图 2.2.2 具体实现 2.2.2.1 Entry抽象类 2.2.2.2 叶子节点 2.2.2.3 树枝节点 2.2.2.4 测…

C语言:自定义类型——联合和枚举

一、联合体 1.1 联合体类型的声明 像结构体⼀样&#xff0c;联合体也是由⼀个或者多个成员构成&#xff0c;这些成员可以是不同的类型。 声明方式如下图&#xff1a; 那联合体和结构体究竟有什么区别呢&#xff1f;&#xff1f; 下面将重点讲解联合体的特点&#xff01;&am…

Axure组件库免费下载,国内外资源都在这儿!

Axure 组件库具有高效再利用的价值。在设计中合理使用 Axure 组件库可以快速启动工作&#xff0c;避免重复简单的劳动&#xff0c;减轻设计师的负担&#xff0c;从而大大提高团队的生产力。在本文中&#xff0c;我们将分享如何下载 Axure 组件库&#xff0c;并附上 Axure 组件库…