如何在不使用其他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
相关产品推荐
相关产品推荐

