gio*_*gim 8 javascript reactjs
我想这是因为JS的工作原理,但是我想的类不会遇到这个问题。在此代码中:
let [open, setOpen] = React.useState(false);
let [counter, setCounter] = React.useState(0);
function handleClick() {
setOpen(true);
setInterval(() => {
console.log(counter);
setCounter(counter + 1);
}, 2000);
}
Run Code Online (Sandbox Code Playgroud)
如果我一次调用handleClick (例如,单击按钮),则控制台上登录的值始终为0(尽管每次都会更新状态)。
这可能是由于关闭。但是,如果我想查看counter
此类设置的最新值怎么办?使用类,您可以完成任务this.state.counter
,并且它将读取最新值。挂钩是否有解决方法?
演示。
我发现这个问题基本相同。不知何故,我在最初的搜索中没有遇到它。
检查下一个示例,请参阅setState
反应文档。
export default function SimpleSnackbar() {
const classes = useStyles();
let [open, setOpen] = React.useState(false);
let [, setCounter] = React.useState(0);
// Save reference for clearing the interval
// in your case you firing an interval on every click
const lastInterval = useRef();
// Side effect on `open` change.
useEffect(() => {
if (lastInterval.current) clearInterval(lastInterval.current);
if (open) {
lastInterval.current = setInterval(() => {
// Functional setState
setCounter(prevCounterValue => {
console.log(prevCounterValue);
return prevCounterValue + 1;
});
}, 1000);
}
}, [open]);
function handleClick() {
setOpen(true);
}
function handleClose(event, reason) {
if (reason === 'clickaway') {
return;
}
setOpen(false);
}
...
}
Run Code Online (Sandbox Code Playgroud)