【发布时间】:2019-06-21 04:28:11
【问题描述】:
我正在尝试使用新的 React Hooks 功能,但遇到了一点问题。
我有一个useEffect,它调用setInterval,它会更新本地状态。像这样:
const [counter, setCounter] = React.useState(0);
React.useEffect(() => {
const k = setInterval(() => {
setCounter(counter + 1);
}, 1000);
return () => clearInterval(k);
}, []);
return (
<div>Counter via state: {counter}<br/></div>
);
它不能正常工作,因为计数器在第一次调用时被捕获,因此计数器停留在 1 值。
如果我使用 refs,则更新 ref,但不会调用重新渲染(在 UI 中只会看到 0 值):
const counterRef = React.useRef(0);
React.useEffect(() => {
const k = setInterval(() => {
counterRef.current += 1;
}, 1000);
return () => clearInterval(k);
}, []);
return (
<div>Counter via ref: {counterRef.current}</div>
);
我可以通过组合它们来制作我想要的东西,但它看起来确实不对:
const [counter, setCounter] = React.useState(0);
const counterRef = React.useRef(0);
React.useEffect(() => {
const k = setInterval(() => {
setCounter(counterRef.current + 1);
counterRef.current += 1;
}, 1000);
return () => clearInterval(k);
}, []);
return (
<div>Counter via both: {counter}</div>
);
你能告诉谁用钩子正确处理这种情况吗?
【问题讨论】:
-
@estus 是的,原来它是重复的。我最初的问题不包含 setInterval,在这里我添加它只是为了做一个简单的例子,但最终问题是一样的。
标签: reactjs react-hooks