什么是自定义Hook
面试速答
- 以下内容以 React 18 为准。
- 自定义 Hook 本质上就是 把可复用的状态逻辑抽成一个以
use开头的函数。 - 它复用的是逻辑,不是组件实例本身,也不是多个组件共享同一份私有状态。
为什么要有自定义 Hook
很多逻辑不是 UI 结构复用,而是“状态和副作用模式”复用,比如:
- 监听窗口尺寸
- 请求加载状态
- 表单字段管理
- 防抖搜索
如果每个组件都自己写一遍,重复度很高。
一个简单例子
function useWindowWidth() {
const [width, setWidth] = useState(window.innerWidth)
useEffect(() => {
function handleResize() {
setWidth(window.innerWidth)
}
window.addEventListener('resize', handleResize)
return () => window.removeEventListener('resize', handleResize)
}, [])
return width
}
组件中直接用:
const width = useWindowWidth()
它的本质要讲清
1. 自定义 Hook 不是共享状态单例
每个组件调用 useWindowWidth(),都会拥有自己这一份 Hook 调用链路。
2. 它只是把现有 Hook 组合起来
自定义 Hook 自己不会创造新的 React 底层能力,它依然依赖:
useStateuseEffectuseRef- 其他自定义 Hook
3. 命名必须以 use 开头
这样 React Hook 规则和 ESLint 规则才能正确识别它。
标准答法
问:什么是自定义 Hook?
答:就是把可复用的状态逻辑和副作用逻辑封装成一个以 use 开头的函数,让多个组件复用同样的逻辑组织方式。
问:它复用的是什么?
答:复用的是逻辑,不是组件实例,也不是天然共享同一份状态。
易错点
- 以为多个组件调用同一个自定义 Hook 会自动共享状态。
- 把普通工具函数和自定义 Hook 混为一谈。
- 名字不以
use开头,导致规则失效。
速记要点
- 自定义 Hook = 复用状态逻辑。
- 它由多个内置 Hook 组合而成。
- 复用逻辑,不等于共享状态。