vue2数据响应式原理(6) 处理数组特殊遍历

news2024/12/24 21:41:47

打开一直在写的案例
然后 找到src下的 dataResp.js
这里 我们Observer中 数数组和对象还是要分开处理 因为他们还是有所不同
我们修改 Observer 类代码如下

class Observer{
    constructor(value) {
        //相当于  给拿到的对象  其中的__ob__绑定 值为thsi,在类中用this 表示取实例本身给__ob__赋值  最后一个enumerable为false 表示属性不参与for遍历
        def(value,'__ob__',this,false);
        if(Array.isArray(value)){
            Object.setPrototypeOf(value, arrayMethods);
            this.observeArray(value);
        }else{
            this.walk(value);
        }
    }
    walk(value) {
        for(let key in value){
            defineReactive(value,key);
        }
    }
    observeArray(arr) {
        for(let i = 0;i < arr.length;i++) {
            observe(arr[i]);
        }
    }
}

这里 我们判断到数组时 会去调用observeArray 传递的参数value就是数组本身

然后 我们observeArray 拿到数组 也就是 将他变量 重新去调用observe 保证每一个下标都继续去递归处理响应式

然后 我们看到 Arrays.js 数组的方法中有几个比较特殊的存在
push unshift splice 他们都会在特殊位置插入一些数据

我们将 Arrays.js 代码更改如下

import { def } from './def.js';

const arrayPrototype = Array.prototype;

export const arrayMethods = Object.create(arrayPrototype);

const redefineArrayMethod = [
    'push',
    'pop',
    'shift',
    'unshift',
    'splice',
    'sort',
    'reverse'
]

redefineArrayMethod.forEach(item =>{
    const backupFunction = arrayPrototype[item];
    def(arrayMethods,item,function(){
        const result = backupFunction.apply(this, arguments);
        const ob = this.__ob__;
        const args = [...arguments];
        let inserted = [];
        switch (item) {
            case "push":
            case "unshift":
            inserted = args;
            break;
            case "splice":
                inserted = args.slice(2);
            break;
        }
        if(inserted){
            ob.observeArray(inserted);
        }
        console.log('数组执行了',item,'操作,值被修改为',this);

        return result;
    },false);
})

重点是 redefineArrayMethod.forEach 中 def第三参数中函数的变化

我们先拿到数字的__ob__字段 这里 我们说过 __ob__存的是Observer声明出来的类对象

然后 用args储存方法访问的参数 例如 push 我们这里 就是存push中的内容将push中的参数 转成一个数组 存给args

然后我们定义了一个 inserted 主要就是记录一下 有没有插入的下标

然后我们通过switch 确定方法的类型 如果是push unshift 那么参数肯定是都要用来添加到数组中的 直接等于 用inserted去存就好了
但splice第二个参数 才是要插入的值

如果是空的就算了

然后 我们将新插入的下标也扔给了__ob__类对象中的observeArray让新下标也带有响应式

那么 写完了 我们要如何测试有没有效果呢?

我们来到output.js 改写代码如下

import { observe } from "./dataResp"
const output = () => {
    var obj = {
        data: {
            data: {
                map: {
                    dom: {
                        isgin: true
                    }
                },
                arg: 13
            },
            name: "小猫猫"
        },
        bool: [1,2,3,4]
    };
    observe(obj);
    obj.bool.splice(2,1,[88,99]);
    document.getElementById("text").innerHTML = obj.data.name;
}

export default output

这里 我们通过splice 指定对 2下标出手 去除一条数据 插入新的数据 [88,99]

运行结果如下
在这里插入图片描述
可以看到 不但数据插入成功 且被监听了事件 我们新插入的数组 受我们新写的递归作用 也被加上了响应式 重下面的 ob 就能看出来

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

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

相关文章

数据结构入门(C语言版)一篇文章教会你手撕八大排序

八大排序 排序的概念常见的排序算法排序算法的实现一、直接插入排序二、希尔排序三、选择排序四、堆排序五、冒泡排序六、快速排序1.递归写法①三位取中函数②hoare版本③挖坑法④前后指针版本⑥快排主函数 2.非递归写法 七、归并排序1.递归写法2.非递归写法 八、非比较排序1.基…

