复选框状态未在现场更新
checkbox state is not updating on spot
保存后,我想根据复选框是否被勾选来继续执行一个功能。如果已勾选复选框,函数应继续保存,否则应显示需要选中复选框的警告。
但是,我的功能不起作用。我注意到,如果我 console.log 来自状态的复选框布尔值,则在我调用函数时状态没有更新。
const [checkBoxTick, setCheckBoxTick] = useState(false);
const [checkBoxError, setCheckBoxError] = useState(false);
const onSave = useCallback(async () => {
console.log(checkBoxTick);
if (checkBoxTick) {
*** go ahead and save ****
} else {
setCheckBoxError(true);
}
}, []);
<Checkbox
label="text here"
helperText="This field is required"
error={checkBoxError}
onChange={() => setCheckBoxTick(!checkBoxTick)}
/>
<Button color="primary" size="small" onClick={onSave}>
Save
</Button>
当我选中复选框(将 checkBoxTick 的状态更改为 true)并按下按钮时,该函数被调用,但 checkBoxTick 的状态为 false,尽管它应该为 true。
我知道这是一个常见的状态问题,整个互联网都在推荐使用 useEffect(),但我不知道如何在我的案例中使用它。
非常感谢任何帮助:)
提前致谢。
UseCallback 正在记录 checkBoxTick
的状态。您需要将变量作为依赖项传递给 useCallback,以便它得到更新,如下所示:
const onSave = useCallback(async () => {
console.log(checkBoxTick);
if (checkBoxTick) {
*** go ahead and save ****
} else {
setCheckBoxError(true);
}
}, [checkBoxTick]);
保存后,我想根据复选框是否被勾选来继续执行一个功能。如果已勾选复选框,函数应继续保存,否则应显示需要选中复选框的警告。
但是,我的功能不起作用。我注意到,如果我 console.log 来自状态的复选框布尔值,则在我调用函数时状态没有更新。
const [checkBoxTick, setCheckBoxTick] = useState(false);
const [checkBoxError, setCheckBoxError] = useState(false);
const onSave = useCallback(async () => {
console.log(checkBoxTick);
if (checkBoxTick) {
*** go ahead and save ****
} else {
setCheckBoxError(true);
}
}, []);
<Checkbox
label="text here"
helperText="This field is required"
error={checkBoxError}
onChange={() => setCheckBoxTick(!checkBoxTick)}
/>
<Button color="primary" size="small" onClick={onSave}>
Save
</Button>
当我选中复选框(将 checkBoxTick 的状态更改为 true)并按下按钮时,该函数被调用,但 checkBoxTick 的状态为 false,尽管它应该为 true。
我知道这是一个常见的状态问题,整个互联网都在推荐使用 useEffect(),但我不知道如何在我的案例中使用它。
非常感谢任何帮助:)
提前致谢。
UseCallback 正在记录 checkBoxTick
的状态。您需要将变量作为依赖项传递给 useCallback,以便它得到更新,如下所示:
const onSave = useCallback(async () => {
console.log(checkBoxTick);
if (checkBoxTick) {
*** go ahead and save ****
} else {
setCheckBoxError(true);
}
}, [checkBoxTick]);