首页 > 其他分享 >涨见识了!脱离vue项目竟然也可以使用响应式API

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

时间:2024-07-25 09:11:32浏览次数:6  
标签:count vue 见识 watch js watchEffect API 响应

前言

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的机会

标签:count,vue,见识,watch,js,watchEffect,API,响应
From: https://www.cnblogs.com/heavenYJJ/p/18321516

相关文章

  • vue大小写总结
    1.组件组件的定义有两种命名方式:PascalCase  和   kebab-casePascalCase 定义的组件的引用:PascalCase  和   kebab-case  均可//PascalCase定义方式Vue.component('MyComponentName',{/*...*/})//引用方式一<my-component-name/>//引用方......
  • Vue Router【实用教程】(2024最新版)vue3 路由管理
    VueRouter是Vue官方的客户端路由解决方案,在单页应用(SPA)中,用户在应用中浏览不同页面时,URL会随之更新,但页面不需要从服务器重新加载。核心思想:通过配置路由来告诉VueRouter为每个URL路径显示哪些组件。官网https://router.vuejs.org/zh/guide/安装通常......
  • 即使第一次发出请求,Pytends API 也会抛出 429 错误
    我正在使用非常简单的代码按区域查找关键字的数据。但每次我运行它时,它都会给我429错误,提示发出了太多请求,但实际上该请求是第一次发出,以前从未发出过。下面提到了我收到的错误。引发异常。TooManyRequestsError.from_response(response)pytrends.exceptions.TooManyRequ......
  • 无法在我的 apache 服务器内对 Flask 应用程序(用于 MySQL 连接)进行远程 api 调用
    我有一个在AlmaLinux上运行的apache服务器。我有Flask代码设置来接受来自远程连接的API调用。所以我的API调用命中了Flask,然后它连接到MySQL数据库。当我尝试在服务器内部本地运行此数据库连接代码时,它工作正常。但是当我尝试通过远程API调用来访问Flask应......
  • 将 Streaming Assistants API 与 Websocket 结合使用
    我正在开发一个FastAPI应用程序,其中使用WebSockets从Assistant的API事件处理程序实时发送文本增量。但是,负责发送这些增量的任务仍处于PENDING状态并且永远不会运行。因此,客户端不会收到预期的数据。症状WebSocket连接打开并收到消息。为处理WebSo......
  • 在 Gerrit 的 REST API 中,如何查找补丁集 ID 值?我有 url.../details Json 但在那里找
    我正在使用request.get来获取Json,并想使用最新的补丁集和扩展名/revisions/(patchSetNumber)/files再次执行此操作以查找所有修改的文件。我无法弄清楚如何通过请求找到补丁集ID。我尝试通过url/details扩展进行搜索,但无法找到修订选项卡或补丁集选项卡是对的,Ger......
  • OpenAI API 错误:“您尝试访问 openai.ChatCompletion,但 openai>=1.0.0 不再支持此操作
    我目前正在开发一个聊天机器人,由于我使用的是Windows11,它不允许我迁移到较新的OpenAI库或降级它。我可以用其他函数替换ChatCompletion函数以在我的版本上工作吗?这是代码:importopenaiopenai.api_key="private"defchat_gpt(prompt):response=op......
  • 计算机专业论文 (SpringBoot/SpringCloud+Vue+MySql)
    (可辅导论文)需要源码dd毕业设计(论文)  论文题目:基于Vue和SpringCloud的旅游网站设计与实现 摘 要 本论文主要介绍了基于Vue和SpringCloud的旅游网站的设计与实现。如今,旅游业已成为社会发展中的重要组成部分,旅游平台聚集多种多样的旅行方案以及攻略,越来越多的人......
  • DRF入门规范,API接口,接口测试工具,restful规范,序列化和反序列化,drf安装和快速使用
    ⅠDRF入门规范【一】Web应用模式在开发Web应用中,有两种应用模式:【1】前后端不分离【2】前后端分离【3】前后端开发模式#1前后端混合开发-不少公司在用-flask混合-django混合-例如最简单的bbs项目-模板:dtl语法:djangotemplatelanguage模板语......
  • Vue全家桶 - pinia 的理解和学习1(Pinia 核心概念的 Store、State、Getter、Action)
    Pinia(Vue的专属状态管理库)Pinia和Vuex的区别设计理念和架构Vuex采用集中式架构,所有状态存储在一个全局状态树中,通过mutations和actions来修改和处理状态。Pinia采用去中心化的架构,每个模块有自己的状态,这使得Pinia在代码分割和模块化方面更加灵活。TypeSc......