iis服务器助手广告广告
返回顶部
首页 > 资讯 > 前端开发 > JavaScript >Vue.js响应式数据的简单实现方法(一看就会)
  • 795
分享到

Vue.js响应式数据的简单实现方法(一看就会)

2024-04-02 19:04:59 795人浏览 薄情痞子
摘要

目录引言基本概念副作用函数响应式数据响应式数据的基本实现实现思路初步实现尝试完善响应系统泛化副作用函数名修复漏洞总结引言 在vue.js之中,Vue会自动跟踪javascript状态

引言

vue.js之中,Vue会自动跟踪javascript状态变化并在状态发生改变时响应式地更新DOM,这就是Vue.js的两大核心功能之一——响应性,是每一个Vue.js框架使用者必须熟练掌握的的功能。而得益于Vue.js自身支持的声明式渲染,Vue.js的学习成本大大降低,就算是一个前端领域的小白,只要能看懂并简单使用基本的html、JavaScript以及CSS,就能够很快上手Vue.js。学,确实好学;用,真的好用!但,你对Vue.js框架的内部实现原理掌握多少呢?今天,就让我们一起来简单复现一下Vue.js数据响应式。

基本概念

副作用函数

什么是副作用函数?意如其名,副作用函数指的就是会产生副作用的函数。什么是副作用呢?就是会对函数作用域外的其他部分产生影响。俗话说:是药三分毒,能治病,亦能致病。药,就有副作用,副作用函数也是。

副作用函数代码示例如下:

当effect函数执行时,它会设置body的文本内容,从而直接或间接影响到其他任何对body文本内容有所依赖的函数的执行。这就是一个简单的副作用函数。

响应式数据

以我的理解,相较“响应式数据”而言更直白的叫法应该是“副作用数据”,就好像副作用函数的执行可能会影响到函数作用域外的其他内容一样,“副作用数据”的更改可能会直接或间接影响到所有依赖该数据的函数。

假响应式数据代码示例如下:

如上图,假设每一次修改对象obj的text属性值,都会触发函数effect的重新执行,那么就可以说对象obj是一个响应式数据。当然,在这个示例里,实际上并没有实现对obj对象的数据响应。

响应式数据的基本实现

实现思路

仔细观察思考上述的例子,你可能会发现响应式数据的实现存在两个关键点:

  • 副作用函数effect的执行会触发字段obj.text的读取操作
  • 响应式数据obj.text值的修改会触发字段obj.text的设置操作

事情的脉络渐渐清晰起来:如果我们能够拦截对象obj的读取和设置操作,在副作用函数effect首次读取字段obj.text的值时将它与对象obj关联起来,此后每次重新设置字段obj.text的值,都会重新调用一次effect函数,这样不就简单的实现了对obj对象的响应吗?

初步实现尝试

实现的思路有了,那现在最关键的问题就是:如何实现拦截一个对象属性的读取和设置操作。如果你对JavaScript足够熟悉,你可能就会想到Object.defineProperty函数以及Proxy对象代理。是的,这两种方案都可以实现拦截一个对象属性的读取以及设置操作。事实上,用Object.defineProperty函数实现数据响应正是Vue.js 2中所采用的方法,而Proxy对象代理则正是Vue.js 3中所采用的方法。

接下来让我们顺着上面的思路采用proxy实现一下:

这就是采用Proxy代理对象简单实现的数据响应式,你完全可以自行创建一个副作用函数effect进行测试。当然,考虑到复杂多变的环境,此时的数据相应式还有很多继续完善的地方,让我们再加加班,尽可能地给出一个相对完美的响应式数据实现方案。

完善响应系统

泛化副作用函数名

假如有一天,副作用的函数名不叫effect了。而是叫effect1或者effect2,甚至副作用函数没有直白的名字了,变成了一个匿名函数,那么上述的响应系统方案显然是行不通的。此时,为了满足需求,我们需要提供一个用来注册副作用函数的机制,达到泛化副作用函数名的效果。

注册副作用函数名的代码示例如下:

这样,即使是一个匿名函数,也能够被成功地注册为副作用函数,注册方法如下:

当然,此时拦截数据的读取操作也需要做细微的调整:

修复漏洞

