首页 星云 工具 资源 星选 资讯 热门工具
:

PDF转图片 完全免费 小红书视频下载 无水印 抖音视频下载 无水印 数字星空

涨见识了!脱离vue项目竟然也可以使用响应式API

编程知识
2024年07月25日 07:41

前言

vue3的响应式API大家应该都特别熟悉,比如refwatchwatchEffect等。平时大家都是在vue-cli或者vite创建的vue项目里面使用的这些响应式API,今天欧阳给大家带来一些不一样的。脱离vue项目,在node.js项目中使用vue的响应式API

关注公众号:【前端欧阳】,给自己一个进阶vue的机会

直接上代码

话不多说,直接上代码。这个是我在本地新建的一个最简单的node.js项目,如下图:
node

从上图可以看到我们的node.js项目依赖只有一个:vue。并且提供了一个名为dev的脚本命令,这个脚本命令实际是在node环境内执行index.js文件。

我们来看index.js文件,代码如下:

const { ref, watch, watchEffect } = require("vue");

const count = ref(0);

// 模拟count变量的值修改
setInterval(() => {
  count.value++;
}, 1000);

watch(count, (newVal) => {
  console.log("触发watch", newVal);
});

watchEffect(
  () => {
    console.log("触发watchEffect", count.value);
  },
  {
    flush: "sync",
  }
);

为了标明index.js文件是在node.js环境中运行的,所以这里我特地使用require去导入vue导出的refwatchwatchEffect这三个响应式API。

并且我们还模拟了修改count响应式变量值的操作,使用setInterval每隔一秒让count的值+1

在vue项目中一样使用watchwatchEffect去监听count变量的值。

在终端执行yarn dev,也就是执行node index.js,如下图:
run

从上图中可以看到在node.js中的执行结果和预期是一模一样的。

为什么可以这样写呢?

前面的那个例子是一个node.js项目,项目中我们并没有像vue项目那样去创建一个vue组件,然后在组件里面去使用响应式API。而是直接在一个普通的node.js文件中使用vue暴露出来的响应式API,并且watchwatchEffect在监听的值改变后同样触发了对应的watch回调,那么这个又是怎么做到的呢?

这得益于vue3优秀的模块化设计,他将核心功能拆分为多个独立的模块,如下图:
packages

比如reactivity模块中就是响应式的核心代码、compiler-core模块就是编译相关的核心代码。

并且这些模块还被单独当作npm包进行发布,命名规则是@vue+模块名。比如reactivity模块对应的npm包就是@vue/reactivity。如下图:
npm

得益于模块化的设计,响应式相关的API和vue组件并没有强关联的关系,所以我们可以在node.js应用中去直接使用响应式API。

这里使用到了三个响应式API,分别是:refwatchwatchEffect。在vue组件中的响应式的实现原理大家多多少少都有所听闻,其实在node.js项目中实现原理也是一样的,接下来我们讲讲是如何实现响应式的。

在我们这个demo中count是一个ref的响应式变量,当我们对count变量进行读操作时会触发get拦截。当我们对count变量进行写操作时会触发set拦截。

在我们这里使用watchwatchEffect的代码是下面这样的:

watch(count, (newVal) => {
  console.log("触发watch", newVal);
});

watchEffect(
  () => {
    console.log("触发watchEffect", count.value);
  },
  {
    flush: "sync",
  }
);

当代码首次执行到watchwatchEffect时都会对count变量进行读操作,并且watchwatchEffect都传入了一个回调函数。

由于对count变量进行读操作了,所以就会触发get拦截。在get拦截中会将当前watch的回调函数作为依赖收集到count变量中。收集的方式也很简单,因为count变量是一个对象,所以使用对象的dep属性进行依赖收集。因为dep属性是一个集合,所以可以收集多个依赖。

在我们这里watchwatchEffect都触发了count变量的get拦截,所以watchwatchEffect的回调函数都被count变量进行了依赖收集。

当修改count变量的值时会触发set拦截,在set拦截中做的事情也很简单。将count变量收集到的依赖全部取出来,然后执行一遍。这里收集的依赖是watchwatchEffect的回调函数,所以当count变量的值改变时会导致watchwatchEffect的回调函数重新执行。

这个是整个流程图:
progress

从流程图可以看到响应式的实现原来完全不依赖vue组件,所以我们可以在node.js项目中使用vue的响应式API,这也是vue的设计奇妙之处。

总结

这篇文章讲了我们可以脱离vue项目,直接在node.js项目中使用vue的响应式API。接着讲了响应式的实现原理其实就是依靠get拦截进行依赖收集,set拦截进行依赖触发。

搞清楚响应式原理后,我们发现响应式完全不依赖vue组件,所以我们可以在node.js项目中使用vue的响应式API,这也是vue的设计奇妙之处。

关注公众号:【前端欧阳】,给自己一个进阶vue的机会

