写点什么

如何手撸一个 Vue 3.0 异步函数 API?

  • 2019-08-02
  • 本文字数:2030 字

    阅读完需:约 7 分钟

如何手撸一个Vue 3.0异步函数API?

在上次 Xebia 知识交流(Xebia Knowledge Exchange )活动中,我们用 Vue 函数 API 进行了实验,并创建了 vue-async-function,这个函数现在就可以用于你的 Vue 项目!让我们深入研究,看看它会为我们带来什么。

Vue 异步函数的背景

不久前,React 团队发布了 React Hooks。这是一种管理 React 组件中状态的新方法,无需使用传统的类语法。Vue.js 团队希望在下一个主要版本的 Vue 引入类似的语法。他们创建了一份提案 / 公开讨论文档 ,并正在开发与提案保持同步的实现。尽管这一实现仍处于激烈的讨论之中,但还是可以作为 Vue2 的插件来使用。


Xebia 知识交流活动中,我们的目标是分享知识,激励他人。幸运的是,React Async 的创建者 Gert 也加入了我们的行列,他认为,从他的库中重新实现 useAsyncuseFetch hook 是个不错的主意。我们继续开发,不到一个小时,我们就成功地重新实现了这两个函数的基本版本。

开发过程

完成安装说明后,让我们以单文件组件格式来创建一个新组件:


<template>  <h2>useAsync example</h2></template> <script>export default {};</script>
复制代码


现在,我们将介绍一个要调用的异步函数:


// ... template
<script>async function loadStarship({ id }) { const headers = { Accept: "application/json" }; const res = await fetch(`https://swapi.co/api/starships/${id}/`, { headers }); if (!res.ok) throw new Error(res); return res.json();}
export default {};</script>
复制代码


函数 loadSpaceship 将从 Star Wars API 获取一些数据。如果获取成功,它将返回 JSON 格式的数据,否则将抛出。


现在,我们想要:


  • 在组件创建时调用此函数。

  • 显示加载指示器。

  • 提供有关数据可用性的数据。

  • 由于某种原因获取失败。


如果没有 Vue 函数 API,你现在需要添加:


  • 一种 data 方法,用于准备加载、错误和数据反应属性。

  • 一种 created 生命周期方法,用于调用更新反应属性的函数。


随着时间的推移,这些可能会与其他生命周期和数据问题混合在一起。如此一来,会使你的代码更难以理解,也降低了它的可重用性。当然,你已经有了某些设计模式来区分这些问题,例如,通过混合或继承。Vue 函数 API 提供了一种以直观的方式区分这些问题的新方法。让我们来看看是如何工作的:


<template>  <div>    <h2>useAsync example</h2>    <div v-if="isLoading">Loading...</div>    <div v-else-if="error">Error!</div>    <div v-else>{{ data }}</div>  </div></template>
<script>import { value, onCreated } from "vue-function-api";
// ... same loadStarship function
export default { setup() { const isLoading = value(true); const error = value(null); const data = value(null);
onCreated(async () => { try { const result = await loadStarship({ id: 2 }); data.value = result; } catch (e) { error.value = e; } finally { isLoading.value = false; } });
return { isLoading, error, data, }; } };</script>
复制代码


我们可以通过错误处理来扩展这个示例代码,并使用其他生命周期方法来使它更好。然而,这并不是 Vue 函数 API 的意义所在。在 setup 函数中,我们现在讲数据和生命周期问题组合在一起。更好的是,我们可以把他们放在不同的函数中。这是区分不同问题的首选方法,这就是 vue-function-api 的用武之地。

useAsync 与 useFetch

让我们看看使用 useAsync 时,这个示例代码是什么样的:


// ... same template
<script>import { useAsync } from "vue-async-function";
// ... same loadStarship function
export default { setup() { const { data, error, isLoading } = useAsync(loadStarship, { id: 2 }); return { data, error, isLoading }; }};</script>
复制代码


这示例代码也太短了吧!我们还可以把它变得更短。获取数据是如此常见,以至于有个专门的 useFetch 函数:


// ... same template <script>import { useFetch } from "vue-async-function"; export default {  setup() {    const id = 2;    const { data, error, isLoading } = useFetch(`https://swapi.co/api/starships/${id}/`, {       headers: { Accept: "application/json" }    });    return { data, error, isLoading };  }};</script>
复制代码


额外好处是:当你使用 useAsync 时,还会收到一个 AbortcController.signal,当组件被销毁时,可以连接起来中止网络请求。如果你使用 useFetch,这个问题已经得到解决。

