Vue学习之数据监听Observer类实现

八小时实现迷你版vuejs三:实现数据响应化 上一篇我们比较overview的讲了vuejs 的架构,从这一篇开始我们来自己动手实现一个vuejs。首先我们实现数据响应化,数据响应化的意思就是我们要能监听到任何数据变动。比如执行了 this.name = “Yao Ming” 之后,我们要能监听到这个改动。那么怎么实现呢?我们需要借助 ES5 提供的新特性 getter/setter。构造函数 和 初始化首先我们需要写一个 Vue 的构造函数, 阅读详情

Vue学习之数据监听Observer类实现

创建脚本文件

文件名:Observer.js

在index.html中引入脚本文件<script src="Observer.js"></script>

创建Observer类,并在构造函数中传入Vue实例的data数据。

class Observer {
    constructor(data) {
        this.observer(data);
    }
    // 实现数据变化监听
    observer(data) {

    }
}

在MyVue.js中构造Vue实例时初始化Observer类

class MyVue {
    // 构造函数
    constructor(options) {
        this.$el = options.el;
        this.$data = options.data;
        this.$options = options;
        if (this.$el) {
        //-----------------------------------------
            // 实现数据监听类
            new Observer(this.$data);
        //-----------------------------------------
            // 实现指令解析类
            new Compile(this.$el, this);
        }
    }
}

接下来实现对vue中data的数据劫持

    // 实现数据变化监听
    observer(data) {
        console.log(data);
        // 判断数据是否为对象并处理
        if (data && typeof data === 'object') {
            // console.log(Object.keys(data));
            // 利用Object.keys方法取出data的key值
            Object.keys(data).forEach(key => {
                // 定义响应方法 即劫持数据的getter和setter方法
                this.defineReactive(data, key, data[key]);
            })
        }
    }

利用Object.defineProperty方法重新定义data中各个数据的get和set方法。

    /**
     * 
     * @param {object} data vue实例中的data数据
     * @param {string} key 遍历到的key值
     * @param {string} value key值对应的value
     */
    defineReactive(data, key, value) {
        const self = this;
        // 递归遍历 直到value不再为object
        self.observer(value);
        // 劫持并监听所有属性 利用Object.defineProperty重新定义get和set方法
        Object.defineProperty(data, key, {
            enumerable: true,
            configurable: false,
            get() {
                return value;
            },
            set(newVal) {
                // 注意在修改对象值时,要对新值添加监听
                self.observer(newVal)
                if (value !== newVal) {
                    console.log("监听到数据变化:" + key + " 由 " + value + " 变成 " + newVal);
                    value = newVal;
                }
            }
        })
    }

至此,完成了对数据的劫持监听,在console修改data中的数据时,可以看到监听输出。

vm.$data.htmlStr="33333"               Observer.js:7 
33333                                  Observer.js:39 
监听到数据变化:htmlStr 由 <h4>还喜欢和大家一起学习。</h4> 变成 33333

接下来将实现Vue中的wathcer,从而实现视图驱动数据变化。

demo地址:Demo

JaCoCo报告聚合的5个常见坑点排查指南:从单模块到多模块的完整避坑手册 本文详细解析了JaCoCo在多模块Maven项目中生成聚合报告时的5个常见问题,包括多模块报告聚合失效、覆盖率数据不一致、增量构建导致的覆盖率丢失等,并提供了具体的配置示例和解决方案。帮助开发者高效排查和解决JaCoCo报告聚合中的各种疑难杂症,提升代码覆盖率分析的准确性和效率。 阅读详情

相关推荐

Dify 从入门到熟悉100 天的学习大纲

理解 Dify 的核心概念,熟悉操作界面,并能创建简单的 AI 应用。祝你在这 100 天的旅程中学有所成,成为一名优秀的 AI 应用开发者!掌握生产环境部署、监控、调优,并关注 Dify 生态和前沿动态。探索多模态、Agent、API 集成、性能优化等高级主题。掌握工作流编排、高级提示词技巧、知识库优化等核心功能。

IT深耕十余载,大道之简 1735

解决vue的{__ob__: observer}取值问题

