TIL:イベント処理とaddEventListenerメソッド(feat:元のプリロードサポートの難題)
6604 ワード
reactでaddEventListenerにドキュメントをバインドした場合、どうなりますか?
MouseDownイベントが発生すると、ドキュメントにmousemoveハンドルがバインドされます.mousemoveイベントは、removeEventListenerとして適切なタイミングで無効にする必要があります.そうでないと、明らかに何気ない瞬間にHandlerが実行され、プログラムが意外に実行されます.
以下のコンポーネントは、swife機能を持つKeroselの例です.次のコードを見て、mousemoveイベントはswifeハンドルをバインドします.私がさっき言ったように、適切なタイミングでハンドルを閉じないと、swape機能が何気なく起動し、スライドがマウスに従います.リリースした葉巻はsweeEndが動いた瞬間、mouseUp、mouseLeaveイベントが動いた時です.
mouseUpイベントはulラベルにバインドされているため、その外部領域では発生しません.この問題により、Leaveイベントはバインド解除を実現したが、swapeStart Handlerはコードでバインド解除されたが、解除されず、スライドはマウスに従ったことが明らかになった.コンソールでmouseupイベントが発生した瞬間
「end」の文字が印刷されますこれは上のコードには表示されませんが、removeEventListener(「mousemove」、swape Start)と考えられます.
removeEventListerは、ユーザ効果を達成するために適切な時間に実行することができる.でもいつ消すの? レンダリングの発生時に消去する必要があります. mouseUp,mouseLeaveの瞬間に消去すべきであるが,mouseUpは特にulタグから離れても動作することを体現しなければならない. また、mouseupイベントのオーバーラップバインドを回避するために、次のコードは適切な時間に実行する必要があるため、Effectを使用して適切な時間にmouseupイベントを呼び出す必要があります.かなり複雑に見えます.実際にやってみるとなおさらだ. Propertyバインドメソッドを使用します. 問題の原因は、レンダーするたびにバインドハンドラがオーバーラップし、複数回呼び出されることです.重なり合ったハンドルを別々に解除するので、そのうちの1つがクリアされていないと予想外の方向に流れます.したがって、Propertyメソッドを使用して構造を変更し、一生に1つのイベントだけをバインドすることができます.
アクティブなバインド方法の違いを理解し、適切なときに使用します!はい.
MouseDownイベントが発生すると、ドキュメントにmousemoveハンドルがバインドされます.mousemoveイベントは、removeEventListenerとして適切なタイミングで無効にする必要があります.そうでないと、明らかに何気ない瞬間にHandlerが実行され、プログラムが意外に実行されます.
ボリュームの例
以下のコンポーネントは、swife機能を持つKeroselの例です.次のコードを見て、mousemoveイベントはswifeハンドルをバインドします.私がさっき言ったように、適切なタイミングでハンドルを閉じないと、swape機能が何気なく起動し、スライドがマウスに従います.リリースした葉巻はsweeEndが動いた瞬間、mouseUp、mouseLeaveイベントが動いた時です.
function Carousel() {
return <ul
onMouseDown={event => {
if (isMoving.current) return;
event.preventDefault();
initialMousePosX = event.clientX - offsetX;
document.addEventListener('mousemove', swapeStart);
}}
onMouseUp={swapeEnd}
onMouseLeave={swapeEnd}
>
...
</ul>
}
実装中に発生した問題
mouseUpイベントはulラベルにバインドされているため、その外部領域では発生しません.この問題により、Leaveイベントはバインド解除を実現したが、swapeStart Handlerはコードでバインド解除されたが、解除されず、スライドはマウスに従ったことが明らかになった.コンソールでmouseupイベントが発生した瞬間
「end」の文字が印刷されますこれは上のコードには表示されませんが、removeEventListener(「mousemove」、swape Start)と考えられます.
解決策
document.addEventListener('mouseup', () => {
document.removeEventListener('mousemove', swapeStart);
});
function Carousel() {
return <ul
onMouseDown={event => {
if (isMoving.current) return;
event.preventDefault();
initialMousePosX = event.clientX - offsetX;
document.onmousemove = swapeStart; // 수정된 사항은 바인딩 방식 한줄
}}
onMouseUp={swapeEnd}
onMouseLeave={swapeEnd}
>
...
</ul>
}
明らかに,Handlerのロック解除は同じであるが,この構造はコードをよりきれいにするオーバーラップバインドに対する懸念を軽減することができる.今回の例のように、1行で問題を解決できる場合もあります.小さな結論
アクティブなバインド方法の違いを理解し、適切なときに使用します!はい.
Reference
この問題について(TIL:イベント処理とaddEventListenerメソッド(feat:元のプリロードサポートの難題)), 我々は、より多くの情報をここで見つけました https://velog.io/@tohero/TIL-useCallback-mouse-event-적용범위テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol