【发布时间】:2019-11-06 22:53:23
【问题描述】:
我正在尝试关注 react-plugin-react-hooks。
我有一个useEffect,它向window (onScroll) 添加了一个事件监听器。 onScroll 使用window.pageYOffset。
function onScroll() {
if (window.pageYOffset > 0) {
setFoor(bar)
} else {
setFoor(baz)
}
}
现在在useEffect 我有:
useEffect(() => {
window.addEventListener('scroll', onScroll);
onScroll();
return () => {
window.removeEventListener('scroll', onScroll);
};
}, []);
这遵循了最初支持的建议,即如果您传递一个空的依赖数组,它就像componentDidMount。但是 React 文档明确说你应该不传递依赖项(甚至不传递空数组),或者传递所有依赖项(引用 props 或 state)。 (https://reactjs.org/docs/hooks-faq.html#is-it-safe-to-omit-functions-from-the-list-of-dependencies) 所以看起来像:
useEffect(() => {
window.addEventListener('scroll', onScroll);
onScroll();
return () => {
window.removeEventListener('scroll', onScroll);
};
}, [onsScroll]);
但这意味着我必须将useCallback 用于onScroll,否则它将始终具有不同的依赖性。但是useCallback 对onScroll 的“依赖”将是window.pageYOffset,但这不起作用,即:
function onScroll = React.useCallback(() => {
if (window.pageYOffset > 0) {
setFoor(bar)
} else {
setFoor(baz)
}
}, [window.pageYOffset])
我的一般问题是,您如何处理具有外部依赖关系的 useEffect/useCallback 函数? (除了忽略警告。)
谢谢
我还尝试将 onScroll 定义完全移动到 useEffect 内,但它没有正确更新。
useEffect(() => {
function onScroll() {
if (window.pageYOffset > 0 && !slim) {
setSlim(true);
} else {
setSlim(false);
}
}
window.addEventListener('scroll', onScroll, onScrollOptions);
onScroll();
getAccountAction();
return () => {
window.removeEventListener('scroll', onScroll, onScrollOptions);
};
}, []);
【问题讨论】:
标签: reactjs react-hooks