倾斜摄影三维模型顶层合并技术及其实现方法

倾斜摄影三维模型顶层合并技术及其实现方法 倾斜摄影三维模型由于数据量大、结构复杂&#xff0c;常常需要进行顶层合并&#xff0c;以便更好地应用到城市规划、土地管理和文化遗产保护等领域。本文将介绍倾斜摄影三维模型顶层合并技术及其实现方法。 1、什么是顶层合并 倾斜…

【安全与风险】普适计算中的安全与隐私研究

普适计算中的安全与隐私研究 日常生活的数字化无处不在的计算对移动社交媒体的影响讨论更便宜的存储和更强大的处理的影响移动和普适计算的影响有时候&#xff0c;惊奇另一个例子攻击模型贡献是什么&#xff1f;智能家居的案例研究本文的主要内容如何自学? 日常生活的数字化 …

第三章 使用 Maven:命令行环境

第一节 实验一&#xff1a;根据坐标创建 Maven 工程 Maven 核心概念&#xff1a;坐标 ①数学中的坐标 使用 x、y、z 三个**『向量』作为空间的坐标系&#xff0c;可以在『空间』中唯一的定位到一个『点』**。 ②Maven中的坐标 [1]向量说明 使用三个**『向量』在『Maven的仓…

不知道今天吃什么?今天吃什么 API 告诉你

引言 在现代社会&#xff0c;由于生活节奏加快和繁忙的工作日程&#xff0c;越来越多的人感到选择今天吃什么餐点是一项繁琐且令人困扰的任务。为了解决这个问题&#xff0c;许多人会求助于在线菜谱和美食博客等渠道&#xff0c;但是这些选项通常是繁琐和耗时的。 幸运的是&a…

聚观早报 | 马斯克称星舰1-2个月内准备再发射;推特撤下官媒标签

今日要闻&#xff1a;马斯克称星舰1-2个月内准备再发射&#xff1b;推特撤下「官媒」标签&#xff1b;Pixel Fold 折叠机型首次被泄露&#xff1b;蔚来员工曝半年加班500小时&#xff1b;苹果Mac Pro和Mac Studio无缘WWDC 马斯克称星舰1-2个月内准备再发射 美国当地时间 4 月 …

关于GNSS技术介绍(二)

在上期文章中&#xff0c;我们介绍了GNSS技术的发展历程、原理&#xff0c;并对不同类型的定位技术进行了介绍&#xff0c;在本期文章中我们将继续讨论GNSS的优点与应用及其测试方法和解决方案。 GNSS的优点与应用 目前GNSS技术已经成为日常生活不可或缺的一部分&#xff0c;几…

自定义RecyclerView.LayoutManager实现类实现卡片层叠布局的列表效果

一.前言 先看效果&#xff08;大佬们请忽略水印&#xff09;&#xff1a; 卡片层叠列表的实现效果已经发布成插件&#xff0c;集成地址&#xff1a;implementation ‘com.github.MrFishC:YcrCardLayoutHepler:v1.1’&#xff1b; 先讲解如何快速实现&#xff0c;然后再来讲解…

小程序开发费用估算:如何控制项目成本?

在当今数字化的时代&#xff0c;小程序已经成为了很多企业和个人开展业务的重要手段。小程序的开发需要耗费时间和资源&#xff0c;因此在项目初期&#xff0c;了解预计的开发费用是非常重要的。本文将详细介绍如何估算小程序开发费用以及如何控制项目成本。 小程序开发费用 …

2023年重庆经济发展研究报告

第一章 发展概况 1.1 地理和人口发展概况 重庆&#xff08;简称“渝”&#xff09;位于中国西南地区&#xff0c;是中国四个直辖市之一&#xff0c;地处长江中上游&#xff0c;横跨东经10517到11011&#xff0c;北纬2810到3213之间。重庆市地势复杂&#xff0c;地形多山&…

风光场景削减及源荷不确定性的虚拟电厂随机优化调度研究(Matlab代码实现)

