Каждый раз, когда вы вызываете handleLink(a)
, вы создаете новую анонимную функцию для использования в качестве обратного вызова для вашего обработчика событий.
Когда вы вызываете removeEventListener
, вы должны передавать ссылку на тот же обратный вызов, который вы использовали для прикрепления события, однако каждый раз, когда вы вызываете handleLink
, вы создаете новую анонимную функцию.
Вы можете каким-то образом сохранить ссылку на созданные вами обратные вызовы или переписать handleLink
, чтобы вам вообще не нужно было передавать элемент.
const handleLink = React.useCallback((e: MouseEvent) => {
e.preventDefault();
onClickLink(e.currentTarget.href);
}, [onClickLink]);
...
React.useEffect(() => {
selectorRef!
.current!.querySelectorAll(`.${classes.highlight}`)
.forEach((e: any) => {
e.addEventListener("mouseup", handleSelection);
});
selectorRef!
.current!.querySelectorAll(`a`)
.forEach((a: HTMLAnchorElement) => {
a.addEventListener("click", handleLink);
});
return () => {
selectorRef!
.current!.querySelectorAll(`.${classes.highlight}`)
.forEach((e: any) => {
e.removeEventListener("mouseup", handleSelection);
});
selectorRef!
.current!.querySelectorAll(`a`)
.forEach((a: HTMLAnchorElement) => {
a.removeEventListener("click", handleLink);
});
};
}, [handleSelection, handleLink, classes.highlight, selectorRef]);