useState 非瞬时更新中断函数
useState non-instantaneous updates break function
我有一个 sumButtonsDict
存储对象字典的状态变量。我还构建了一个简单的 addSumButton()
函数,将一个新对象添加到 sumButtonsDict
:
const [sumButtonsDict, setSumButtonsDict] = useState({})
function addSumButton(sum) {
const dictKey = Object.keys(sumButtonsDict).length
const sumButtonDict = {
sum: sum,
isActive: false
}
setSumButtonsDict(prevState => ({...prevState, [dictKey]: sumButtonDict}))
}
如您所见,该函数将每个新字典项目存储在与其所在索引相对应的键中(例如,第一项的键为 0,第二项的键为 1...),但正确的键是源自 sumButtonsDict
.
中已经存在的对象的计数
安装组件时,我使用以下方法添加了 5 个新按钮:
useEffect(() => {
addSumButton(10)
addSumButton(25)
addSumButton(50)
addSumButton(100)
addSumButton(250)
}, [])
但最终只有 1 个存在于 sumButtonsDict
中。我怀疑这是因为 setState()
没有立即更新状态变量,因此当我调用 Object.keys(sumButtonsDict).length
它继续返回 0
即使 addSumButton()
有 运行之前多次。
我该如何解决这个问题?
您已经在使用 setSumButtonsDict
的函数版本来获取之前的状态,这是正确的做法。您只需要将其他代码也移到函数中,因此整个计算使用 prevState
:
function addSumButton(sum) {
setSumButtonsDict(prevState => {
const dictKey = Object.keys(prevState).length;
const sumButtonDict = {
sum: sum,
active: false,
}
return {...prevState, [dictKey]: sumButtonDict}
});
}
我有一个 sumButtonsDict
存储对象字典的状态变量。我还构建了一个简单的 addSumButton()
函数,将一个新对象添加到 sumButtonsDict
:
const [sumButtonsDict, setSumButtonsDict] = useState({})
function addSumButton(sum) {
const dictKey = Object.keys(sumButtonsDict).length
const sumButtonDict = {
sum: sum,
isActive: false
}
setSumButtonsDict(prevState => ({...prevState, [dictKey]: sumButtonDict}))
}
如您所见,该函数将每个新字典项目存储在与其所在索引相对应的键中(例如,第一项的键为 0,第二项的键为 1...),但正确的键是源自 sumButtonsDict
.
安装组件时,我使用以下方法添加了 5 个新按钮:
useEffect(() => {
addSumButton(10)
addSumButton(25)
addSumButton(50)
addSumButton(100)
addSumButton(250)
}, [])
但最终只有 1 个存在于 sumButtonsDict
中。我怀疑这是因为 setState()
没有立即更新状态变量,因此当我调用 Object.keys(sumButtonsDict).length
它继续返回 0
即使 addSumButton()
有 运行之前多次。
我该如何解决这个问题?
您已经在使用 setSumButtonsDict
的函数版本来获取之前的状态,这是正确的做法。您只需要将其他代码也移到函数中,因此整个计算使用 prevState
:
function addSumButton(sum) {
setSumButtonsDict(prevState => {
const dictKey = Object.keys(prevState).length;
const sumButtonDict = {
sum: sum,
active: false,
}
return {...prevState, [dictKey]: sumButtonDict}
});
}