写点什么

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:303174
用户头像

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

关注

评论

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

OAuth/OpenID Connect 渗透测试完全指南

qife122

网络安全 Oauth

工业管理 团队建设经验总结(5)

万里无云万里天

团队建设 工业 工厂运维

为何底层数据湖决定了 AI Agent 的上限?

字节跳动数据平台

Dify 企业版 3.2.0 重磅发布:开启智能应用构建新纪元!

伊克罗德信息科技

从零开始:手把手教你在 AskTable 中连接和管理数据源

察言观数 AskTable

数据库 大数据 数据分析 数据管理

java遍历hdfs路径信息,报错EOFException

刘大猫

人工智能 云计算 大数据 算法 物联网

追觅的想象空间:以技术为翼,向生态无垠

慢点科技SlowTech

代码·创想·未来——百度文心快码创意探索Meetup来啦

Comate编码助手

工程师 AI 编程 文心快码 AI编程助手

征程 6 | BPU trace 简介与实操

地平线开发者

自动驾驶; 算法工具链 地平线征程6

在VS Code IDE中通过LocalStack集成加速无服务器测试

qife122

AWS LocalStack

用了天润融通AI之后才知道,原来以前的客服真苦

天润融通

ECRobot 深耕 AI 应用场景落地!伊克罗德信息成功签约两大行业标杆客户

伊克罗德信息科技

云栖实录 | 从多模态数据到 Physical AI,PAI 助力客户快速启动 Physical AI 实践

阿里云大数据AI技术

阿里云 nvidia PAI

AI Coding实现X2SeaTunnel的设计、开发与落地

白鲸开源

大数据 开源 数据同步 Apache SeaTunnel AI编程

全国独家线下面授 | 大规模敏捷LeSS认证上海12月18-20日【报名享多重福利优惠】

ShineScrum

LeSS认证 CLP认证 LeSS认证实践者

吃透 DolphinScheduler 负载均衡:3 大核心算法 + 底层逻辑全解析

白鲸开源

大数据 开源 算法 Apache DolphinScheduler 数据调度

语音识别技术实战:从iOS到GPT的优化之路

qife122

自然语言处理 语音识别

“全球金牌课程”11月08-09日·上海线下·CSM认证【提前报名特惠

ShineScrum

Scrum Master CSM CSM认证 CSM认证培训

FastDFS 可观测性最佳实践

观测云

fastdfs

英特尔联动「扣子 AI 工坊」启动高校计划——让校园创意一键开挂

新消费日报

传帮带 人才梯队建设经验总结(13)

万里无云万里天

人才培养 工业 工厂运维

利用Next.js中间件漏洞实现SSRF攻击与RCE

qife122

SSRF 漏洞挖掘

敏捷VMO:打通战略到成果的桥梁,驱动企业规模化敏捷转型

ShineScrum

敏捷 PMO VMO

新兴数据湖仓手册·从分层架构到数据湖仓架构(2025):数据仓库分层的概念与设计

白鲸开源

大数据 数据仓库 数据湖 白鲸开源 WhaleStudio

在AI技术快速实现创意的时代,挖掘邮件营销系统新需求成为关键突破点

qife122

开源项目 需求分析

SpringBoot 3.x 集成 Flowable 7.x:流程设计、部署、启动及完成实战

Geek_e3e86e

编程 java面试

商城程序搭建B2B2C平台的物流轨迹信息展示之在途监控API

快递鸟

“一切皆文件”:揭秘LINUX I/O与虚拟内存的底层设计哲学

poemyang

Linux RPC I/O模型

金融级稳定性:ETLCloud如何保障千万级数据的准确同步

谷云科技RestCloud

kettle 数据传输 数据同步 ETL 数据集成工具

DolphinScheduler 3.1.9 单机版重启后,项目、流程定义等数据全部丢失

白鲸开源

大数据 开源 Apache DolphinScheduler 工作流任务调度

高性能智算网关打通 GPU 集群与 AI 存储高速链路,硬件成本直降 95%

Baidu AICLOUD

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