【愚公系列】《循序渐进Vue.js 3.x前端开发实践》033-响应式编程的原理及在Vue中的应用

news2025/1/30 15:12:23
标题详情
作者简介愚公搬代码
头衔华为云特约编辑,华为云云享专家,华为开发者专家,华为产品云测专家,CSDN博客专家,CSDN商业化专家,阿里云专家博主,阿里云签约作者,腾讯云优秀博主,腾讯云内容共创官,掘金优秀博主,亚马逊技领云博主,51CTO博客专家等。
近期荣誉2022年度博客之星TOP2,2023年度博客之星TOP2,2022年华为云十佳博主,2023年华为云十佳博主,2024年华为云十佳博主等。
博客内容.NET、Java、Python、Go、Node、前端、IOS、Android、鸿蒙、Linux、物联网、网络安全、大数据、人工智能、U3D游戏、小程序等相关领域知识。
欢迎👍点赞、✍评论、⭐收藏

文章目录

  • 🚀前言
  • 🚀一、响应式编程的原理及在Vue中的应用
    • 🔎1.HTML 结构分析
    • 🔎2.数据对象
    • 🔎3.定义触发器
    • 🔎4.定义代理的处理器
    • 🔎5.创建代理对象
    • 🔎6.计算和更新逻辑
    • 🔎7.首次触发计算并输出结果
    • 🔎8.修改数据并再次触发计算
    • 🔎9.总结


🚀前言

在当今的前端开发中,响应式编程已成为一种重要的编程范式,尤其是在构建动态用户界面时。它允许开发者以更加直观和高效的方式处理数据变化,从而自动更新视图,提升用户体验。Vue.js 作为一款流行的渐进式框架,深入地将响应式编程的理念融入到其核心设计中,使得构建交互丰富的应用变得更加简单和优雅。

本篇文章将全面探讨响应式编程的原理,帮助你理解其背后的机制和概念。我们将分析 Vue.js 是如何实现响应式数据绑定的,包括其使用的观察者模式和依赖收集机制。同时,我们还将深入讨论在 Vue 中如何有效利用响应式特性来提升开发效率与代码的可维护性。

🚀一、响应式编程的原理及在Vue中的应用

🔎1.HTML 结构分析

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>响应性变量</title>
    <script src="https://unpkg.com/vue@3/dist/vue.global.js"></script>
    <style> </style>
</head>
<body>
    <!-- <script>
        let a = 1;
        let b = 2;
        let sum = a + b;
        console.log(sum);
        a = 3;
        b = 4;
        console.log(sum);
    </script> -->
    <script>
        ...
    </script>
</body>
</html>
  • 该页面没有直接内容显示,只是通过 <script> 标签执行 JavaScript 代码,模拟响应性变量的效果。
  • Vue 库并未在该段代码中被使用,主要的实现逻辑是通过原生 JavaScript 的 Proxy 来模拟。

🔎2.数据对象

let a = {
    value: 1
};
let b = {
    value: 2
};
  • 创建了两个数据对象 ab,每个对象都有一个 value 属性,初始值分别为 12

🔎3.定义触发器

let trigger = null;
  • trigger 是一个函数,它用于在数据变化时更新计算的结果。开始时设置为 null,后续会指向一个具体的函数,来触发对数据变化后的更新操作。

🔎4.定义代理的处理器

handleA = {
    set(target, key, value) {
        target[key] = value;
        if (trigger) {
            trigger();
        }
    }
};
handleB = {
    set(target, key, value) {
        target[key] = value;
        if (trigger) {
            trigger();
        }
    }
};
  • handleAhandleB 都是处理对象 ab 的 代理处理器。set 方法是 Proxy 对象的捕捉器(trap),它会在你尝试设置对象的属性值时被触发。
  • 每次属性值被更改时,set 方法会被调用并更新对象的值,同时通过 trigger() 来触发某些操作。也就是当 a.valueb.value 被修改时,trigger 会执行更新操作。

🔎5.创建代理对象

let pa = new Proxy(a, handleA);
let pb = new Proxy(b, handleB);
  • 使用 new Proxy(target, handler) 创建了 papb,这两个是原始对象 ab 的代理对象。
  • 当访问或修改 papb 上的属性时,代理对象会使用相应的 handler 进行拦截,从而执行 set 方法。

🔎6.计算和更新逻辑

let sum = 0;
trigger = () => {
    sum = pa.value + pb.value;
};
  • 初始化一个 sum 变量。
  • trigger 函数指向一个函数,trigger 会更新 sum 的值,sumpa.value + pb.value 的和。
  • 通过 trigger() 来进行初次的计算,使 sum 等于 1 + 2 = 3(即 pa.valuepb.value 的初始和)。

🔎7.首次触发计算并输出结果

