9 月 13 日,2025 Inclusion・外滩大会「开源嘉年华」正在限量报名中! 了解详情
写点什么

TNG-Hooks:有状态逻辑在标准函数中的重用和组合

  • 2019-02-19
  • 本文字数:1907 字

    阅读完需:约 6 分钟

TNG-Hooks:有状态逻辑在标准函数中的重用和组合

TNG-Hooks 软件库出现之后,JavaScript 开发人员可通过有用的、频繁有状态的和有效逻辑来装饰常规独立函数,例如查询远程数据库、访问范围外的上下文数据等。钩子函数(Hook)有助于代码重用和组合,可实现规模更小、更易于维护且更稳定的代码库。

正文

在去年的 React 大会,该组织发布了 React Hooks 项目,令各开发者社区大为赞叹。开发人员可使用 Reack Hooks,将有状态或有效计算完全抽象为函数形式,进而在 React 函数组件中加以重用和组合。先前的做法是使用 ES 类而非函数,即用单独的纯计算函数添加效果和状态。


对经验不足的开发人员而言,使用函数要比 ES 类更易于组合代码。此外,使用 ES 类需要将有效逻辑位复制到各种各样的方法中,使代码散碎。TNG-Hooks 在降低对 React 依赖的同时,有效利用了 React Hooks 的优点。


为了最小化 React 函数组件,TNG 引入了一种称为“铰接函数”(Articulated Functions)的概念。铰接函数应满足两个条件。首先,在被调用前,它们需要包裹一个 TNG 装饰器(decorator)。其次,铰接函数可在执行过程中的某处调用钩子函数。


下面给出例子代码。其中,TNG 函数作为装饰器,useState 是一个钩子函数,而 hit 函数就是一个铰接函数。


function hit() {    var [count,updateCount] = useState(0);    count++;    updateCount(count);    console.log(`Hit count: ${count}`);}
hit = TNG(hit);
hit(); // Hit计数:1hit(); // Hit计数:2hit(); // Hit计数:3
复制代码


在上例中,hit 函数被多次调用,每次调用后返回不同的值。由此,我们称 hit 函数是一个有状态函数。钩子函数 useState 用于抽象本地状态管理操作,包括检索、存储和状态更新等。该钩子函数初始化状态变量 count 为 0,并返回该变量值。函数 updateCount 更新该状态变量。


TNG-Hooks 函数库还提供了 useReducer、useEffect、useMemo、useCallback 和 useRef 等钩子函数,每个钩子函数抽象了不同的有状态计算或有效计算。


此外,TNG 软件库提供了仿 React Custom Hooks 的 TNG Custom Hooks,用于支持开发人员自定义钩子函数。使用 Custom Hooks,开发人员可通过重用现的有钩子函数去定义自己的钩子函数。TNG Custom Hooks 并非铰接函数,而是标准 JavaScript 函数。铰接函数会在执行中某处调用钩子函数,而 TNG Custom Hooks 必须让自身也在铰接函数中调用。


// useHitCounter定义了一个Custom Hook,而不是一个铰接函数。function useHitCounter() {    // 继承TNG钩子函数的上下文。    var [count,updateCount] = useState(0);    count++;    updateCount(count);    return count;}
// 两次铰接到TNG(..),每次均为点击按钮句柄(handler)。function onClick(evt) { // 使用Custom Hook。 var hitCount = useHitCounter(); console.log(console.log(`Button #${evt.target.id}: ${hitCount}`);}
var fooBtn = document.getElementById("foo-btn");var barBtn = document.getElementById("bar-btn");
// 每个点击句柄都是铰接的`onClick()`。fooBtn.addEventListener("click",TNG(onClick),false);barBtn.addEventListener("click",TNG(onClick),false);
复制代码


上例展示的 Custom Hook 函数 useHitCounter 并非铰接函数,它重用了给定的钩子函数 useState。useHitCounter 本身被 onClick 调用,而 onClick 是一个铰接函数。fooBtn 和 barBtn 分别重用了同一自定义的有状态逻辑 useHitCounter,该逻辑嵌在 onClick 事件句柄中。


TNG Hooks 虽然参考了 React 项目,但它是一个全新的项目。TNG-Hooks 软件库的作者 Kyle Simpson 给出了如下阐述:


TNG Hooks 具有自身考虑和特定行为,它是一个独立项目。未来,TNG 将继续保持与 React Hooks 的相似风格,但也会保持适当差异。