转载原地址:https://blog.youkuaiyun.com/zhouzuoluo/article/details/103067637?utm_medium=distribute.pc_relevant.none-task-blog-baidujs_title-6&spm=1001.2101.3001.4242 问题:   vue编码中经常出现获取到的数据是:{ob: Observer} 格式的 解决方法:   将返回的数据data先转换为JSON字符串形式,然后再从字符串形式转换成JSON格式J

darabiuz的博客 2442

STM32F407ZGT6最小系统:从原理图到PCB的实战设计与避坑指南

本文详细介绍了STM32F407ZGT6最小系统的设计与实现,从原理图到PCB布局的完整流程。重点解析了电源、时钟、复位和调试接口等核心模块的设计要点,提供了实用的PCB布局技巧和常见问题解决方案,帮助开发者避开设计陷阱,快速完成稳定可靠的STM32F407ZGT6最小系统设计。

weixin_30955617的博客 197

{__ob__: Observer}怎么拿值?

vue编码中经常出现获取到的数据是:{__ob__: Observer} 格式的,详细如下 解决方法如下: 将返回的数据data先转换为JSON字符串形式,然后再从字符串形式转换成JSON格式JSON.parse(JSON.stringify(data)) ...

有问题可关注公众号:前端研究院 后台输入问题回复 3474

2025华东杯A/B/C题解题思路+可运行代码参考

这些因素包括但不限于:助滑坡的坡度、运动员的质量、滑雪板的接触面与雪地的摩擦力、空气阻力系数、运动员的体型和衣物形态等。助滑坡是运动员滑行至起跳台前的最后一段坡道,这一段坡道的坡度、长度和运动员的姿势会直接影响到起跳时的初始速度。运动员的滑行速度不仅受助滑坡的坡度影响,还受到摩擦力、空气阻力和重力等多方面因素的影响。通过合理的姿势调整,运动员能够有效减少空气阻力,增加身体的重力加速度,进而提升滑行速度。助滑坡的角度通常介于10°到12°之间,而运动员的滑行速度将受到重力、摩擦力和空气阻力的共同作用。

qq_52590045的博客 1796

磁带库Scalar i6000界面基本操作步骤

(注:磁带库的前面的门不要打开,日常维护:主要就是简单看下磁带库的状态;绿色代表正常;黄色代表报警但不影响磁带库正常使用;红色代表报警,不能正常使用,及时和厂家联系报修。) 一、磁带库管理页面 1、首先,磁带库前面(具体作用如图) 2、查看状态和管理页面 3、管理页面登陆。用户名:service 密码:xxxxxx 4、磁带机背面 二、电脑连接磁带库进入管理页面 1.用网线把电脑和磁带库的维护接口(磁带库背面)进行连接 2.电脑环境:JAVA。把电脑的IP设置成自...

杀神lwz的博客 5352

javaScript Object.defineProperty 详解,及vue2中Observer解析

