返回顶部
首页 > 资讯 > 精选 >Vue.js响应式数据如何实现
  • 589
分享到

Vue.js响应式数据如何实现

2023-06-29 08:06:26 589人浏览 安东尼
摘要

小编给大家分享一下vue.js响应式数据如何实现,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!基本概念副作用函数什么是副作用函数?意如其名,副作用函数指的就是会产

小编给大家分享一下vue.js响应式数据如何实现,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!

基本概念

副作用函数

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

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

Vue.js响应式数据如何实现

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

响应式数据

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

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

Vue.js响应式数据如何实现

如上图,假设每一次修改对象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实现一下:

Vue.js响应式数据如何实现

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

完善响应系统

泛化副作用函数名

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

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

Vue.js响应式数据如何实现

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

Vue.js响应式数据如何实现

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

Vue.js响应式数据如何实现

修复漏洞

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

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

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

具体实现代码如下:

Vue.js响应式数据如何实现

以上是“Vue.js响应式数据如何实现”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注编程网精选频道!

--结束END--

本文标题: Vue.js响应式数据如何实现

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

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

猜你喜欢
  • Vue.js响应式数据如何实现
    小编给大家分享一下Vue.js响应式数据如何实现,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!基本概念副作用函数什么是副作用函数?意如其名,副作用函数指的就是会产...
    99+
    2023-06-29
  • vue.js数据响应式原理解析
    目录Object.defineProperty()定义 defineReactive 函数递归侦测对象的全部属性流程分析observe 函数Observer 类完善 defineRe...
    99+
    2022-11-13
    vue.js数据响应式原理 vue.js数据响应式
  • Vue.js响应式数据的简单实现方法(一看就会)
    目录引言基本概念副作用函数响应式数据响应式数据的基本实现实现思路初步实现尝试完善响应系统泛化副作用函数名修复漏洞总结引言 在Vue.js之中,Vue会自动跟踪JavaScript状态...
    99+
    2024-04-02
  • Vue.js中实现响应式的原理是什么
    Vue.js中实现响应式的原理是什么,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。一、Vue.js 响应式的使用现在有个很简单的需求,点击页面...
    99+
    2024-04-02
  • Vue.js响应式编程实例分析
    这篇文章主要介绍了Vue.js响应式编程实例分析的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Vue.js响应式编程实例分析文章都会有所收获,下面我们一起来看看吧。响应式编程展示数据,对象例子:var ...
    99+
    2023-06-27
  • vue2和vue3数据响应式原理分析及如何实现
    今天就跟大家聊聊有关vue2和vue3数据响应式原理分析及如何实现,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。数据响应式视图跟数据是自动更新的,数据更新的时候视图是自动的更新的追踪...
    99+
    2023-06-22
  • Vue怎么实现响应式数据更新
    本文小编为大家详细介绍“Vue怎么实现响应式数据更新”,内容详细,步骤清晰,细节处理妥当,希望这篇“Vue怎么实现响应式数据更新”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。首先假设我们在祖辈时候传入进来是个动态...
    99+
    2023-07-04
  • Bootstrap如何实现响应式表格
    这篇文章给大家分享的是有关Bootstrap如何实现响应式表格的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。Bootstrap 的响应式 CSS 能够自适应于台式机、平板电脑和手...
    99+
    2024-04-02
  • Angular2如何实现响应式表单
    小编给大家分享一下Angular2如何实现响应式表单,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!响应式表单介绍angular提...
    99+
    2024-04-02
  • rem如何实现响应式布局
    这篇文章主要介绍“rem如何实现响应式布局”,在日常操作中,相信很多人在rem如何实现响应式布局问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”rem如何实现响应式布局”的疑惑有所帮助!接下来,请跟着小编一起来...
    99+
    2023-07-05
  • vue怎么实现响应式与双向数据
    这篇文章给大家介绍vue怎么实现响应式与双向数据,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。vue-响应式是什么Vue 最独特的特性之一,是其非侵入性的响应式系统。数据模型仅仅是普通的 JavaScript对象。而当...
    99+
    2023-06-15
  • angular中如何实现响应式表单
    这篇文章给大家分享的是有关angular中如何实现响应式表单的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。响应式表单Angular 提供了两种不同的方法来通过表单处理用户输入:响...
    99+
    2024-04-02
  • css中如何实现字体响应式
    这篇文章主要介绍了css中如何实现字体响应式,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。问题场景:在实现响应式布局的过程中,如何设置字体大...
    99+
    2024-04-02
  • Vue3响应式系统如何实现computed
    这篇“Vue3响应式系统如何实现computed”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Vue3响应式系统如何实现co...
    99+
    2023-07-06
  • 如何利用Python实现高效的分布式响应式大数据处理?
    Python是一种流行的编程语言,它具有易学易用、灵活、高效等优点。Python已经成为了处理大数据的首选语言之一。在处理大数据时,分布式和响应式是两个非常重要的概念。本文将介绍如何使用Python实现高效的分布式响应式大数据处理。 一、分...
    99+
    2023-08-17
    分布式 响应 大数据
  • 分布式大数据处理中,Python如何实现高效响应式计算?
    随着大数据的快速发展,分布式大数据处理成为了现代计算的核心任务之一。在这个过程中,Python作为一种高级编程语言,具有简单易用、灵活、快速迭代等优势,在分布式大数据处理中也得到了广泛应用。本文将介绍Python如何实现高效响应式计算,以及...
    99+
    2023-08-17
    分布式 响应 大数据
  • 如何使用Vue.js和MJML创建响应式电子邮件
    本篇内容介绍了“如何使用Vue.js和MJML创建响应式电子邮件”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所...
    99+
    2024-04-02
  • 如何实现angular中的响应式表单
    小编给大家分享一下如何实现angular中的响应式表单,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!响应式表单Angular 提...
    99+
    2024-04-02
  • vue2如何实现provide inject传递响应式
    这篇文章将为大家详细讲解有关vue2如何实现provide inject传递响应式,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。1. vue2 中的常规写法// 父级组件提供 '...
    99+
    2023-06-15
  • vue.js如何实现单页面应用
    这篇文章主要介绍vue.js如何实现单页面应用,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!一:npm的安装由于新版的node.js已经集成了npm的环境,所以只需去官网下载node...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作