vue动态数据绑定1--如何监听一个对象的变化

【模拟电子设计实战】开源!基于Multisim与AD620的心电采集电路仿真与优化 本文详细介绍了基于Multisim与AD620的心电采集电路仿真与优化实战。通过分析心电信号采集的挑战,重点讲解了AD620仪表放大器和OP07运算放大器的选型优势及电路设计技巧,包括对抗50Hz工频干扰和基线漂移的优化方法。文章还分享了Multisim仿真参数设置与实测对比经验,最终实现性能达标的心电采集电路设计。 阅读详情

之前经常使用 Vue,后来不满足于仅仅使用它,我想了解其内部实现原理,所以就尝试学习其源码,获益匪浅。
- 动态数据绑定就是 Vue 最为基础,最为有用的一个功能。给定任意一个对象,如何监听其属性的读取与变化?也就是说,如何知道程序访问了对象的哪个属性,又改变了哪个属性? 举个例子。

let app1 = new Observer({
  name: 'yyy',
  age: 20
});

let app2 = new Observer({
  university: 'uestc',
  major: 'computer'
});

// 要实现的结果如下:
app1.data.name // 你访问了 name
app.data.age = 100;  // 你设置了 age,新的值为100
app2.data.university // 你访问了 university
app2.data.major = 'science'  // 你设置了 major,新的值为 science

实现这样的一个 Observer,要求如下:

  1. 传入参数只考虑对象,不考虑数组。
  2. new Observer返回一个对象,其 data属性要能够访问到传递进去的对象。
  3. 通过 data 访问属性和设置属性的时候,均能打印出对应的信息。
  4. 如果传入参数对象是一个“比较深”的对象(也就是其属性值也可能是对象),那该怎么办。

要实现上述目标,首先要定义一个对象的构造函数,然后定义原型方法,遍历对象本身的各个属性,并为每个属性绑定get和set方法。考虑到第4个问题,在程序中加入了递归的思想。
实现代码如下:

// 首先定义观察者构造函数
function Observer(data){
    this.data=data;
    this.walk(data);
}

// walk()函数用于深层次遍历对象的各个属性
// 采用的是递归的思路
// 因为我们要为对象的每一个属性绑定get和set
Observer.prototype.walk = function(obj){
    let val;
    for(let key in obj){
        // 这里为什么要用hasOwnProperty进行过滤呢?
        // 因为for...in 循环返回的是对象原型链上的所有能够通过对象访问的、可枚举的属性
        // hasOwnProperty只在属性存在于实例中时才返回true
        // 而我们想要的正是这个对象本身拥有的属性,所以要这么做。
        if(obj.hasOwnProperty(key)){
            val = obj[key];
            // 这里进行判断,当访问的属性是一个对象时,继续new Observer,直到到达最底层的属性位置
            if(typeof val ==='object'){
                new Observer(val);
            }
            this.convert(key,val);
        }
    }
};
// 以自定义get和set函数
Observer.prototype.convert = function(key,val){
    Object.defineProperty(this.data,key,{
        enumerable:true,
        configurable:true,
        get:function(){
            console.log('你访问了'+key);
            return val;
        },
        set:function(newVal){
            console.log('你设置了'+key);
            console.log('新的'+key+'='+newVal);
            if(newVal===val) return;
            // 如果设置新的值是一个对象的话,继续new Observer,直到到达最底层的属性位置
            if(typeof newVal === "object"){
                new Observer(newVal);
            };
            val = newVal;
        }
    })
};
let data={
    user:{
        name: "yjm",
        age: "21"
    },
    address: "成都"
};
let app =new Observer(data);
  • 当访问的属性是一个对象的时候,对这个对象属性进行new Observer,直到到达最底层的属性位置,使‘深层次’的属性也能被访问到。
  • 同时为对象设置setter的时候,如果设置新的值是一个对象的话,也继续new Observer,直到到达最底层的属性位置,使新设置的值对象的子属性也能继续响应 getter 和 setter。
    效果如下:

这里写图片描述
这里写图片描述
这里写图片描述
如上图所示:无论是访问一个简单值或者是一个深层次的对象,都可以很好响应getter 和 setter。

拥有AI助手便能解放双手?——抖音直播脚本的生成 科技改变生活,AI助手帮你完成抖音创作! 阅读详情

相关推荐

机器学习笔记之玻尔兹曼机(一)基本介绍

在受限玻尔兹曼机——模型表示(Representation)一节中以玻尔兹曼机为引,介绍了受限玻尔兹曼机。从本节开始,将正式介绍玻尔兹曼机。相比于它的表示和推断过程,我们更关注它在求解过程中出现的问题。

