[React] 求助: react hooks zustand setTimeout

6 min read

zustand store 中存储了一个 timer 保存计时器

dataMap[id] = {
...
timer
...
}

useBus(
type,
()=>{
...
updateTime()
...
}
)

updateTime = (id) => {
console.log(dataMap[id].timer) --------- ( 1 )
clearTimeout(dataMap[id].timer)
const timer = setTimeout(()=>{
...
}, 1000)
store.updateDataMap(id, timer)
}

store.updateDataMap: (id, timer) => set((data)=>{
data[id].timer = timer
return data
})

发现每次( 1 )处打印的都是第一次的 timer, 后面的 updateDataMap 似乎没有起作用

求助

问题出在哪里?

问题可能出在 updateDataMap 函数中。set 函数在更新数据时,会创建一个新的数据对象。因此,更新 data[id].timer 只是在新的数据对象上进行了操作,而原始的 dataMap 对象并没有发生变化。

解决方法是,使用 immer 库来更新数据,以便更方便地进行不可变性操作。例如:

store.updateDataMap: (id, timer) => set((data)=>{
return produce(data, draft => {
draft[id].timer = timer
})
})

这样,就可以确保更新后的数据对象被正确地存储到 zustand store 中,从而确保 setTimeout 函数的正确执行。