作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
使用间隔useInterval
来自 this blog post by Dan Abramov (2019) :
function useInterval(callback, delay) {
const savedCallback = useRef();
// Remember the latest callback.
useEffect(() => {
savedCallback.current = callback;
}, [callback]);
// Set up the interval.
useEffect(() => {
function tick() {
savedCallback.current();
}
if (delay !== null) {
let id = setInterval(tick, delay);
return () => clearInterval(id);
}
}, [delay]);
}
一个潜在的错误
useEffect
之间调用间隔回调。调用,导致调用旧的(因此不是最新的)回调。换句话说,这可能是执行顺序:
callback
的新值. savedCallback.current()
, 不同于 callback
. savedCallback.current = callback;
Render
之间的虚线和
React updates DOM
(提交阶段)很可能是
a mistake .如
this codesandbox演示,您只能在
useLayoutEffect
之后调用间隔回调。或
useEffect
(但不是在渲染阶段之后)。
useLayoutEffect
- 正确,因为状态更改已提交给 DOM。 useEffect
- 不正确,因为旧的间隔回调可能会在此之前触发(在布局效果之后)。 callback
引用。 useEffect
中的不同好的,但真正的问题是
其中哪一个是“正确”的 ?
const [size, setSize] = React.useState();
const onInterval = () => {
console.log(size)
}
useInterval(onInterval, 100);
如果
onInterval
在提交阶段之后但在
useEffect
之前调用,它将打印错误的值。
最佳答案
尽管我理解讨论,但这对我来说似乎不是一个错误。
上面的答案建议在渲染期间更新 ref 将是一个副作用,should be avoided because it will cause problems .
The demo shows that the current callback value may differ from that in useEffect alright, but the real question is which one of them is the "correct" one?
useLayoutEffect
反而。这种效果类型在提交阶段被调用,在 React 修改 DOM 之后但在 React 返回给浏览器之前(也就是没有间隔或计时器可以在其间运行)。
clearInterval
和
setInterval
,整个时间都会中断。)
关于javascript - "official"useInterval 示例中的潜在错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68407187/
我是一名优秀的程序员,十分优秀!