Object.defineProperty 直接在一个对象上定义一个新属性,或者修改一个对象的现有属性,并返回此对象; 备注:应当直接在 Object 构造器对象上调用此方法,而不是在任意一个 Object 类型的实例上调用。 /** * obj { Object } 必传,目标对象(要定义属性的对象) * prop { String | Symbol } 必传, 需定义或修改的属性的名字 * descriptor { Object } 必传, 要定义或修改的属性描述符 * configura

m0_37824255的博客 1829

语音数据标注工具与平台

最近在做语音深度学习的项目,整理了一下语音数据标注工具和语音标注平台,供大家参考 语音标注工具–Praat Praat是目前已经成为比较流行也比较专业的语音处理的软件,可以进行语音数据标注、语音录制、语音合成、语音分析等等,具有免费、占用空间小、通用性强、可移植性好等特点 官网链接 http://www.fon.hum.uva.nl/praat/ 汉化版下载 http://www.hejingzo...

qq_21379593的博客 1万+

vue中[__ob__: Observer]的数组无法遍历

今天开发遇到这样一个问题,记录一下踩坑记录   我请求回来的是一个数组,我要通过遍历这个数组将符合要求的数据重新push到一个新的空数组中,然后再遍历这个新数组进行操作,但是过程中发现新数组使用forEach遍历时没有进入循环,打印新数组后如下所示:   其实不是数组无法遍历,是我在请求方法外面直接调用了遍历新数组的方法,由于请求是异步的,还没接收到后台返回的数据,也就还没有添加到数组里,遍历时自然没有内容。   数组为空,但是点开又有数据是因为开始空数组没赋值,赋值之后,因为是地址引用,那个数组已经被修

濮家大少 8426

GibbsCAM软件二次开发:GibbsCAM软件API接口详解

API(Application Programming Interface,应用程序编程接口)是一种允许不同软件之间进行通信的接口。在GibbsCAM软件中,API提供了与外部程序交互的能力,使得开发者可以利用GibbsCAM的强大功能进行二次开发,定制化满足特定的制造需求。GibbsCAM的API主要基于.NET框架,使用C#或VB.NET等语言进行编程。在GibbsCAM软件中,通过API接口创建自定义几何形状是实现复杂零件设计和加工策略定制的关键步骤。

kkchenjj的博客 1497

论文必备 - YOLOv11热力图可视化,支持指定模型,指定显示层,设置置信度,以及10种可视化实现方式

本文带来的是YOLOv11热力图可视化功能,支持,以及。我们经常看到一些论文里绘制了不同的热力图,一方面能够直观的感受其模型的有效性,另一方面也丰富了论文内容。特别是在使用了注意力模块的网络中,热力图就可以验证注意力机制是否真正聚焦到了预期的重要特征上,以便对模型的有效性和合理性进行评估。例如这篇文章中展示的,就很能够表达作者改进后的模型相比之前模型的优越性。

Limiiiing的博客 5504

Vue 中的数据拦截(Observer),构建依赖(Dep),添加订阅(Watcher),实现响应式

Vue响应式原理

weixin_53315593的博客 1145

在 SAP HANA 与 HANA Cloud 中,用 SQL DDL 创建数据库视图:从设计时工件到运行时对象的全链路实践

本文介绍了在SAP HANA中通过HDI容器使用DDL定义视图的方法。主要内容包括:1)采用.hdbview设计时工件存储视图定义,构建时自动转换为运行时视图,实现版本控制和权限隔离;2)开发前需准备HDI容器、MTA项目及配置.hdiconfig文件;3)详细说明.hdbview语法结构,重点讲解WITH READ ONLY和WITH STRUCTURED PRIVILEGE CHECK的使用场景;4)提供了从创建文件到构建验证的完整流程示例;5)强调跨容器访问时需通过.hdbgrants为#OO用户授予

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 273

Vue-数据监听-对象监听

之前说到了Object.defineProperty() 用来监听 data 的数据改变,从而实现响应式,但是在回顾definePropety方法博客中,出现了一个问题,那就是我在 改变数据,调用 set() 函数的时候,出现了堆栈溢出的问题,这是因为出现了递归的情况。在这里我们就来看看Vue是怎么解决这个问题的。 首先,我们来实现一个简单的数据监听效果,以此来深入理解一下,Vue的数据监听是怎么做到的。 1、新建一个html文件,不需要引入Vue ,然后定义一个对象 <script&...

qq_40792800的博客 3489

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

vue如何实现对新增数据进行监听

在对vue实例data中的数据进行操作时,因为vue是mvvm设计模式,vm层实现数据双向绑定,原理是Object,definePrototype(),而这个函数的触发是通过数据劫持( Observer)监听者实现的 不难发现vue中数据不过是原始数据类型还是引入数据类型,vue对其都有设置监听,这个observer的是不是监听不到了呢?肯定监听不到,就像下面的下标为4的数据在数据发生变化是vue是监听不到的,所以这个数据不会实现的数据的双向绑定,但是vue有对这个整一个数组进行监听,所以当其他数据发生变

zhoulib__的博客 3317

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

Vue3为何使用Proxy实现数据监听

Vue3为何使用Proxy实现数据监听

Gary Leong 3902

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

vue原理之observer

上节课我们讲了vue五种类型中的vue 实现data响应 这节课我们讲第二中类型observer Observer 功能 负责把 data 选项中的属性转换成响应式数据 data 中的某个属性也是对象,把该属性转换成响应式数据 数据变化发送通知 具体代码实现如下 class Observer { constructor(data) { this.walk(data) } // 1. 判断数据是否是对象,如果不是对象返回

weixin_43097944的博客 4256

[vue2源码]深度理解Vue中Observer,Dep,Watcher以及解决监听Array数组变化

双向绑定 首先通过一次渲染操作触发Data的getter进行依赖收集 在data发生变化的时候会触发它的setter setter通知Watcher Watcher进行回调通知组件重新渲染的函数 diff算法来决定是否发生视图的更新 Observe 每个数据都有一个标记,防止重复绑定 Observer为数据加上响应式属性进行双向绑定,如果是对象,则进行深度遍历,为每一个子对象都绑定上方法,如果是数组,对每个成员进行遍历绑定方法 源码解析: export class Observer { valu

一再问究竟的博客 2179

vue2.6源码学习:数据变化监听原理之数据驱动视图(observer)

上次我们看vue2.6源码的时候,大概看了一下整体的项目结构目录。主要是里面的Observer和vdom这两个文件夹。也是vue里面最核心的两个文件夹,今天我们继续来学习。

风烟 1165

手撸vue2 - 2.初始化data实现数据监听

实现vue2中数据监听

qq_18831775的博客 1284

Vue 源码学习过程 - Observer/Dep/Watcher三者实现数据双向绑定

Vue版本: vue@2.5.10,简单记录自己的学习过程 目录 实现双向绑定的方式区别 Vue实现数据劫持的方式 了解defineProperty Observer/Dep/Watcher三者实现 1. Observer 2. Dep 3.Watcher 实现双向绑定的方式区别 脏值检测(angularjs) 这种模式下,使用之只有触发指定的事件进入脏值检测,才会进行双向...

u011374329的博客 1773

Vue 源码 模拟Vue2 实现数据劫持Observer 以及数据修改更新视图

定义一个Observer类,将数据传进去监听 一个个取出来, 给data里面的每个之进行监听 创建一个Wathcer类,用来创建监听者 每个watcher都有一个update方法,方便调用取修改数据。 创建一个Dep类 收集所有依赖者,创建Observer与Watcher的联系。 一开始Complie更新视图的时候,我们就必须相对应的创建一个watcher,接着,通过watcher里面调用data的值,去调用了get函数,这时候我们在get函数里面,通过Dep.target去获取这个watc

lin_fightin的博客 447

Vue中的Observer类

通过调用链可以发现在 initData 开始,由 Observer 开始对 data 的每个 key 值进行 set、get 的拦截监听 (利用 Object.defineProperty),同时可以发现在 defineReactive 中对每个 key 值的拦截监听都会创建一个独立的 Dep 对象,在 get 的时候调用 dep.depend() 进行依赖收集,在 set 的时候调用 dep.notify() 进行派发更新(通知观察者更新视图),我们的数据就是被观察者。

2401_87820633的博客 439

vue数据绑定的实现原理

由于文档内容过多,为了避免影响到大家的阅读体验,在此只以截图展示部分内容,详细完整版的JavaScript面试题文档,或更多前端资料可以点此处获取。[外链图片转存中…(img-9qjLHvIv-1712978428034)][外链图片转存中…(img-kvRvptLq-1712978428034)]由于文档内容过多,为了避免影响到大家的阅读体验,在此只以截图展示部分内容,详细完整版的JavaScript面试题文档,或更多前端资料可以点此处获取。

2401_84152719的博客 838

js简单实现Vue的数据代理数据监听

里面主要是递归的判断每个子对象的类型,根据不同的类型(主要是对象、数组、普通类型),然后又给每个层级的数据设置他们的数据代理,主要依靠的就是Object.defineProperty这个api。但是数组对象是以下标的形式存取值的,那么想监测数组里某个下标的值的改变,就只能使用设计模式代理的思想,设计一个数组的代理对象,这个代理对象重写能改变原数组元素的方法,例如Array类中的这几个方法。接下来看一下底层的对象有没有对应的get和set,可以从下面的图片看出来下面几级的属性都有对应的get和set方法的。

没有简介就是简介 694

Vue学习之数据视图驱动Watcher类实现

Vue学习之数据监听Observer类实现 之前已经监听了数据变化,现在要实现的时在数据初始化时增加对数据的观察,并且在数据变化时,通过数据变化来修改视图。 新建脚本文件 文件名Watcher.js 在index.html中引入<script src="Watcher.js"></script> class Watcher { /** * * @param {*} vm Vue实例 * @param {*} exp data数据key值

Dyanfee的博客 494
上一篇: 简单实现Vue之指令解析器Compile类
下一篇: Vue学习之数据视图驱动Watcher类实现
Dyanfee
博客等级 码龄9年 64粉丝 18原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值