在 useEffect 挂钩中反应更新状态数组
React update state array in useEffect hook
我已经阅读了所有关于在 React 数组上设置状态的问题和答案,但 none 似乎解决了我的问题。
我这样初始化我的数组:
const initialStates = {cellStatuses: () =>Array(6).fill(Array(5).fill(status.unguessed)),
}
const [dailyCellStatuses, setDailyCellStatuses] = useLocalStorage('dailyCellStatuses', initialStates.cellStatuses)
const [cellStatuses, setCellStatuses] = useState(initialStates.cellStatuses)
然后我使用一个效果来模仿 componentDidMount 并且在那个效果中我检查是否需要更新 cellStatuses
useEffect (() => {
if (gameMode && playedAlreadyToday(lastPlayedDate)) {
setBoard(dailyBoard)
setCellStatuses(dailyCellStatuses)
console.log(cellStatuses, 'cell statuses')
} else {
setBoard(initialStates.board)
}
控制台始终记录它从未使用我尝试设置的新 dailyCellStatuses 更新的旧状态。
我试过克隆 dailyCellStatuses [...dailyCellStatuses]
我试过在 setter 中调用一个函数
我真的卡住了。求助!
您的状态更新正常,您的问题是您正在控制台记录同一渲染周期中的值,
控制台记录 useEffect 之外的值,或者您可以这样做
if (gameMode && playedAlreadyToday(lastPlayedDate)) {
setBoard(dailyBoard)
setCellStatuses(dailyCellStatuses)
console.log(dailyCellStatuses, 'cell statuses')
} else {
setBoard(initialStates.board)
}
我已经阅读了所有关于在 React 数组上设置状态的问题和答案,但 none 似乎解决了我的问题。
我这样初始化我的数组:
const initialStates = {cellStatuses: () =>Array(6).fill(Array(5).fill(status.unguessed)),
}
const [dailyCellStatuses, setDailyCellStatuses] = useLocalStorage('dailyCellStatuses', initialStates.cellStatuses)
const [cellStatuses, setCellStatuses] = useState(initialStates.cellStatuses)
然后我使用一个效果来模仿 componentDidMount 并且在那个效果中我检查是否需要更新 cellStatuses
useEffect (() => {
if (gameMode && playedAlreadyToday(lastPlayedDate)) {
setBoard(dailyBoard)
setCellStatuses(dailyCellStatuses)
console.log(cellStatuses, 'cell statuses')
} else {
setBoard(initialStates.board)
}
控制台始终记录它从未使用我尝试设置的新 dailyCellStatuses 更新的旧状态。
我试过克隆 dailyCellStatuses [...dailyCellStatuses]
我试过在 setter 中调用一个函数
我真的卡住了。求助!
您的状态更新正常,您的问题是您正在控制台记录同一渲染周期中的值,
控制台记录 useEffect 之外的值,或者您可以这样做
if (gameMode && playedAlreadyToday(lastPlayedDate)) {
setBoard(dailyBoard)
setCellStatuses(dailyCellStatuses)
console.log(dailyCellStatuses, 'cell statuses')
} else {
setBoard(initialStates.board)
}