Zustand组件外部调用setState未更新,循环中retry_n始终为0
问题描述
我在store.js中按常规方式定义了Zustand的retryStore:
const retryStore = create(set => ({ retry_n: 0, setGRetry: (retry_n) => set(state => ({ ...state, retry_n, })), })); export { retryStore };
随后在@/utils/get.js文件中尝试在循环内将retry_n的值加1,代码如下:
const retry_n = retryStore.getState().retry_n const xxx = xxxStore.getState().xxx const xxxx = xxxxStore.getState().xxxx var j=0; const maxretry = 20; const myFetch = async () => { try { let url = `...` while(j < maxretry){ console.log('while try n:',j) // 输出1,2,3...等 console.log('get.js retry_n:',retry_n) // 始终输出0 if (isItRetry){ // 此处为TRUE retryStore.setState({ retry_n: retry_n + 1}) console.log('playThis retry_n now:',retry_n) // 始终输出0 }else{ ... } if (a != b){ ... return } j++ } etc...
按预期每次循环retry_n应递增1,但实际始终为0,同文件内其他store用相同方式操作均正常,请问这是什么原因?
问题原因及解决方案
核心原因:你在代码开头把
retryStore.getState().retry_n赋值给了局部常量retry_n,这个值是初始化时读取的固定值,后续循环里一直用这个初始的0来计算更新。哪怕store内部的retry_n已经被修改,这个局部常量也不会自动同步最新值。解决方案:
- 循环内实时读取store值:每次需要使用
retry_n时,直接从store中获取最新状态,而不是依赖开头定义的局部变量:while(j < maxretry){ // 每次循环都获取最新的retry_n const currentRetry = retryStore.getState().retry_n console.log('get.js retry_n:', currentRetry) if (isItRetry){ retryStore.setState({ retry_n: currentRetry + 1}) console.log('playThis retry_n now:', retryStore.getState().retry_n) } // ...其他逻辑 j++ } - 利用store内置的更新方法:你已经定义了
setGRetry,可以直接调用它并传入函数来基于当前state计算新值,这种写法更可靠,避免局部变量的缓存问题:if (isItRetry){ // 传入函数,基于当前state的retry_n计算新值 retryStore.getState().setGRetry(prevRetry => prevRetry + 1) console.log('playThis retry_n now:', retryStore.getState().retry_n) }
- 循环内实时读取store值:每次需要使用
内容的提问来源于stack exchange,提问作者Nathan Bernard
相关产品推荐
相关产品推荐

