vue源码中如何实现数据监听?

在Vue.js框架中,数据监听是一个核心功能,它允许开发者创建响应式的应用程序。这一功能的实现主要依赖于Vue的响应式系统,其中最关键的部分是如何监控数据变化并响应这些变化。以下是一个对Vue中数据监听实现方式的简要概述,适用于理解Vue 2.x版本的源码结构。

核心概念

  1. 响应式对象: Vue使用Object.defineProperty来把这些属性转换为getter/setter,从而能够监听数据的变化。这个过程在Vue实例初始化时,通过data选项中的数据进行处理。

  2. 依赖收集: 在getter中进行依赖收集。当组件或者指令访问某个数据时,会触发getter,此时,当前活动的观察者(Watcher)会被添加到这个数据属性的依赖列表中。这样,当数据变化时,可以通知所有依赖于此数据的观察者。

  3. 派发更新: 在setter中处理数据变化。当数据被修改时,setter会被触发,它将通知所有依赖于这个数据的观察者,告知它们所依赖的数据已经改变。

实现细节

初始化响应式系统
function initData(vm) {let data = vm.$options.data;data = vm._data = typeof data === 'function' ? data.call(vm, vm) : data || {};const keys = Object.keys(data);keys.forEach(key => {proxy(vm, `_data`, key);});observe(data);
}function proxy(vm, sourceKey, key) {Object.defineProperty(vm, key, {get: function proxyGetter() {return vm[sourceKey][key];},set: function proxySetter(val) {vm[sourceKey][key] = val;}});
}
创建观察者对象和依赖类
class Dep {constructor() {this.subs = [];}addSub(sub) {this.subs.push(sub);}notify() {this.subs.forEach(sub => sub.update());}
}class Watcher {constructor(vm, expOrFn, cb) {this.vm = vm;this.cb = cb;this.getter = parsePath(expOrFn);this.value = this.get();}get() {Dep.target = this;let value = this.getter.call(this.vm, this.vm);Dep.target = null;return value;}update() {const oldValue = this.value;this.value = this.get();this.cb.call(this.vm, this.value, oldValue);}
}
数据劫持与依赖收集
function observe(value) {if (typeof value !== 'object') return;let ob;if (typeof value.__ob__ !== 'undefined') {ob = value.__ob__;} else {ob = new Observer(value);}return ob;
}class Observer {constructor(value) {this.value = value;this.dep = new Dep();def(value, '__ob__', this);if (Array.isArray(value)) {// 处理数组// 略} else {this.walk(value);}}walk(obj) {const keys = Object.keys(obj);keys.forEach(key => {defineReactive(obj, key, obj[key]);});}
}function defineReactive(obj, key, val) {const dep = new Dep();let childOb = observe(val);Object.defineProperty(obj, key, {get() {if (Dep.target) {dep.addSub(Dep.target);if (childOb) {childOb.dep.addSub(Dep.target);}}return val;},set(newVal) {if (newVal === val) return;val = newVal;childOb = observe(newVal);dep.notify();}});
}

结论

Vue的响应式系统是通过利用JavaScript的Object.defineProperty方法来劫持各个属性的getter和setter,实现数据的观察与派发更新。这种机制使得Vue能够非常高效地更新DOM,确保用户界面与数据状态保持一致。这个系统的设计也展示了现代前端框架中数据驱动视图的核心思想。

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

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

相关文章

封装 H.264 视频为 FLV 格式然后推流

封装 H.264 视频为 FLV 格式并通过 RTMP 推流 flyfish 协议 RTMP (Real-Time Messaging Protocol) RTSP (Real Time Streaming Protocol) SRT (Secure Reliable Transport) WebRTC RTMP(Real Time Messaging Protocol)是一种用于实时音视频流传输的协…

qt安装历史版本5.15.2

0 背景 因为需要,所以需要安装qt5的最后一个版本qt5.15.2,但是下载qt安装器后,发现没有想要的版本。后面才发现,可以筛选历史版本进行安装。 1 解决 1,打开qt安装程序,勾选Archive后,点击筛选…

Python实现自动化的服务器部署和配置管理库之pyinfra使用详解

概要 在现代软件开发中,自动化部署和配置管理变得越来越重要。Python pyinfra库是一个强大的工具,可以帮助开发者实现自动化的服务器部署和配置管理。本文将介绍pyinfra库的安装、特性、基本功能、高级功能、实际应用场景以及总结。 安装 首先,来看一下如何安装pyinfra库。…

服务器被CC攻击怎么办

遇到CC攻击时,可采取以下措施:限制IP访问频率、启用防DDoS服务、配置Web应用防火墙、增加服务器带宽、使用负载均衡分散请求压力。 处理服务器遭遇CC攻击的方法如下: 1. 确认攻击 你需要确认服务器是否真的遭受了CC攻击,这可以…

书生浦语训练营第三节笔记和作业-茴香豆 搭建你的Rag智能助理

书生 浦语 茴香豆项目是一个基于大型语言模型(LLM)的群聊知识助手,由上海人工智能实验室的书生浦语团队开发。这个项目利用了RAG(Retrieval-Augmented Generation)技术,通过检索与用户输入相关的信息&#…

P6技巧-关于汇总项目Summarize的使用

前言 不知你在使用P6项目时是否察觉到这么一个有趣的现象,但打开一个项目(展开详细任务)时,在项目页签下可以看到该项目能反馈此时项目的总体进展,完成时间等内容;而当项目关闭时,其前1s所展示…

Linux快速部署大语言模型LLaMa3,Web可视化j交互(Ollama+Open Web UI)

本文在个人博客同步发布,前往阅读 1 介绍 本文将介绍使用开源工具Ollama(60.6k⭐)部署LLaMa大模型,以及使用Open WebUI搭建前端Web交互界面的方法。 我们先来过一遍几个相关的概念,对这块比较熟悉的朋友可跳过。 1.1 大规模语言模型 大规…

Eclipse内存分析器 Java内存分析工具MAT(Memory Analyzer Tool)的介绍与使用

1.visualvm实时监测 2.Memory Analyzer Tool打开 3.工具的使用可以参考 Java内存分析工具MAT(Memory Analyzer Tool)的介绍与使用 ------------------------ 1.我远程发现是其中一个客户端A请求服务器页面响应,一直得不到响应,然后客户端A一直请求&am…

Ansible 自动化运维

一、介绍 1、定义: ansible是自动化运维工具,基于Python开发,具有批量系统配置、批量程序部署、批量运行命令等功能。 ansible是基于 paramiko(框架) 开发的,并且基于模块化工作,本身没有批量…

报表控件Stimulsoft在JavaScript报告工具中的事件:查看器事件(上)

Stimulsoft Ultimate (原Stimulsoft Reports.Ultimate)是用于创建报表和仪表板的通用工具集。该产品包括用于WinForms、ASP.NET、.NET Core、JavaScript、WPF、PHP、Java和其他环境的完整工具集。无需比较产品功能,Stimulsoft Ultimate包含了…

[华为OD]给定一个 N*M 矩阵,请先找出 M 个该矩阵中每列元素的最大值 100

题目: 给定一个 N*M 矩阵,请先找出 M 个该矩阵中每列元素的最大值,然后输出这 M 个值中的 最小值 补充说明: N 和 M 的取值范围均为:[0, 100] 示例 1 输入: [[1,2],[3,4]] 输出: 3 说…

力扣-有效的数独

请你判断一个 9 x 9 的数独是否有效。只需要 根据以下规则 ,验证已经填入的数字是否有效即可。 数字 1-9 在每一行只能出现一次。数字 1-9 在每一列只能出现一次。数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。(请参考示例图) 注…

(三十一)第 5 章 数组和广义表(稀疏矩阵的三元组行逻辑链接的顺序存储表示实现)

1. 背景说明 2. 示例代码 1)errorRecord.h // 记录错误宏定义头文件#ifndef ERROR_RECORD_H #define ERROR_RECORD_H#include <stdio.h> #include <string.h> #include <stdint.h>// 从文件路径中提取文件名 #define FILE_NAME(X) strrchr(X, \\) ? strrch…

AI 工具合集

以下工具来源于互联网&#xff0c;可能会失效&#xff0c;请参考使用 网红工具 名称链接说明GPT-4https://chat.openai.com/ 需要梯子&#xff0c;需要付费。功能最强大的聊天机 器人。 文心一言https://yiyan.baidu.com/welcome 国内版 GPT&#xff0c;需要申请账号。回答问…

最好用的电脑监控软件,电脑监控软件怎么监控员工

电脑监控软件是一种专为跟踪和记录计算机使用情况而设计的应用程序&#xff0c;主要用于提升企业内部的信息安全、提高工作效率及监管员工行为。这些软件通常通过以下几种方式实现监控功能&#xff1a; 实时屏幕监控&#xff1a; 软件能够实时显示被监控电脑的屏幕画面&#x…

数据分析:扩增子分析(qiime2平台全流程分析)

Amplicon sequencing analysis pipeline through qiime2 platform qiime2是扩增子数据分析的最佳平台之一&#xff0c;其提供了大量从原始data到统计分析的插件&#xff0c;尤其是它的可重复分析且可扩展插件的理念使得其成为扩增子分析首选的平台。 Platform qiime2是扩增子…

Airmail 5 for Mac:高效电子邮件管理软件

Airmail 5 for Mac作为一款功能强大的电子邮件客户端软件&#xff0c;为Mac用户带来了全新的邮件管理体验。其高效、直观的操作界面&#xff0c;使得用户可以轻松管理各类邮件&#xff0c;提升工作效率。 Airmail 5 for Mac v5.7.4中文激活版 首先&#xff0c;Airmail 5支持多个…

若依前后端部署系统--详细附图

一、后端部署 1、在ruoyi项目的Maven中的生命周期下双击package.bat打包Web工程&#xff0c;生成jar包文件。 提示打包成功 2、多模块版本会生成在ruoyi/ruoyi-admin模块下target文件夹,我们打开目录ruoyi-admin/taget&#xff0c;打开cmd&#xff0c;运行java -jar jar包名称…

Windows Server 评估版转换(升级)为完整版

临时方法 获取 Windows Server 的剩余宽限期 Slmgr /dliWindows Server免费试用期可以使用以下命令合法延长5次&#xff0c;共180天&#xff1a; slmgr /rearm这意味着所评估的 Windows Server 的最长可用时间为 3 年 ( 180 days * 6)。 试用期到期后&#xff0c;Windows S…

为什么有些3D模型导入总是渲染不出来?---模大狮模型网

在使用3D建模软件时&#xff0c;有时候会遇到一些导入模型后无法正确渲染的问题&#xff0c;这给用户带来了不便和困扰。本文将探讨一些可能导致3D模型无法渲染的原因&#xff0c;并提供解决方案&#xff0c;帮助您顺利渲染模型。 一、文件格式不兼容某些3D建模软件只支持特定的…