You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

react-redux状态更新后在useHotkeys回调中未同步返回最新值问题

问题原因

你遇到的是典型的React闭包陷阱问题:

  • useHotkeys 绑定回调函数时,会捕获当前渲染闭包中的变量值。你没有给 useHotkeys 传入依赖项,因此回调始终引用首次渲染时的旧 modeData,不会随Redux状态更新自动刷新。
  • useEffect 可以正常打印最新值,是因为你显式将 modeData 加入了依赖数组,每次 modeData 变化时都会重新执行,拿到的是当前最新的状态。

解决方案

方案1:给useHotkeys添加依赖数组

useHotkeys 支持第四个参数作为依赖项,把用到的modeData加入依赖即可,每次modeData更新时回调会自动重建,拿到最新状态:

// 第三个参数是配置项,不需要的话传空对象即可
useHotkeys("ctrl+l", () => handler("Clone"), {}, [modeData]);

方案2:用useRef存储最新状态(不需要修改useHotkeys依赖)

如果不想频繁重建hotkeys监听,可以用ref缓存最新的modeData,避免闭包问题:

const modeData = useSelector((state) => state.mode.modeData);
// 新增ref缓存最新值
const modeDataRef = useRef(modeData);
// 每次modeData更新时同步到ref
useEffect(() => {
  modeDataRef.current = modeData;
}, [modeData]);

const handler = (id) => {
  // 从ref读最新值,永远不会过时
  const isActive = modeDataRef.current.find((x) => x.id === id).active;
  console.log(modeDataRef.current);
  dispatch(modeDataIncrement(id));
};

// 这里不需要加依赖了
useHotkeys("ctrl+l", () => handler("Clone"));

额外说明

你的modeSlice代码是符合Redux Toolkit规范的,Immer会处理直接修改状态的逻辑,不需要额外调整。

内容的提问来源于stack exchange,提问作者Ambika M

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 07:45:05