【发布时间】:2020-02-16 19:05:36
【问题描述】:
我正在尝试将一个类组件(一个 Gatsby 布局组件)转换为一个使用反应挂钩来管理状态的功能组件。我的目标是在我们到达页面中的某个点并向上滚动时打开一个模式。
我面临的问题是,我传递给这个布局组件(TrustedInView,见下面的代码)的一个道具正在改变渲染之间的值,正如控制台日志显示的那样。所以我对那里发生的事情感到困惑。我希望 prop 的值始终相同,因为 index.js 中记录的值没有改变(也不应该改变)。
这是布局组件中的代码:
// Hook
const usePrevious = value => {
const ref = useRef();
// Store current value in ref
useEffect(() => {
ref.current = value;
}, [value]); // Only re-run if value changes
// Return previous value (happens before update in useEffect above)
return ref.current;
};
let notOpenedYet = true;
// Layout component
const Layout = ({ intl, children, trustedInView }) => {
const [modalIsOpen, setOpen] = useState(false);
// Get the previous value (was passed into hook on last render)
let prevPosition = usePrevious(window.scrollY);
const handleNavigation = e => {
const custWindow = e.currentTarget;
if (prevPosition > custWindow.scrollY) {
console.log('trustedInView when goes up:', trustedInView);
if (trustedInView && notOpenedYet) {
notOpenedYet = false;
setTimeout(() => setOpen(true), 1500);
}
}
prevPosition = custWindow.scrollY;
};
useEffect(() => {
// Add event listener when component mounts:
window.addEventListener('scroll', e => handleNavigation(e));
// Remove event listener when component unmounts:
return window.removeEventListener('scroll', e => handleNavigation(e));
});
这是带有布局组件的 index.js 渲染方法:
render() {
const { intl } = this.props;
const { activeVideo, tabs, tabNumber, trustedInView } = this.state;
const features = [
// some objects
];
console.log('trustedInView in index :', trustedInView);
return (
<Layout trustedInView={trustedInView}>
这是控制台日志:
I expect the value of the prop to always be the same
谁能让我走上正轨?
【问题讨论】:
-
你能把
index.js的代码贴出来吗? -
如果你希望
useEffect只在挂载上运行,你应该传递[]作为第二个参数。否则,它将在每次渲染时被调用。 -
removeEventListener需要引用相同的监听函数才能工作
标签: javascript reactjs react-hooks