【发布时间】:2015-06-25 21:02:11
【问题描述】:
我在 React 中构建了一个组件,它应该在窗口滚动时更新自己的样式以创建视差效果。
组件render 方法如下所示:
function() {
let style = { transform: 'translateY(0px)' };
window.addEventListener('scroll', (event) => {
let scrollTop = event.srcElement.body.scrollTop,
itemTranslate = Math.min(0, scrollTop/3 - 60);
style.transform = 'translateY(' + itemTranslate + 'px)');
});
return (
<div style={style}></div>
);
}
这不起作用,因为 React 不知道组件已更改,因此不会重新渲染组件。
我尝试将itemTranslate 的值存储在组件的状态中,并在滚动回调中调用setState。但是,这会导致滚动无法使用,因为这非常慢。
关于如何做到这一点的任何建议?
【问题讨论】:
-
永远不要在渲染方法中绑定外部事件处理程序。渲染方法(以及您在同一线程中从
render调用的任何其他自定义方法)应该只关注与渲染/更新 React 中的实际 DOM 相关的逻辑。相反,如下面的@AustinGreco 所示,您应该使用给定的 React 生命周期方法来创建和删除您的事件绑定。这使得它在组件内部自成一体,并通过确保在卸载使用它的组件时移除事件绑定来确保不会泄漏。
标签: javascript reactjs