From:https://www.cnblogs.com/heavenYJJ/p/18321516
本文地址: http://shuzixingkong.net/article/398
0评论
提交 加载更多评论
其他文章 【VMware VCF】VMware Cloud Foundation Part 04:准备 ESXi 主机。
VMware Cloud Foundation 管理域部署要求至少准备 4 台 ESXi 主机作为最小计算单元,如果采用整合部署(管理域和 VI 工作负载域合并),还需要根据实际情况适量增加 ESXi 计算主机。但是,对于测试学习来说,我们不需要准备这么多物理主机,可以采用嵌套虚拟化部署的方式来完成
【VMware VCF】VMware Cloud Foundation Part 04:准备 ESXi 主机。 【VMware VCF】VMware Cloud Foundation Part 04:准备 ESXi 主机。 【VMware VCF】VMware Cloud Foundation Part 04:准备 ESXi 主机。
【数学建模导论】Task01 数据处理与拟合模型
0 前言 感谢 DataWhale 的开源学习课程 intro-mathmodel,项目仓库在这。 现在开始,跟着Task01 进入数据类的学习,实现每一个代码,包括数据预处理、回归分析与分类分析、假设检验、随机过程与随机模拟、数据可视化图表、三种插值模型。 本篇是知识的梳理和总结,用以更好地食用教
【数学建模导论】Task01 数据处理与拟合模型 【数学建模导论】Task01 数据处理与拟合模型 【数学建模导论】Task01 数据处理与拟合模型
在英特尔 Gaudi 2 上加速蛋白质语言模型 ProtST
引言 蛋白质语言模型 (Protein Language Models, PLM) 已成为蛋白质结构与功能预测及设计的有力工具。在 2023 年国际机器学习会议 (ICML) 上,MILA 和英特尔实验室联合发布了 ProtST 模型,该模型是个可基于文本提示设计蛋白质的多模态模型。此后,ProtS
在英特尔 Gaudi 2 上加速蛋白质语言模型 ProtST 在英特尔 Gaudi 2 上加速蛋白质语言模型 ProtST 在英特尔 Gaudi 2 上加速蛋白质语言模型 ProtST
全网最适合入门的面向对象编程教程:24 类和对象的 Python 实现-异常的捕获与处理:try/except 语句、文件读写示例、Exception 引用
本文主要介绍了在使用Python面向对象编程时,如何使用try/except语句捕获并处理异常,并辅以CSV文件读写为例进行讲解,同时说明了如何对Exception对象进行引用。
全网最适合入门的面向对象编程教程:24 类和对象的 Python 实现-异常的捕获与处理:try/except 语句、文件读写示例、Exception 引用 全网最适合入门的面向对象编程教程:24 类和对象的 Python 实现-异常的捕获与处理:try/except 语句、文件读写示例、Exception 引用 全网最适合入门的面向对象编程教程:24 类和对象的 Python 实现-异常的捕获与处理:try/except 语句、文件读写示例、Exception 引用
深度解读GaussDB(for MySQL)与MySQL的COUNT查询并行优化策略
GaussDB(for MySQL)通过自研并行查询(PQ)和计算下推(NDP)特性,解决了大表COUNT慢的问题,典型场景下,相比MySQL并行扫描主键性能可提升超过80倍。
深度解读GaussDB(for MySQL)与MySQL的COUNT查询并行优化策略 深度解读GaussDB(for MySQL)与MySQL的COUNT查询并行优化策略 深度解读GaussDB(for MySQL)与MySQL的COUNT查询并行优化策略
机器学习:详解什么是端到端的深度学习?(What is end-to-end deep learning?)
什么是端到端的深度学习? 深度学习中最令人振奋的最新动态之一就是端到端深度学习的兴起,那么端到端学习到底是什么呢?简而言之,以前有一些数据处理系统或者学习系统,它们需要多个阶段的处理。那么端到端深度学习就是忽略所有这些不同的阶段,用单个神经网络代替它。 来看一些例子,以语音识别为例,目标是输入\(x
机器学习:详解什么是端到端的深度学习?(What is end-to-end deep learning?) 机器学习:详解什么是端到端的深度学习?(What is end-to-end deep learning?) 机器学习:详解什么是端到端的深度学习?(What is end-to-end deep learning?)
PHP转Go系列 | 推荐一个强大的Go语言工具函数库
从 PHP 转到 Go 的朋友,常常会因为没有便捷的工具函数而感到苦恼。PHP 写的多了就会形成路径依赖,在写 Go 的时候时不时就会想到 PHP 强大的数组函数。
PHP转Go系列 | 推荐一个强大的Go语言工具函数库 PHP转Go系列 | 推荐一个强大的Go语言工具函数库
elasticdump数据迁移与内外网安装
elasticdump数据迁移与内外网安装 一、安装node 首先获取安装包 wget https://nodejs.org/dist/v16.14.0/node-v16.14.0-linux-x64.tar.xz tar axf node-v16.14.0-linux-x64.tar.xz -C