在很多时候,debug都是最头疼的,特别是明明知道有bug,但就是找不到修复的方案,那种感觉真的像在坐牢……

现在我们来考虑一个极端条件:假如,在响应式数据对象obj上添加了一个原本不存在的属性,那么会发生什么?如果你对前面的内容还不熟悉,可以再返回去翻翻代码。你会发现一个惊人的事实:在响应式数据对象obj上添加一个原本不存在的属性,会在这个新添加的属性与相关的副作用函数之间建立响应联系。冷静下来思考一下,其实,导致该问题出现的根本原因是,没有在副作用函数与被操作的目标字段之间建立明确的联系。那,该如何解决呢?

你想想,在数据结构中存不存在一种结构,它具有一一对应的关系?有,当然有,映射就是。顺着这个思路,那我们可不可以用映射的来建立目标字段与副作用函数key-value对应的关系?当然可以!那么我们就可以先把负责储存函数的变量bucket声明为一个映射Map<target, Map<key, Set()>>用来储存响应式数据(key)-该响应式数据所有属性相关的副作用函数(value),其中,Map<key, Set>储存的就是响应式对象属性与相应的副作用函数集,这样,一个明确的联系就建立起来了。而在着手优化响应代码之前,我们再想一想:bucket用WeakMap会不会比用Map要更好一点?我实话直说吧,当然应该用WeakMap,因为WeakMap的key是弱引用,不会影响到垃圾回收器的工作,会在合适的时候被回收,用在这里更合适。

具体实现代码如下:

总结

总的来说,要想实现一个响应式数据其实就是利用Proxy对象代理或者Object.defineProperty对象来拦截对数据的读取和设置操作并与相应的副作用函数作精确绑定。那么,如果现在要求你用Object.defineProperty对象来实现数据响应,你能够独立实现了吗?试一下呗!

到此这篇关于Vue.js响应式数据的简单实现方法的文章就介绍到这了,更多相关Vue.js响应式数据的实现内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Vue.js响应式数据的简单实现方法(一看就会)