&#x1f4a5; &#x1f4a5; &#x1f49e; &#x1f49e; 欢迎来到本博客 ❤️ ❤️ &#x1f4a5; &#x1f4a5; &#x1f3c6; 博主优势&#xff1a; &#x1f31e; &#x1f31e; &#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 …

Ubuntu16.04配置使用robosense雷达18版本的rsview软件记录

目录 依赖安装boost安装下载源码解压编译安装更新一下系统的动态链接库 libpng16-16安装 rsview运行下载运行具体操作可以看doc文件夹内的说明文件 参考文章 依赖安装 boost安装 下载源码 boost1.65官方下载地址 解压 进入下载文件所在的文件夹 tar -zxvf boost_1_65_1.t…

托福高频真词List05 // 附托福TPO阅读真题

目录 4月23日单词 生词 熟词 4月24日真题 4月23日单词 生词 sparsethinly distributedadj 稀疏的sparselythinlyadv 稀疏地congestion / kənˈdʒestʃən / overcrowdingn 拥挤continuallyregularlyadv 持续的eradicateeliminatev 消除facilitatemake easiereasev 使..…

M2下通过docker安装sqlserver

背景&#xff1a;要做这一个需求&#xff0c;将txt文件格式化以后&#xff0c;入库到sqlserver中&#xff0c;没有测试环境&#xff0c;只能自己在本地搭建一个sqlserver的服务器 前提&#xff1a;安装好docker 第一步&#xff1a;在终端下查找sqlserver的镜像文件 我们可以选…

S7-1200通过模拟量的方式实现PID控制恒压供水的具体方法示例

S7-1200通过模拟量的方式实现PID控制恒压供水的具体方法示例 具体方法和步骤可参考以下内容: 创建工艺对象,如下图所示,有2种方式: PID_Compact指令需要在OB30中断组织块中调用,如下图所示, 使用 PID 控制器前,需要对其进行组态设置,分为基本设置、过程值设置、高级设…

Stm32开发环境从0搭建(Clion作为开发软件)

环境安装 1. 下载CLion开发软件和安装 https://www.jetbrains.com/zh-cn/clion/2. 安装msys2开发环境 一直下一步 参考文档 安装OpenOCD工具(烧录下载工具) 将压缩包解压到环境安装目录下: 安装Arm-Gcc编译环境 将此目录拷贝到安装目录&#xff0c;并解压 配置环境变量 …

实测有效!手把手带你将 Docker Image 体积减少 90%

Docker Image 体积越大,那部署要花的时间就越长;假如每个版本都有好几 GB,那并不是一个理想的状态;因此笔者开始动手实作,想看看到底能将 Docker Image 的体积缩小多少! 大纲 ㄧ、先初始化一个简易的 Node.js 专案 二、撰写 Dockefile,了解优化前体积有多大 三、使用 No…

嵌入式开发--无刷电机学习1--FOC简介

写在前面 最近刚学FOC电机控制&#xff0c;文中错误在所难免&#xff0c;欢迎批评指正&#xff0c;也欢迎在评论区留言讨论。 FOC意义 普通直流电机&#xff08;DC MOTOR&#xff09;的驱动是碳刷换向&#xff0c;能看到这篇文章的朋友应该不用我再去复述一遍直流电机的工作…

【论文阅读】You Are What You Do:通过数据来源分析寻找隐蔽的恶意软件

You Are What You Do: Hunting Stealthy Malware via Data Provenance Analysis NDSS-2020 伊利诺伊大学香槟分校、德克萨斯大学达拉斯分校 Wang Q, Hassan W U, Li D, et al. You Are What You Do: Hunting Stealthy Malware via Data Provenance Analysis[C]//NDSS. 2020. 目…

Java每日一练(20230424)

目录 1. 二叉树的中序遍历 &#x1f31f;&#x1f31f; 2. 两两交换链表中的节点 &#x1f31f;&#x1f31f; 3. 不同的子序列 &#x1f31f;&#x1f31f;&#x1f31f; &#x1f31f; 每日一练刷题专栏 &#x1f31f; Golang每日一练 专栏 Python每日一练 专栏 C/…