我在函数组件中有以下钩子。
useEffect(() => {
if (isMinimized) {
// When minimizing, delay swapping the element to the minimized node.
// This gives the video takeover minimize animation time to run and results
// in a more seamless looking video swap
if (videoMinimizedRef.current !== null) {
setTimeout(() => {
setOuterContainer(minimizedVideoRef.current);
}, VIDEO_OVERLAY_VIDEO_ELEMENT_SWAP_TIMEOUT);
}
} else {
// When maximizing, immediately swap the video element to the maximized
// node. This ensures the video element is present at the start of the animation.
if (videoMaximizedCallbackRef !== null) {
setOuterContainer(videoMaximizedCallbackRef);
}
}
}, [isMinimized, setOuterContainer, videoMinimizedRef, videoMaximizedCallbackRef]);
isMinimized, setOuterContainer, videoMinimizedRef都是传递给组件的道具。
isMinimized是一个布尔值setOuterContainer是一个 useState setter 函数,它接收一个 HTMLElement 并将其设置为正在播放的视频元素的新父节点。videoMinimizedRef是最小化播放时对视频容器的引用。
videoMaximizedCallbackRef.current是在此组件中设置的回调 ref(没有)。
钩子按原样工作,完全符合我的要求。也就是说,我意识到这个钩子有一些问题(至少从阅读 React 钩子文档和常见问题解答看来是这样)。例如,没有清理 setTimeout。可以这样添加:
useEffect(() => {
let timeout;
if (isMinimized) {
// When minimizing, delay swapping the element to the minimized node.
// This gives the video takeover minimize animation time to run and results
// in a more seamless looking video swap
if (videoMinimizedRef.current !== null) {
timeout = setTimeout(() => {
setOuterContainer(minimizedVideoRef.current);
}, VIDEO_OVERLAY_VIDEO_ELEMENT_SWAP_TIMEOUT);
}
} else {
// When maximizing, immediately swap the video element to the maximized
// node. This ensures the video element is present at the start of the maximize animation.
if (videoMaximizedCallbackRef !== null) {
setOuterContainer(videoMaximizedCallbackRef);
}
}
return () => clearTimeout(timeout);
}, [isMinimized, setOuterContainer, videoMinimizedRef, videoMaximizedCallbackRef]);
但是添加它会导致每次任何依赖项更改时都会清除超时。我需要确保超时在启动时永远不会被清除,因为它会导致视频交换在不完全正确之后发生
VIDEO_OVERLAY_VIDEO_ELEMENT_SWAP_TIMEOUT女士,而是
VIDEO_OVERLAY_VIDEO_ELEMENT_SWAP_TIMEOUT + sum of time passed in previous cleared setTimeouts小姐
clearTimeout我怎样才能以一种避免过时闭包和不需要的调用的陷阱的方式编写这个钩子?
我想遵守钩子和详尽依赖项的规则,但这对我来说有点太多了。