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

如何在不使用其他Hook的情况下用setTimeout更新Zustand状态?

解决Zustand中用setTimeout更新状态的问题

你的代码存在两个关键问题:

  • 在set的回调函数里提前执行了return,导致后续的setTimeout代码完全没有机会运行
  • setTimeout内部的return没有任何作用,因为异步回调的返回值不会被Zustand的set方法处理

下面是可行的解决方案,不需要依赖额外Hook:

基础实现

直接在onAction方法中先同步更新状态为true,再通过setTimeout异步调用set方法将状态重置为false:

const useCustom = create(set => ({
  isAction: false,
  onAction: () => {
    set({ isAction: true });
    setTimeout(() => {
      set({ isAction: false });
    }, 100);
  },
}));

处理竞态问题(可选)

如果存在短时间内多次调用onAction的场景,可以添加定时器清理逻辑,避免旧的定时器覆盖新状态:

const useCustom = create(set => {
  let timerId = null;
  
  return {
    isAction: false,
    onAction: () => {
      // 清除上一次未执行的定时器
      if (timerId) clearTimeout(timerId);
      
      set({ isAction: true });
      timerId = setTimeout(() => {
        set({ isAction: false });
        timerId = null;
      }, 100);
    },
  };
});

内容的提问来源于stack exchange,提问作者Riky Andreas

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 12:52:09