react-redux / react-toolkit有问题。我有一个叫做todos
的状态。此状态正确填充了3个项目,如您在这里看到的:
这是我的todo slice的代码:
import { createSlice } from '@reduxjs/toolkit';
const initialState = {
value: []
};
export const todoSlice = createSlice({
name: 'todos',
initialState,
reducers: {
setTodos: (state, action) => {
state.value = action.payload
},
},
});
export const { setTodos } = todoSlice.actions;
export default todoSlice.reducer;
我正在使用Indexed Db在本地存储todos。因此,我有一个间隔(在我的app.container.js
中有setInterval
,检查todos是否需要重新加载。
function App(props) {
const [interval, setInterval] = useState(null);
const dispatch = useDispatch();
const todos = useSelector((state) => state.todos.value);
const { loadTodos, loadTodosFromIndexedDB } = useTodo();
//...
useEffect(() => {
//...
initializeInterval();
//...
},[]);
async function initializeInterval() {
setInterval(window.setInterval(async () => {
await getTodosFromIndexedDB();
},3000)
);
}
async function getTodosFromIndexedDB() {
let todosFromIndexedDb = await loadTodosFromIndexedDB();
if(todos?.length !== todosFromIndexedDb?.length && !Utils.isNullOrUndefined(todosFromIndexedDb)) {
dispatch(setTodos(todosFromIndexedDb));
}
//...
}
return (
//...
)
}
问题是,在函数getTodosFromIndexedDB()
中,todos
的值类似于初始值todos
的空数组([]
)。
这会导致更新每3秒被触发一次,但此函数中的todos值保持在空数组([]
)上。正在触发的更新提供了正确的3个待办事项:
getTodosFromIndexedDB()
函数中todos
的值不正确是什么原因?这是异步问题还是因为不同的作用域(window.setInterval
)?
2条答案
按热度按时间stszievb1#
在第一次呈现时,您将
getTodosFromIndexedDB
函数注册为一个interval,它作为一个闭包,其作用域是组件执行的变量。你可以使用ref
来解决这个问题:b4wnujal2#
我发布这个作为一个答案,以获得更多的空间,我还没有测试,但我觉得最初todo是一个空数组,当你创建这个函数时,它存储为空数组,每次设置间隔运行时,它使用相同的todo值。这就是为什么它不能工作,但是您可以使用useCallback在每次todos值更改时重新创建这个函数
更新码