什么是钩子(Hook)?一文搞懂它到底干什么用的

你是否在代码里看到过 onMounted()onClick()createEventHook() 这类奇怪的函数名?它们都是“钩子”。但——钩子到底是个啥?为什么要用?你能不能自己写一个?

今天我们来彻底搞懂它。


🪝 什么是钩子?

“钩子”(Hook)是程序运行时预留的可扩展接口,让你可以在某个特定时机“钩住”程序的流程,插入自己的逻辑

换句话说:

钩子 = 某个事件发生时,可以“挂”上你自己的函数,让它一起执行。


🎯 一个生活中的比喻

设想你买了个智能门铃。它支持“当门被打开时,自动播放你录的欢迎语”。

  • “门打开”是系统事件
  • “播放欢迎语”是你注册的逻辑
  • “那个播放的接口”就是钩子

你没有改动门本身的代码,但通过“钩子”就扩展出了新功能。


🛠️ 编程中的钩子常见在哪?

钩子几乎无处不在。比如:

场景钩子名作用
VueonMounted()组件挂载完成时调用
ReactuseEffect()状态更新时响应
Expressapp.use()请求进入中间件前挂钩处理
Node.jsprocess.on('exit', fn)程序退出前处理
Linux 内核kprobe跟踪系统调用

🔄 举个代码例子(VueUse)

import { createEventHook } from '@vueuse/core'

const loginSuccessHook = createEventHook<string>()

// 注册钩子回调
loginSuccessHook.on((username) => {
  console.log(`欢迎用户:${username}`)
})

// 某处登录成功时触发
loginSuccessHook.trigger('liuweiqing')

这段代码说明了钩子的三个核心要素:

  1. 创建钩子createEventHook()
  2. 注册回调hook.on(fn)
  3. 触发钩子hook.trigger(payload)

🧠 钩子机制的好处

  • 解耦逻辑:你不需要在主流程硬编码行为
  • 方便扩展:未来只需注册更多回调即可
  • 插件架构基石:几乎所有插件系统都靠 hook 实现

🧩 你也可以自己写个钩子系统

function createSimpleHook() {
  const fns = []
  return {
    on(fn) {
      fns.push(fn)
    },
    trigger(...args) {
      fns.forEach(fn => fn(...args))
    }
  }
}

就这么几行代码,你就实现了一个简单的事件钩子系统。


✅ 总结一句话

钩子是一种“在程序运行到某个节点时,自动执行你注册的函数”的机制。

用得好,它能让你的代码结构更清晰、逻辑更解耦、功能更灵活。


如果你用的是 Vue、React、Node.js、ESP32、Arduino 或其他框架,只要看到 onXXX()useXXX().hook() 等函数名,都可以大胆猜它是一个钩子!


需要我补充对应框架的钩子例子(比如 Vue 生命周期、Node.js 事件)或生成一份图文教程,也可以告诉我,我帮你继续整理。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