trigger();
console.log(sum);
  • 调用 trigger() 进行首次计算,sum 被更新为 3
  • 输出 sum,会打印 3

🔎8.修改数据并再次触发计算

pa.value = 3;
pb.value = 4;
console.log(sum);
  • 修改代理对象 papb 上的 value 属性,分别设置为 34
  • 由于在 set 方法中有 trigger(),每当 pa.valuepb.value 改变时,trigger() 被触发,导致 sum 被重新计算为 3 + 4 = 7
  • 最后,输出 sum,会打印 7

在这里插入图片描述

🔎9.总结

这段代码的核心是通过 JavaScript 的 Proxyhandler 来模拟响应式数据的变化,类似于 Vue.js 中的数据绑定。以下是逻辑概述:

  • 数据对象:ab 作为数据源。
  • 代理处理器:handleAhandleB 分别定义了对 ab 数据的处理方法,主要是通过 set 来拦截属性的修改。
  • 触发器:trigger 是一个函数,负责在数据变化时重新计算 sum 的值。
  • 代理包装:Proxy 对象 papb 会拦截对 ab 的属性修改,并触发 trigger 来更新 sum 的值。
  • 更新与输出:每当 pa.valuepb.value 修改时,sum 会被重新计算并输出。

通过这种方式,我们可以模拟类似 Vue 中的响应式变量,利用 Proxy 使得数据变化时,自动触发计算和更新。

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

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

相关文章

PETSc源码分析: Optimization Solvers

本文结合PETSc源代码&#xff0c;分析PETSc中的优化求解器。 注1&#xff1a;限于研究水平&#xff0c;分析难免不当&#xff0c;欢迎批评指正。 注2&#xff1a;文章内容会不定期更新。 参考文献 Balay S. PETSc/TAO Users Manual, Revision 3.22. Argonne National Labora…

面向对象设计(大三上)--往年试卷题+答案

目录 1. UML以及相关概念 1.1 动态图&静态图 1.2 交互图 1.3 序列图 1.4 类图以及关联关系 1.4.1类图 1.4.2 关系类型 (1) 用例图中的包含、扩展关系(include & extend) (2) 类图中的聚合、组合关系(aggragation & composition) 1.5 图对象以及职责划…

芯片AI深度实战:进阶篇之vim内verilog实时自定义检视

本文基于Editor Integration | ast-grep&#xff0c;以及coc.nvim&#xff0c;并基于以下verilog parser(my-language.so&#xff0c;文末下载链接), 可以在vim中实时显示自定义的verilog 匹配。效果图如下&#xff1a; 需要的配置如下&#xff1a; 系列文章&#xff1a; 芯片…

几种K8s运维管理平台对比说明

目录 深入体验**结论**对比分析表格**1. 功能对比****2. 用户界面****3. 多租户支持****4. DevOps支持** 细对比分析1. **Kuboard**2. **xkube**3. **KubeSphere**4. **Dashboard****对比总结** 深入体验 KuboardxkubeKubeSphereDashboard 结论 如果您需要一个功能全面且适合…

TikTok 推出了一款 IDE,用于快速构建 AI 应用

字节跳动(TikTok 的母公司)刚刚推出了一款名为 Trae 的新集成开发环境(IDE)。 Trae 基于 Visual Studio Code(VS Code)构建,继承了这个熟悉的平台,并加入了 AI 工具,帮助开发者更快、更轻松地构建应用——有时甚至无需编写任何代码。 如果你之前使用过 Cursor AI,T…

【MySQL — 数据库增删改查操作】深入解析MySQL的 Retrieve 检索操作

Retrieve 检索 示例 1. 构造数据 创建表结构 create table exam1(id bigint, name varchar(20) comment同学姓名, Chinesedecimal(3,1) comment 语文成绩, Math decimal(3,1) comment 数学成绩, English decimal(3,1) comment 英语成绩 ); 插入测试数据 insert into ex…

强大到工业层面的软件

电脑数据删不干净&#xff0c;简直是一种让人抓狂的折磨&#xff01;明明已经把文件扔进了回收站&#xff0c;清空了&#xff0c;可那些残留的数据就像牛皮癣一样&#xff0c;怎么也除不掉。这种烦恼简直无处不在&#xff0c;让人从头到脚都感到无比烦躁。 首先&#xff0c;心…

全面解析文件包含漏洞:原理、危害与防护

目录 前言 漏洞介绍 漏洞原理 产生条件 攻击方式 造成的影响 经典漏洞介绍 防御措施 结语 前言 在当今复杂的网络安全环境中&#xff0c;文件包含漏洞就像潜藏在暗处的危险陷阱&#xff0c;随时可能对防护薄弱的 Web 应用发起致命攻击。随着互联网的迅猛发展&#xff…

