useEffectEvent 用于从 Effect 中提取非响应式逻辑,避免不必要的重执行。

useEffectEvent Hook 详解

useEffectEvent 用于从 Effect 中提取非响应式逻辑,避免不必要的 Effect 重执行。

// 基本语法

const onSomething = useEffectEvent((param) => {
  // 总是能访问最新的 props/state
  // 不会成为 Effect 的依赖
  console.log(someState, param);
});

useEffect(() => {
  connection.on('message', onSomething);
}, [roomId]); // 不包含 onSomething
⚠️ 注意: useEffectEvent 在 React 19.2 中引入, 可能需要从 experimental 导入。本示例使用自定义实现演示概念。

示例 1: 基本概念

连接日志:

收到的消息:

观察: 切换“显示消息通知”不会导致重新连接(连接日志不变), 但通知行为会立即改变。这就是 useEffectEvent 的作用!

示例 2: 有无 useEffectEvent 对比

当前计数

0

❌ 不用 useEffectEvent

0

次 Effect 执行

每次 count 变化都重新设置定时器

✅ 使用 useEffectEvent

0

次 Effect 执行

只设置一次,但回调能访问最新 count

示例 3: 分析日志

Effect 执行次数: 0(只有切换页面才增加)

分析日志:

关键点: 修改用户 ID 不会触发 Effect 重新执行, 但日志中会显示最新的用户 ID。

示例 4: 定时器

10

Effect 执行次数: 0(修改“完成消息”不会重置定时器)

使用指南

✅ 适合使用

  • Effect 中的事件回调
  • 分析/日志记录
  • 定时器完成回调
  • WebSocket 消息处理

❌ 不适合使用

  • 用户交互事件处理
  • 只是消除 ESLint 警告
  • 作为 props 传递给子组件
  • 在渲染中调用