结论

新的 Vue 函数 API 带来了好处:经过深思熟虑的设计模式。编写可重用的 Vue 函数感觉更为直观,并且你可以轻松地与他人分享。开发 useAsyncuseFetch 函数帮助程序更顺利的执行。


有关代码或安装 npm 包,请参见 vue-async-function repo。参见示例 repo 中的更多示例代码。


英文原文:https://xebia.com/blog/next-generation-async-functions-with-vue-async-function/


2019-08-02 10:162938
用户头像

发布了 540 篇内容, 共 300.0 次阅读, 收获喜欢 1573 次。

关注

评论

发布
暂无评论
发现更多内容

Flink从入门到实战,经历了30个日日夜夜,终于悟道了!

程序员高级码农

大数据 flink 程序员

Arthas getstatic(查看类的静态属性 )

刘大猫

监控 Arthas 监控工具 getstatic 查看类静态属性

打卡习惯,记录坚持:我用 CodeBuddy 做了个毛玻璃风格的习惯打卡小应用

繁依Fanyi

【浪潮海岳inDatax数据中台专栏】主数据管理中基于属性的物料编号生成技术

inBuilder低代码平台

模型即组件的技术实现路径 ——iVX 量子化架构对 GPT-4o/Mediapipe 的封装解析

代码制造者

低代码 组件化 封装 组件化开发

Arthas 全攻略:让调试变得简单

刘大猫

人工智能 算法 监控 Arthas 监控工具

Doris Manager 24.3 版本正式发布,增强集群巡检能力

SelectDB

Apache 数据库 数据分析 实时数仓 OLAP

一次对话,让我10分钟打造一款拥有玻璃拟态风格的二维码生成大师

繁依Fanyi

高能预警!Community Day 20+议题大公开

声网

借助 CodeBuddy,轻松打造「一分钟冥想」App

繁依Fanyi

「今日一句」情绪签语 App:一次与 CodeBuddy 的共创之旅

繁依Fanyi

借助 CodeBuddy,我见证了一款在线代码格式化神器的诞生

繁依Fanyi

CouchDB 可观测最佳实践

观测云

couchdb

全职接单后才发现,其实不只是技术重要

程序员郭顺发

Nuxt的SEO实践

溪抱鱼

typescript nuxt

通义灵码2.5智能体模式联合MCP:打造自动化菜品推荐平台,实现从需求到部署的全流程创新

穿过生命散发芬芳

MCP 通义灵码2.5

借助 CodeBuddy,我轻松开发出三分钟读书 App

繁依Fanyi

使用kookeey代理IP配置Undetectable指纹浏览器教程

kookeey代理严选

代理IP 跨境电商 代理商 kookeey代理 Undetectable指纹浏览器

RocketMQ实战—订单系统面临的技术挑战

量贩潮汐·WholesaleTide

数据库 RocketMQ

NotebookLM 推出移动版本,音频概览支持实时互动;豆包 AI 耳机支持外教语音智能体 Owen丨日报

声网

鸿蒙电脑正式发布!新机用户专享“鸿蒙有礼”,800元权益礼包限时领取

最新动态

虚拟币制度钱包开发:功能设计与成本全解析

区块链软件开发推广运营

交易所开发 dapp开发 链游开发 代币开发 交易所开发公链开发

深入解析 Spring AI 系列:解析请求参数处理

不在线第一只蜗牛

人工智能 spring

鸿蒙带来的机会比想象中更大

最新动态

自己动手,从零开始编写Raft算法来实现分布式一致性算法

程序员高级码农

程序员 分布式 算法

ES 调优帖:关于索引合并参数 index.merge.policy.deletePctAllowed 的取值优化

极限实验室

Elastic Search

数据仓库是什么?常见问题解答

镜舟科技

数据仓库 数据湖 OLAP 数据模型 数据存储

永久免费!专为 Apache Doris 打造的可视化数据管理工具 SelectDB Studio V1.1.0 重磅发布!

SelectDB

数据库 大数据 数据分析 实时数仓 可视化工具

《算法导论(第4版)》阅读笔记:p91-p94

codists

算法

【HarmonyOS 5】鸿蒙星闪NearLink详解

GeorgeGcs

我如何和 CodeBuddy 搭建「Gradia」渐变配色神器 —— 一场流动色彩的创造之旅

繁依Fanyi

如何手撸一个Vue 3.0异步函数API?_语言 & 开发_Albert Brand_InfoQ精选文章