首页 > 其他分享 >手撕Vue-监听数据变化

手撕Vue-监听数据变化

时间:2023-10-15 19:12:23浏览次数:38  
标签:Vue obj observer value newValue 数据 监听

经过上一篇的介绍,已经实现了将模板编译成具体数据,接下来要介绍的是如何监听数据的变化,本章主要完成这个需求即可。

在我们文章的开始,我写了一个 Vue 双向数据绑定原理的文章当中封装了一个 Observer 类,这个类的作用就是监听数据的变化,当数据发生变化的时候,会通知订阅者,订阅者会去更新视图。

所以我先将这个类拿过来,稍微修改一下,没有这个类的源码可以去我之前的文章中查看,或者我这里也贴一下:

class Observer {
    constructor(data) {
        this.observer(data);
    }

    observer(obj) {
        if (obj && typeof obj === 'object') {
            for (let key in obj) {
                this.defineReactive(obj, key, obj[key]);
            }
        }
    }

    defineReactive(obj, attr, value) {
        this.observer(value);
        Object.defineProperty(obj, attr, {
            get() {
                return value;
            },
            set: (newValue) => {
                if (value !== newValue) {
                    this.observer(newValue);
                    value = newValue;
                    console.log('监听到数据的变化, 需要去更新UI');
                }
            }
        })
    }
}

在 Nue 中,我们需要将这个类稍微修改一下,在根据指定的区域和数据去编译渲染界面这一步中,我们需要将数据传入到 Observer 类中,这样就可以监听数据的变化了。

image-20231015183202818

// 第一步:给外界传入的所有数据都添加get/set方法
//         这样就可以监听数据的变化了
new Observer(this.$data);

接下来是测试环节,我们在浏览器中打开页面,修改数据,看看是否会触发监听数据变化的方法:

image-20231015183339873

标签:Vue,obj,observer,value,newValue,数据,监听
From: https://www.cnblogs.com/BNTang/p/17765985.html

相关文章

  • Vue的学习
    为什么需要前端框架当前前端开发的状态前端基础语言html:构建页面内容结构css:美化和布局页面内容Javascript:提供交互能力和动态三者整合就是我们看到的网页页面---所有的页面和页面功能都能完成现在能做什么浏览器展示的网页+小程序网站,网页游戏等等当前的状态有什么问题基......
  • 手撕Vue-编译模板数据
    经上一篇编译指令数据后,我们已经可以将指令数据编译成具体需要展示的数据了,上一篇只是编译了指令数据,还没有编译模板数据,这一篇我们就来编译模板数据。也就是{{}}这种模板的形式我们该如何编译,其实和指令数据编译的思路是一样的,废话不多说,直接上代码。改造一下buildText方法......
  • mybatisplus3.5.3版本,数据权限如何使用
    1、添加依赖<?xmlversion="1.0"encoding="UTF-8"?><projectxmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.......
  • 《人人都是数据分析师》高清高质量PDF电子书+源码
    下载:https://pan.quark.cn/s/3f61395b8d51......
  • 总结整合案例前端页面展示+axios异步请求数据
    页面显示: vue+axios+element<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metaname="viewport"content="width=device-width,initial-scale=1.0"><title&g......
  • 手撕Vue-编译指令数据
    经过上一篇的分析,完成了查找指令和模板的功能,接下来就是编译指令的数据了。所以本章节主要处理的方法则是buildElement方法,我们先分析一下我们所拿到的数据在进行编码,这样会更加清晰一些。我将name,value打印出来,分别对应的值是name:v-model,value:name,在今后我们的命......
  • 使用不同边界的三阶样条拟合样本数据
    importnumpyasnpimportmatplotlib.pyplotaspltfromscipy.interpolateimportCubicSpline#样本数据点(4.0,4.2),(4.3,5.7),(4.6,6,6),(5.3,4.8),(5.9,4,6)x=np.array([4.0,4.3,4.6,5.3,5.9])y=np.array([4.2,5.7,6.6,4.8,4.6])#确保第一个和最后一个数据......
  • 如何预防网络数据丢失203.135.128.x
    数据丢失对于任何规模的企业来说都可能是灾难性的事件,并且代价高昂,这就是预防数据丢失至关重要的原因。企业可以使用各种程序来增强其网络安全性并防止数据丢失。此外,他们可以使用多种策略来管理数据泄露。数据备份和加密。在各种策略中,定期数据备份是企业应该实施的关键策略之一。......
  • C语言数据类型占用字节大小+rand_mode/randomize_mode/static constraint+I2C和SPI的
    C语言数据类型占用字节大小https://blog.csdn.net/sinan1995/article/details/79577106对于整形,最大8字节,超出8字节的计算,要么用库,要么不用。64位编译器:char/unsignedchar:1字节char*:8字节shortint:2字节int/unsignedint:4字节longint:8字节float:4字节double:8字节lon......
  • SQL Server数据库多种方式查找重复记录
    示例:表stuinfo,有三个字段recno(自增),stuid,stuname 建该表的Sql语句如下: CREATETABLE[StuInfo]([recno][int]IDENTITY(1,1)NOTNULL,[stuid][varchar](10)COLLATEChinese_PRC_CI_ASNOTNULL,[stuname][varchar](10)COLLATEChinese_PRC_CI_ASNOTNULL)ON[PRIMAR......