Hooks
Hooks 模块是 Claude Code 的 React Hooks 生态系统,包含 80+ 个自定义 Hook 和 2 个子目录(notifs/、toolPermission/)。Hooks 覆盖六大领域:AI 交互(useAssistantHistory、useCancelRequest、useMainLoopModel)、IDE 集成(useIDEIntegration、useIdeConnectionStatus、useDiffInIDE)、输入处理(useTextInput、useVimInput、usePasteHandler、useInputBuffer)、语音交互(useVoice、useVoiceEnabled、useVoiceIntegration)、任务管理(useTasksV2、useTaskListWatcher、useScheduledTasks)、以及 UI 状态(useVirtualScroll、useTerminalSize、useBlink、useElapsedTime)。每个 Hook 封装一个独立的副作用域。
职责与设计理念
职责说明
80+ 个 React Hooks 库,覆盖 AI 交互、IDE 集成、语音、任务等全场景
设计理念
Hook 即副作用边界——每个 Hook 封装一个独立的副作用域(网络请求、事件监听、定时器),组件通过组合 Hooks 而非继承来获得能力。80+ Hooks 不是碎片化,而是关注点分离的极致体现。
架构决策
为什么 80+ Hooks 不合并为更少的"超级 Hook"?
每个 Hook 封装一个独立的副作用域
合并 Hook 会导致不需要语音功能的组件也加载语音相关的副作用。独立 Hook 让组件按需组合,未使用的 Hook 不会产生任何运行时开销。这是 React Hooks 设计哲学的忠实实践。
文件清单
| 文件名 | 用途 |
|---|---|
| useTextInput.ts | 文本输入 Hook,管理多行编辑、光标位置和输入缓冲 |
| useVirtualScroll.ts | 虚拟滚动 Hook,实现大列表的高性能渲染 |
| useIDEIntegration.tsx | IDE 集成 Hook,管理与 VS Code 等编辑器的双向通信 |
| useVoiceIntegration.tsx | 语音集成 Hook,管理语音输入的录音、转写和提交 |
| useCommandKeybindings.tsx | 命令快捷键 Hook,将快捷键事件路由到命令处理器 |
| useGlobalKeybindings.tsx | 全局快捷键 Hook,处理应用级快捷键(ctrl+c/d/l 等) |
| useSwarmInitialization.ts | Swarm 初始化 Hook,管理多 Agent 集群的启动 |
| toolPermission/ | 工具权限 Hooks 目录,管理工具执行的授权状态 |
使用场景
useIDEIntegration 监听 IDE 选区变化,自动将选中代码作为上下文
useVoiceIntegration 管理录音 → 转写 → 提交的完整流程
麦克风 → useVoice 录音 → 转写 API → useTextInput 填充 → 提交
依赖关系
- Context — 9 个 React Context Provider,管理 UI 层的全局状态分发
- Ink — 深度定制的终端渲染引擎,基于 Yoga 布局 + React Reconciler 实现终端 UI
- Keybindings — 可定制快捷键系统,支持多上下文、和弦组合与平台适配
关键代码片段
IDE 集成 Hook
function useIDEIntegration() {
const [connectionStatus] = useIdeConnectionStatus()
const [selection] = useIdeSelection()
useEffect(() => {
const unsub = onIdeFileChange((file) => {
// 同步文件状态到 Claude Code
})
return unsub
}, [])
return {
isConnected: connectionStatus === 'connected',
selectedText: selection?.text,
openFile: (path) => sendToIde('openFile', { path }),
showDiff: (diff) => sendToIde('showDiff', { diff }),
}
} 双向通信:监听 IDE 事件 + 向 IDE 发送命令,实现编辑器深度集成
虚拟滚动 Hook
function useVirtualScroll(items: unknown[], itemHeight: number) {
const [scrollTop, setScrollTop] = useState(0)
const terminalHeight = useTerminalSize().rows
const visibleRange = useMemo(() => {
const start = Math.floor(scrollTop / itemHeight)
const end = Math.min(
start + Math.ceil(terminalHeight / itemHeight) + 1,
items.length
)
return { start, end }
}, [scrollTop, terminalHeight, items.length])
// 只渲染可视区域内的项目
return { visibleItems: items.slice(visibleRange.start, visibleRange.end) }
} 只渲染可视区域内的项目,支持数千条消息的流畅滚动
技术笔记
虚拟滚动优化
useVirtualScroll 只渲染可视区域 ± 1 行的缓冲区,滚动时通过 translateY 偏移模拟完整列表,避免渲染数千个 DOM 节点。