本文链接: https://www.lsjlt.com/news/140867.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Vue.js响应式数据的简单实现方法(一看就会)
    目录引言基本概念副作用函数响应式数据响应式数据的基本实现实现思路初步实现尝试完善响应系统泛化副作用函数名修复漏洞总结引言 在Vue.js之中,Vue会自动跟踪JavaScript状态...
    99+
    2024-04-02
  • Vue.js响应式数据如何实现
    小编给大家分享一下Vue.js响应式数据如何实现,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!基本概念副作用函数什么是副作用函数?意如其名,副作用函数指的就是会产...
    99+
    2023-06-29
  • 实现一个简单得数据响应系统
    目录1、Dep2、了解 obverser3、了解 watch 和 observer4、触发依赖5、总结一下流程1、Dep 其实,这就是一个依赖收集的容器, depend 收集依赖, ...
    99+
    2024-04-02
  • Java中怎么实现实现一个简单得数据响应系统
    这篇文章主要介绍“Java中怎么实现实现一个简单得数据响应系统”,在日常操作中,相信很多人在Java中怎么实现实现一个简单得数据响应系统问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java中怎么实现实现一个...
    99+
    2023-06-25
  • NTFS文件系统误删除数据的恢复教程,非常简单一看就会
    NTFS文件系统是目前市面上使用比较广泛的一个文件系统格式,该文件系统提供了数据保护和恢复功能,拥有更强的安全性,基本上取代了老式的FAT文件系统。由于NTFS文件系统的安全性更像,许多公司的服务器采用这一文件系统。对NTFS文件系统了解的...
    99+
    2023-06-03
  • 实现一个响应式布局的原理与方法
    页面响应式布局的原理与实现方法 随着移动设备的普及和互联网的快速发展,越来越多的用户开始使用手机、平板等移动设备浏览网页。而传统的固定布局往往无法适应不同屏幕尺寸的设备,导致用户体验不佳。为了解决这个问题,响应式布局应运而生。 ...
    99+
    2024-01-29
    原理 实现方法 响应式布局
  • Vue响应式数据中的观察者模式实例简析
    这篇文章主要介绍“Vue响应式数据中的观察者模式实例简析”,在日常操作中,相信很多人在Vue响应式数据中的观察者模式实例简析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Vu...
    99+
    2024-04-02
  • Java实现一个简单的缓存方法
    缓存是在web开发中经常用到的,将程序经常使用到或调用到的对象存在内存中,或者是耗时较长但又不具有实时性的查询数据放入内存中,在一定程度上可以提高性能和效率。下面我实现了一个简单的缓存,步骤如下。创建缓存对象EntityCache.java...
    99+
    2023-05-31
    java 缓存 ava
  • vue3响应式实现readonly的方法是什么
    readonly的实现it("happy path", () => { console.warn = vi.fn(); const original = { foo: 1, };...
    99+
    2023-05-21
    Vue3 readonly
  • Go 简单实现多租户数据库隔离的方法
    今天小编给大家分享的是Go 简单实现多租户数据库隔离的方法,相信很多人都不太了解,为了让大家更加了解,所以给大家总结了以下内容,一起往下看吧。一定会有所收获的哦。多租户在 SaaS 系统中多租户是一个很重要的架构,在服务上仅需运行...
    99+
    2023-08-03
  • vue处理响应式数据的方法是什么
    这篇“vue处理响应式数据的方法是什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“vue处理响应式数据的方法是什么”文章吧...
    99+
    2023-07-05
  • JavaScrip简单数据类型隐式转换的实现
    目录JavaScrip隐式转换规则JavaScrip类型转换详解转换成Number类型转换为String类型转换为Boolean类型JavaScrip特殊操作符对类型转换的影响!逻辑...
    99+
    2023-05-20
    JavaScrip 数据类型隐式转换 JavaScrip  隐式转换
  • Android响应事件onClick方法的四种实现方式
    在Android的开发中,对于点击事件的OnClickListener有下面四种实现方式,可以根据实际场景的需要选择合适的用法。下面以Button按钮来举例说明。 方法一:匿名内部类 适合场景:任...
    99+
    2023-10-07
    android
  • HTML5响应式布局的实现方法和技巧
    如何实现HTML5响应式布局的步骤与技巧 随着移动设备的普及,网页的响应式布局成为了开发者们必备的技能。HTML5的出现给了开发者更多的选择和灵活性,使得实现响应式布局变得更加容易。本文将介绍一些实现HTML5响应式布局的步骤与...
    99+
    2024-01-29
    html 响应式布局 步骤与技巧
  • 基于Redis的分布式锁的简单实现方法
    Redis官方给出两种思路 第一种:SET key value [EX seconds] [PX milliseconds] NX 第二种:SETNX+GETSET 首先,分别看一下这几个命令 SET命令 ...
    99+
    2024-04-02
  • js项目中双向数据绑定的简单实现方法
    目录前言发布订阅者模式结果调用总结前言 双向数据绑定 指的是当对象的属性发生变化时能够同时改变对应的UI,反之亦然。换句话说,如果我们有一个user对象,这个对象有一个name属性...
    99+
    2024-04-02
  • 深入浅析vue处理响应式数据的方法
    本篇文章带大家学习vue,聊聊vue如何处理响应式数据?希望对大家有所帮助!关于vue的响应式数据,你可能有很多疑惑。比如为什么要改用proxy比如为什么有reactive和ref两个api比如vue是如何实现响应式的?其实这些在源码中,都...
    99+
    2023-05-14
    前端 Vue.js
  • SpringBoot响应处理之以Json数据返回的实现方法
    目录一、示例代码二、返回值解析原理三、源代码分析(debug)四、内容协商机制1. 内容协商2. 内容协商原理重点源代码3. HttpMessageConverters消息转换器原理...
    99+
    2024-04-02
  • Springboot 中的 Filter 实现超大响应 JSON 数据压缩的方法
    目录简介pom.xml 引入依赖对Response进行包装定义GzipFilter对输出进行拦截注册 GzipFilter 拦截器定义 Controller定义 Springboot...
    99+
    2022-11-13
    Springboot JSON 数据压缩 Springboot Filter
  • React实现单向数据流的方法
    目录为什么React采用单向数据流设计一、原因二、什么是React单向数据流三、如何使用React单向数据流1. 定义组件2. 定义Props属性3. 子组件接收并使用Props属性...
    99+
    2023-05-16
    React 单向数据流
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作