Как удалить прослушиватель событий в контексте перетаскивания компонента React
В mousemove
не кажется должным образом удаленным из document
при отпускании мыши.
1 ответ
Решение
Вместо того, чтобы вручную добавлять и удалять, когда это необходимо, напишите собственный хукuseEvent
который будет хранить обработчики от одного рендера к другому:
useEvent.js
import { useEffect, useRef } from "react";
export default function(event, handler, element=window) {
const savedHandler = useRef();
useEffect(() => {
savedHandler.current = handler;
}, [handler]);
useEffect(() => {
const eventListener = event => savedHandler.current(event);
element.addEventListener(event, eventListener);
return () => element.removeEventListener(event, eventListener);
}, [event, element]);
}
components/Dragon.js
useEvent("mousemove", onDrag);
useEvent("mouseup", onDragEnd);
Рабочая ручка: https://codesandbox.io/s/dragondrop-ceocx