什么是钩子(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
// 注册钩子回调
loginSuccessHook.on((username) => {
console.log(`欢迎用户:${username}`)
})
// 某处登录成功时触发
loginSuccessHook.trigger('liuweiqing')
这段代码说明了钩子的三个核心要素:
创建钩子:createEventHook()注册回调:hook.on(fn)触发钩子: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 事件)或生成一份图文教程,也可以告诉我,我帮你继续整理。