与 React Hooks 一样,铰接函数和钩子函数必须遵守一些调用规则。当前,并没有任何强制执行上述规则的机制,开发人员在违反规则时也不会给出警告,这可能会导致一些出错行为难以调试。此外,React Hooks 是一种全新的实验性技术,还没决定哪些该做哪些不做。尽管 TNG Hooks 考虑到了 React Hooks 的一些经验教训,但还需要做更多测试以验证其最佳实践和存在的陷阱。


TNG Hooks 支持通过 tng-hooks npm package 安装,据该软件包宣称,其测试代码覆盖率达 100%。TNG Hooks 以 MIT 许可开源发布,开发者可通过 TNG-Hooks 的 GitHub 项目页面给出反馈和贡献。


查看英文原文: TNG-Hooks: Reuse and Compose Stateful, Effectful Logic within Regular Functions


会议推荐


2019 年 6 月,GMTC 全球大前端技术大会 2019 即将到来。小程序、Flutter、移动 AI、工程化、性能优化…大前端的下一站在哪里?点击下图了解更多详情。



2019-02-19 07:303100
用户头像

发布了 391 篇内容, 共 151.6 次阅读, 收获喜欢 257 次。

关注

评论

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

Omi NTFS磁盘管理 支持在 Mac 上修复和格式化 NTFS 磁盘

Rose

NTFS Disk by Omi NTFS NTFS 磁盘管理器 ntfs

阿里Dubbo技术负责人准备的源码教程,很有大厂风格

Java dubbo

代码注释的艺术,优秀代码真的不需要注释吗?

阿里技术

代码注释

技术领先、“忠”于业务,用友走出多维数据库的价值之路

用友BIP

增强型语言模型——走向通用智能的道路?

百度Geek说

人工智能 机器学习 语言模型 企业号 5 月 PK 榜

ElasticSearch中文分词和模糊查询

北桥苏

php elasticsearch thinkphp

已有多人中招:这张特殊二维码可致微信闪退,还会进入安全模式

Rose

微信防撤回 微信下载 微信小助手 微信闪退

适用于Mac的七款最佳高清音乐播放器,专为发烧友而生!

Rose

iTunes mac音乐播放器 苹果系统 音乐软件

2步打通ModelArts和Astro,实现AI应用快速落地

华为云开发者联盟

人工智能 低代码 华为云 华为云开发者联盟 企业号 5 月 PK 榜

从零开始打造一款基于SpringBoot+SpringCloud的后台权限管理系统

Java Spring Cloud Spring Boot 权限管理

发布会实录|悠易科技CTO李旸:洞察新引擎 品牌新增长

游读分享

精准测试之过程与实践 | 京东云技术团队

京东科技开发者

精准测试 质量保障 企业号 5 月 PK 榜

需求梳理会开2天是否合理?

BY林子

软件质量 需求分析 需求工程师 需求梳理

好的索引当然是要覆盖了!

江南一点雨

MySQL 数据库

Django-Vue-Admin基于django+vue前后端分离开箱即用框架

巨梦科技

django Vue

华为研究院19级研究员几年心得终成趣谈网络协议文档,附大牛讲解

Java 计算机网络 网络协议

美团太细了!HashMap可以存null,ConcurrentHashMap不可以为什么

Java你猿哥

Java hashmap ssm

中国开源未来发展峰会“问道 AI 分论坛”即将开幕!

kk-OSC

峰会

不同设备如何统一语言编程平台高效开发?本文为你揭秘

HarmonyOS开发者

HarmonyOS

苹果Mac电脑安装AutoCAD 2024卡死无响应,怎么办

Rose

cad AutoCAD 2024 Mac版 AutoCAD 2024下载 无响应

Java 网络编程详解

timerring

Java

被 ChatGPT 点燃的向量数据库们

Bytebase

人工智能 数据库 openai AIGC ChatGPT

最具有中国特色的微服务组件!阿里新一代SpringCloud学习指南

Java 架构 微服务 Spring Cloud spring cloud alibaba

适用于ARM的Linux系统镜像资源+安装教程

Rose

Linux Mac Parallels Desktop 虚拟机 系统镜像

携手共赢 HashData亮相华为合作伙伴大会

酷克数据HashData

数字人是否能成为企业智能化的门户?

Onegun

人工智能 数字人

ThottleStop 软件的应用场景

汪子熙

cpu intel 三周年连更

一顿饭的事儿,搞懂了Linux5种IO模型

Java你猿哥

Java Linux 后端 ssm io

真香!阿里P8微服务实战心得首次公开,涵盖架构设计所有知识点

Java你猿哥

Java 架构 微服务架构 架构设计 架构师

主网NFT铸造交易商城dapp系统开发搭建

开发v-hkkf5566

TNG-Hooks:有状态逻辑在标准函数中的重用和组合_语言 & 开发_Bruno Couriol_InfoQ精选文章