Vue响应式原理

(1)vue2.0的响应式

实现原理
  • 对象类型:通过Object.definedProperty()对属性的读取、修改进行拦截(数据劫持)

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

  • Object.defineProperty(data,"count",{get(){},set(){}
    })

存在问题:
  • 新增属性,删除属性都不会刷新界面

  • 直接通过下标修改数组,界面不会自动更新 (可以用$set来刷新页面)

   let person = {name:"李国栋",age:18}let p = {};Object.defineProperty(p,"name",{get(){console.log("有人读取数据时调用");return person.name},set(value){console.log("有人修改了数据,我要去更新页面");person.name = value}})

(2)vue3.0的响应式

 实现原理

通过Proxy(代理):拦截对象中任意属性的变化,包括:属性的读写,属性的添加,属性的删除等
通过Reflect(反射):对被代理对象的属性进行操作
MDN文档中描述的Proxy与Reflect:

Proxy:
https://developer.mozilla.org/zhCN/docs/Web/JavaScript/Reference/Global_Objects/Proxy

Reflect:
https://developer.mozilla.org/zhCN/docs/Web/JavaScript/Reference/Global_Objects/Reflect
 

   let person = {name:"李国栋",age:18}let p = new Proxy(person,{// 读取get(target,proname){// target表示原对象  proname表示对象名console.log("有人读取了person上的属性",target);return target[proname]},// 修改或者增加set(target,proname,value){console.log("有人修改了person上的属性,我要去更新了");target[proname] = value},// 删除deleteProperty(target,proname){console.log("有人删除了person上面的属性,我要去调用了");return delete target[proname]},});

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

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

相关文章

wandb使用教程_笔记

from kaggle_secrets import UserSecretsClient #kaggle 可忽略 import wandb#####user_secrets UserSecretsClient() #### kaggle secret_value_0 user_secrets.get_secret("wandb_key") ### kaggle,此次为wandb_api wandb.login(keysecret_value_0) #…

【非监督学习 | 聚类】聚类算法类别大全 距离度量单位大全

🤵‍♂️ 个人主页: AI_magician 📡主页地址: 作者简介:CSDN内容合伙人,全栈领域优质创作者。 👨‍💻景愿:旨在于能和更多的热爱计算机的伙伴一起成长!!&…

如何使用Python进行服务器管理和自动化操作?

要使用Python进行服务器管理和自动化操作,可以使用一些第三方库和工具。以下是一个简单的示例,使用paramiko库通过SSH连接到远程服务器并执行命令: 首先,确保已经安装了paramiko库,如果没有安装,可以使用以…

JPA 自关联 设置单向多对一

Spring boot 3 JPA中,遇到一个需求,建一个数据字典表: Dictionary,存放两级数据,第一级为字典项目,第二级为项目内容,查询时要把parent_id对应父项的名称也一起查出来,返回前端。 …

增加linux系统文件打开数量的配置

linux系统中,你可以增加打卡最大文件数的限制,你可以使用ulimit这个命令修改这个限制。 全局配置 首先,在linux系统中查看最大可以打开文件的数量 \ # cat /proc/sys/fs/file-max 818354 这个数值标识一个登录用户最大可以打开的文件数量&…

Project DESFT 白皮书中文版——应用于普惠金融的可信数字凭证解决方案

1. 概述 Project DESFT 是由 Solv 基金会与 zCloak Network 联合设计孵化,以跨境贸易和金融服务为场景的分布式可信数字凭证解决方案(Distributed Trusted Digital Credential Solution),项目获得新加坡金管局(Monetar…

C++学习之路(四)C++ 实现简单的待办事项列表命令行应用 - 示例代码拆分讲解

本期示例介绍: 本期示例《待办事项列表应用》展示了一个简单的任务管理系统,用户可以通过命令行界面执行添加任务、删除任务和显示任务列表等操作。 功能描述: 添加任务功能: 用户可以输入任务描述,将新的任务添加到任务列表中。…

声音响度、声压级计权(A B C)实现

声压 sound pressure 声压就是大气压受到声波扰动后产生的变化,即为大气压强的余压,它相当于在大气压强上的叠加一个声波扰动引起的压强变化。由于声压的测量比较容易实现,通过声压的测量也可以间接求得质点速度等其它物理量,所以…

Java中的jvm——面试题+答案(Java虚拟机的基本概念,包括内存区域、类加载机制、垃圾回收等)——第15期

什么是Java虚拟机(JVM)? 答案: Java虚拟机是Java程序运行的环境,负责将Java源代码编译成字节码,并在运行时执行这些字节码。 Java虚拟机的主要组成部分有哪些? 答案: 主要组成部分…

【开源】基于JAVA的天然气工程业务管理系统

项目编号: S 021 ,文末获取源码。 \color{red}{项目编号:S021,文末获取源码。} 项目编号:S021,文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块三、使用角色3.1 施工人员3.2 管理员 四…

java编程规范-异常处理\mysql(阿里手册)

( 一 ) 异常处理 1. 【强制】 Java 类库中定义的一类 RuntimeException 可以通过预先检查进行规避,而不应该 通过 catch 来处理,比如: IndexOutOfBoundsException , NullPointerException 等等。 说明: 无法通…

手把手教会你--渗透实战--Hack The Box-Starting Point-Meow--持续更新

有什么问题,请尽情问博主,QQ群796141573 前言 前言 请务必跟着博主复现一遍 参考: Hack The Box-Starting Point-Meow

pygame加载图像,并让小球做平抛运动

文章目录 load转换和存储自由落体 在游戏设计中,图像显示是必不可少的功能,pygame中的image模块便用于加载图像。 load 通过load函数,可以加载多种图像格式,如下表所示 旧版本bmp, gpeg, png, pcx, tiff, xpmc, lbm(以及pbm, p…

windows下docker环境搭建与运行实战

背景 学习docker使用,需要环境,今天主要的目标是在windows环境下安装docker环境。 为什么要这么搞,主要是企业内部服务器,都是跟公网隔离的,没有访问公网权限,所以镜像什么的,从公网拉取完全没…

Ubuntu命令记录

一、基本 查询历史命令记录 history插件支持的分辨率 xrandr设置分辨率以及刷新率 xrandr -s 1920x1080赋予可执行权限 chmod x a.sh关机 sudo shutdown -h 18:00 18点关机 sudo shutdown -r now 立即重启 sudo shutdown -h now 立即关机重启 reboot查看磁…

卷积神经网络(Inception-ResNet-v2)交通标志识别

文章目录 一、前言二、前期工作1. 设置GPU(如果使用的是CPU可以忽略这步)2. 导入数据3. 查看数据 二、构建一个tf.data.Dataset1.加载数据2. 配置数据集 三、构建Inception-ResNet-v2网络1.自己搭建2.官方模型 五、设置动态学习率六、训练模型七、模型评…

rust tokio select!宏详解

rust tokio select!宏详解 简介 本文介绍Tokio中select!的用法,重点是使用过程中可能遇到的问题,比如阻塞问题、优先级问题、cancel safe问题。在Tokio 中,select! 是一个宏,用于同时等待多个异步任务,并在其中任意一…

探索 Vue 中的 bus.$emit:实现组件通信的强大工具

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云…

linux logrotate介绍

我们知道linux系统日志文件位于/var/log目录下,在/var/log目录下,我们会发现有相当一部分日志文件末尾包含一串数字(E.g:ecure-20231114),这表明这部分日志文件经过了日志转储,以避免日志文件过大,导致可读性较差。 [root@rhel77 log]# pwd /var/log [root@rhel77 log]# …

运维高级--centos7源码安装Apache

安装必要的依赖项: sudo yum groupinstall "Development Tools" sudo yum install pcre pcre-devel zlib zlib-devel openssl openssl-devel这将安装编译和构建所需的基本工具,以及 Apache HTTP Server 所需的一些依赖项。 下载 Apache HTT…