私は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ライフサイクルメソッドを使用して、イベントバインディングを作成および削除する必要があります。これにより、コンポーネント内で自己完結し、それを使用するコンポーネントがマウント解除された場合にイベントバインディングが確実に削除されるため、リークが発生しなくなります。