基于Django的Boss直聘IT岗位可视化分析系统的设计与实现

【Django】基于Django的Boss直聘IT岗位可视化分析系统的设计与实现&#xff08;完整系统源码开发笔记详细部署教程&#xff09;✅ 目录 一、项目简介二、项目界面展示三、项目视频展示 一、项目简介 该系统采用Python作为主要开发语言&#xff0c;利用Django这一高效、安全的W…

【Rust自学】14.6. 安装二进制crate

喜欢的话别忘了点赞、收藏加关注哦&#xff0c;对接下来的教程有兴趣的可以关注专栏。谢谢喵&#xff01;(&#xff65;ω&#xff65;) 14.6.1. 从cratea.io安装二进制crate 通过cargo_install命令可以从crates.io安装二进制crate。 这并不是为了替换系统包&#xff0c;它应…

【Redis】hash 类型的介绍和常用命令

1. 介绍 Redis 中存储的 key-value 本身就是哈希表的结构&#xff0c;存储的 value 也可以是一个哈希表的结构 这里每一个 key 对应的一个 哈希类型用 field-value 来表示 2. 常用命令 命令 介绍 时间复杂度 hset key field value 用于设置哈希表 key 中字段 field 的值为…

低代码产品表单渲染架构

在React和Vue没有流行起来的时候&#xff0c;低代码产品的表单渲染设计通常会使用操作Dom的方式实现。 下面是一个表单的例子&#xff1a; 产品层 用户通过打开表单&#xff0c;使用不同业务场景业务下的表单页面&#xff0c;中间的Render层就是技术实现。 每一个不同业务的表单…

多线程-线程池的使用

1. 线程池 1.1 线程状态介绍 当线程被创建并启动以后&#xff0c;它既不是一启动就进入了执行状态&#xff0c;也不是一直处于执行状态。线程对象在不同的时期有不同的状态。那么 Java 中的线程存在哪几种状态呢&#xff1f;Java 中的线程 状态被定义在了 java.lang.Thread.…

计算机网络 IP 网络层 2 (重置版)

IP的简介&#xff1a; IP 地址是互联网协议地址&#xff08;Internet Protocol Address&#xff09;的简称&#xff0c;是分配给连接到互联网的设备的唯一标识符&#xff0c;用于在网络中定位和通信。 IP编制的历史阶段&#xff1a; 1&#xff0c;分类的IP地址&#xff1a; …

Linux学习笔记——网络管理命令

一、网络基础知识 TCP/IP四层模型 以太网地址&#xff08;MAC地址&#xff09;&#xff1a; 段16进制数据 IP地址&#xff1a; 子网掩码&#xff1a; 二、接口管命令 ip命令&#xff1a;字符终端&#xff0c;立即生效&#xff0c;重启配置会丢失 nmcli命令&#xff1a;字符…

供应链系统设计-供应链中台系统设计(十)- 清结算中心概念片篇

综述 我们之前在供应链系统设计-中台系统设计系列&#xff08;五&#xff09;- 供应链中台实践概述文章中针对中台到底是什么进行了描述&#xff0c;对于中台的范围也进行划分&#xff0c;如下图所示&#xff1a; 关于商品中心&#xff0c;我们之前用4篇文章介绍了什么是商品中…

C++,STL 简介:历史、组成、优势

文章目录 引言一、STL 的历史STL 的核心组成三、STL 的核心优势四、结语进一步学习资源&#xff1a; 引言 C 是一门强大且灵活的编程语言&#xff0c;但其真正的魅力之一在于其标准库——尤其是标准模板库&#xff08;Standard Template Library, STL&#xff09;。STL 提供了…

OpenAI-Edge-TTS:本地化 OpenAI 兼容的文本转语音 API,免费高效!

文本转语音&#xff08;TTS&#xff09;技术已经成为人工智能领域的重要一环&#xff0c;无论是语音助手、教育内容生成&#xff0c;还是音频文章创作&#xff0c;TTS 工具都能显著提高效率。今天要为大家介绍的是 OpenAI-Edge-TTS&#xff0c;一款基于 Microsoft Edge 在线文本…

node 爬虫开发内存处理 zp_stoken 作为案例分析

声明: 本文章中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的&#xff0c;抓包内容、敏感网址、数据接口等均已做脱敏处理&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff01; 前言 主要说3种我们补环境过后如果用…

Hive:struct数据类型,内置函数(日期,字符串,类型转换,数学)

struct STRUCT&#xff08;结构体&#xff09;是一种复合数据类型&#xff0c;它允许你将多个字段组合成一个单一的值, 常用于处理嵌套数据&#xff0c;例如当你需要在一个表中存储有关另一个实体的信息时。你可以使用 STRUCT 函数来创建一个结构体。STRUCT 函数接受多个参数&…