Vue监测数组改变的原理

devtools/2024/10/22 16:41:46/

Vue监测数组改变的原理是通过重写数组的方法(如push、pop、shift等)来实现的。具体的实现步骤如下:

  1. 准备一个原始的数组,用于存储数据。

  2. 使用Object.defineProperty方法,给数组对象添加一个名为__ob__的属性,该属性值为一个Observer实例。

  3. 在Observer实例中,重写数组的方法,将其改为先执行原始的数组方法,再触发数组的更新。

代码示例:

javascript">// 定义Observer类
class Observer {constructor(value) {this.value = value;// 判断value是否为数组if (Array.isArray(value)) {// 重写数组的方法this.overrideArrayMethods(value);// 递归遍历数组,对数组中的每个元素进行observethis.observeArray(value);}}// 重写数组的方法overrideArrayMethods(arr) {const methodsToPatch = ['push', 'pop', 'shift', 'unshift', 'splice', 'sort', 'reverse'];methodsToPatch.forEach((method) => {const original = Array.prototype[method];Object.defineProperty(arr, method, {value: function(...args) {const result = original.apply(this, args);// 触发数组的更新this.__ob__.dep.notify();return result;},configurable: true,writable: true,enumerable: false});});}// 遍历数组,对每个元素进行observeobserveArray(arr) {for (let i = 0, l = arr.length; i < l; i++) {observe(arr[i]);}}
}// observe函数:用于对数据进行观测
function observe(value) {if (typeof value !== 'object' || value === null) {return;}return new Observer(value);
}// 示例代码
const obj = {arr: []
};observe(obj.arr);obj.arr.push(1); // 数组更新

它通过重写数组的方法,并在重写的方法中触发数组的更新。在示例代码中,当向obj.arr数组中添加元素时,会触发数组的更新。


http://www.ppmy.cn/devtools/30656.html

相关文章

[C++][数据结构]二叉搜索树:介绍和实现

二叉搜索树 概念 二叉搜索树又称二叉排序树&#xff0c;它是一棵空树&#xff0c;或者是具有以下性质的二叉树: 若它的左子树不为空&#xff0c;则左子树上所有节点的值都小于根节点的值若它的右子树不为空&#xff0c;则右子树上所有节点的值都大于根节点的值它的左右子树也…

笔记-用Python脚本启停JAR程序

用Python脚本启停JAR程序&#xff0c;需要用到python中的以下内置模块 subprocess 是 Python 的一个标准库模块&#xff0c;用于在新进程中执行子命令&#xff0c;获取子进程的输入/输出/错误以及返回码等os 是 Python 的一个标准库模块&#xff0c;它提供了与操作系统交互的功…

设计模式: 模板模式

目录 一&#xff0c;模板模式 二&#xff0c;特点 三&#xff0c;组成部分 四&#xff0c;实现步骤 五&#xff0c;案例 一&#xff0c;模板模式 模板模式&#xff08;Template Pattern&#xff09;是一种行为型设计模式&#xff0c;它在超类中定义了一个算法的骨架&#…

C++基础—模版

C模板是C语言中实现泛型编程的核心机制&#xff0c;它允许程序员定义通用的代码框架&#xff0c;这些框架在编译时可以根据提供的具体类型参数生成相应的特定类型实例。 泛型编程的特点代码复用和安全性! 模板主要分为两大类&#xff1a;函数模板和类模板。 函数模板 基本语…

SpringBoot-@Transactional注解失效

Transactional注解失效 Transactional失效场景 以下是一些常见导致Transactional注解失效的场景&#xff0c;配合相应的Java代码演示&#xff1a; 1、方法修饰符非公开&#xff08;非public&#xff09; Transactional注解失效的原因在于Spring事务管理器如何实现对事务的代…

springboot2.6.7集成springfox3.0.0

springboot2.6.7集成springfox3.0.0 1. pom配置2. 增加swagger自动配置类3. 配置修改4. 自动配置类增加以下内容参考 1. pom配置 <!-- https://mvnrepository.com/artifact/io.springfox/springfox-swagger-ui --> <dependency><groupId>io.springfox</g…

机器学习入门之非监督学习和半监督学习

文章目录 非监督学习半监督学习机器学习的核心价值 非监督学习 与监督学习相反&#xff0c;非监督学习的训练数据集是完全没有标签的数据&#xff0c;他本质上所做的工作都是聚类的 给定数据之后&#xff0c;聚类能从中学习到什么&#xff0c;就完全取决于数据本身的特性的&a…

上海计算机学会2022年4月月赛C++丙组T3平衡括号(简)

题目描述 给定一个只包含 ( 与 ) 的括号序列&#xff0c;请删除尽量少的括号&#xff0c;使它变成平衡的。平衡的定义如下&#xff1a; 空序列是平衡的&#xff1b;如果某个括号序列 s 是平衡的&#xff0c;那么 (s) 也是平衡的&#xff1b;如果某两个括号序列 s 与 t 都是平…