静静的学习就好 7924

Vue2 、vue3 监听对象的变化

vue2实现数据响应式,是通过object.defineProperty()对数据劫持侦测数据变化,发布订阅模式进行依赖收集与视图更新。object.defineProperty()方法会直接在一个对象上定义一个新属性,或者修改一个对象的现有属性,并返回此对象。vue3 是使用proxy 类。之后的操作都是直接对Proxy的操作,而不是原有的对象。

m0_50789696的博客 5473

基于yolo11的BGA图像目标检测

15.YOLOv8的n/s版本(如YOLOv8n-1280),或通过TensorRT量化压缩模型。3.使用自适应batch_size(如根据GPU显存动态调整),推荐16-32。为采集分辨率整数倍(如原图2592×1944,训练时缩放为640×480),保持宽高比。14.采用余弦退火学习率(cos_lr)和早停(patience=50),防止过拟合。1.模型标注后,少量标注全部人工校验,大量数据抽检,部分人工检验。13.部署模型后持续收集困难样本(如模棱两可的预测结果),定期迭代更新模型。

qq_47798402的博客 1205

vue2 监听数组变化的方法(5种)

在 Vue 2 中,监听数组的变化可以通过 `watch` 选项来实现。Vue 2 使用了基于 `Object.defineProperty` 的响应式系统,因此可以直接监听数组的变化(例如 `push`、`pop`、`shift`、`unshift` 等方法触发的变更),但需要注意一些细节。

大剑师兰特的GIS世界 3262

量化交易中的烂板策略:短线高频交易实战解析

量化交易通过算法模型实现自动化投资决策,其中短线高频交易是典型应用场景。从市场微观结构看,涨停板现象反映了资金博弈的动态平衡,而烂板策略正是捕捉涨停板短暂打开时的交易机会。该策略结合L2行情数据和Python量化框架,通过参数化规则识别特定形态的烂板股票,在风险可控前提下追求超额收益。实战中需严格遵循动态仓位管理和止损纪律,适用于A股市场短线交易。高频交易与量化分析技术的结合,为投资者提供了新的alpha挖掘工具。

weixin_30432579的博客 364

从波形图到参数调优:一次无感BLDC电机启动失败的深度解析

本文深入解析无感BLDC电机启动失败案例,通过波形分析揭示参数不匹配和IPM保护机制触发等关键问题。详细探讨了过零点检测、PWM周期设置及强拖参数调优的底层逻辑,并分享IPM模块保护机制与实战调优技巧,最终实现99.98%的启动成功率。

weixin_29182481的博客 820

vue事件监听

我们可以使用v-on指令 (简写为) 来监听 DOM 事件,并在事件触发时执行对应的。

a1241436267的博客 1400

迅投miniQMT量化交易实战指南:从入门到自动化交易系统构建

迅投miniQMT量化交易实战指南摘要 本文全面介绍迅投miniQMT量化交易系统的开发流程,重点包括: 环境配置:详细说明miniQMT极简模式的安装步骤,包括xtquant库获取、Python版本要求及验证方法 行情数据模块:解析xtdata模块的核心功能,包括: 获取板块分类与股票列表 查询合约基础信息 下载历史K线数据(支持tick、分钟、日线等周期) 交易执行模块:介绍xttrader模块的交易API,涵盖: 账户连接与初始化 订单管理(下单、撤单、查询) 持仓与资产查询 实战开发:提供可直接运行

huanghm88的专栏 667

【Vue3】watch监听使用【超详细】

沉默小管 【Vue3】watch监听使用【超详细】

我的开源项目:https://gitee.com/derekgo/vue-cms_xg 8518

第154章 点云大规模并行处理(GPU加速)

优化点云处理✨ 使用。

yumeiguo的博客 374

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Vue 数据监听工作原理及三大重要模块分析

在 Vue 中,数据监听是通过其响应式系统实现的。;// 模拟数据变化setTimeout=>;2000;

世轩的博客 1622

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

vue-数组或对象更新了,但视图不更新的解决方案

大多时候我们习惯直接给对象的属性赋值,如: data() { // data数据 return { arr: [1,2,3], obj:{ a: 1, b: 2 } }; }, // 数据更新 ...

denniszy1988的博客 1443

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

vue+Echarts动态数据已经赋值,但是无法渲染页面的问题

vue+Echarts动态数据已经赋值,但是无法渲染页面的问题 最近用vue+Echarts想做一个饼状统计图,但是数据明明已经绑定完毕,但是页面渲染一直没有效果,最终才发现问题所在,自己还是个新手,主要对vue还不是很熟悉。废话不说,接下来看我的代码: 正常的给个div的大小 <div> <div id="echartss" :style="{width: '100%...

weixin_43481793的博客 6万+

vue动态数据绑定2---响应数据变化

动态数据绑定1的基础上,考虑传递回调函数。在实际应用中,当特定数据发生改变的时候,我们是希望做一些特定的事情的,而不是每一次都只能打印出一些信息。所以,我们需要支持传入回调函数的功能。举个例子。let app = new Observer({ name: 'yjm', age: 20 }); // 你需要实现 $watch 这个 API app1.$watch

林雨静 1693

vue 动态数据绑定

动态数据绑定(一) 我的github iSAM2016 实现的步骤: 1.监听对象属性的读取与变化 Object.defineProperty() 方法会直接在对象上定义一个新的的属性,或者已经存在的属性 并且返回这个属性 语法是 Object.defineProperty(obj, prop, descript) obj: 目标对象 prop: 需要定义或修改的属性的名字 desc...

djj1220的博客 298

Vue绑定动态数据

Vue绑定动态数据指的是将数据与页面元素进行关联,当数据发生改变时,页面元素会自动更新以反映最新的数据状态。Vue提供了多种方式来实现数据绑定,包括插值表达式、绑定属性、计算属性等。

BIBOR的博客 632

vue.js动态数据绑定学习

vue.js的动态数据绑定

coderhangg 2879

IFE Vue动态数据绑定

终于完成了Vue动态数据绑定这个任务,发现自己连渣都称不上,沫沫而已。。 提交地址:https://github.com/touming123/IFE-Baidu/tree/master/vue1.给定任意一个对象,如何监听其属性的读取与变化ES中有两种属性:数据属性和访问器属性 数据属性:configurable,enumerable,writabel,value 访问器属性:(包含一对ge

橙煦媛的博客 579

vue+echarts 实现点击切换数据(监听值的变化重新渲染)

vue(elementUi)+echarts 实现点击切换数据

xiaoQ 1万+

html绑定动态数据,基于 JSX 的动态数据绑定

基于 JSX 的动态数据绑定笔者在 2016-我的前端之路: 工具化与工程化一文中提及,前端社区用了 15 年的时间来分割 HTML、JavaScript 与 CSS,但是随着 JSX 的出现仿佛事物一夕回到解放前。在 Angular、Vue.js 等 MVVM 前端框架中都是采用了指令的方式来描述业务逻辑,而 JSX 本质上还是 JavaScript,即用 JavaScript 来描述业务逻辑。...

weixin_42500367的博客 791

【Vue2】v-if 绑定的数组或对象属性变化不响应问题解决详解

具体内容与双向绑定、$set()方法相关。整体内容过长,如果想参考最终解决,直接跳到总结即可;如果想要看一下实际情况,可以耐心浏览。

NineWaited的博客 5740

Vuejs基础入门

Vuejs基础入门Vue概述早期前后端分离模式MVVM框架Vue简介Vue.js快速入门安装Vue环境Hello World程序 Vue概述 早期前后端分离模式 早期的前后端分离开发模式是这样的: <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title></title> <style>

『愚』的博客 8346

使用proxy实现一个双向绑定

如何实现 在学习vue的时候,vue是通过劫持数据的变化,监听到数据变化时改变前端视图。 那么要实现双向绑定,必然需要一个监听数据的方法。如文章标题所示,这里使用的proxy实现数据的监听。 当监听到数据变化时,需要一个watcher响应并调用更新数据的compile方法去更新前端视图。 在vue中v-model作为绑定的入口。当我们监听到前端input输入信息并绑定了数据项的...

小分享 2098

AntV X6进阶技巧:用Vue组件实现动态数据绑定的5种姿势

本文深入探讨AntV X6与Vue深度集成的5种动态数据绑定高阶实践,包括基础数据绑定、Vuex状态管理、自定义事件通信、Teleport高性能渲染及混合渲染优化。通过具体代码示例和性能对比,帮助开发者掌握在复杂场景下实现高效数据绑定的技巧,提升图形应用的交互体验和渲染性能。

aa123的博客 502
上一篇: ECMAScript中函数传递的参数是object的话,是按值传递还是按引用传递?
下一篇: css盒模型
林雨静
博客等级 码龄10年 11粉丝 23原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值