gpt4 book ai didi

javascript - useEffect 不会删除我的事件监听器

转载 作者:行者123 更新时间:2023-12-04 10:38:13 24 4
gpt4 key购买 nike

我有一个自定义 Hook ,可以设置多个按预期工作的事件监听器。但我注意到我的事件监听器在重新渲染时不会被删除。我做错了什么(代码最后一部分中的事件监听器)? IE。我在 anchor 标记事件中注意到了它; handleLink .

export default function useCursorSelector(
selectorRef: React.RefObject<HTMLElement>,
onClickLink: (url: string) => void,
onSelect: (text: string) => void
) {
const classes = useStyles();

const handleSelection = React.useCallback(
(event: MouseEvent) => {
const selection: Selection | null = window.getSelection();
if (selection) {
const text = fullStringSelection(selection);
selection.removeAllRanges();
onSelect(text);
}
event.stopPropagation();
},
[onSelect]
);

const handleLink = React.useCallback(
(a: HTMLAnchorElement) => (e: MouseEvent) => {
e.preventDefault();
onClickLink(a.href);
},
[onClickLink]
);

React.useEffect(() => {
if (selectorRef.current) {
wrapInSpans(selectorRef.current, classes.highlight, onClickLink);
}
}, [classes.highlight, selectorRef, 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(a));
});
return () => {
selectorRef!
.current!.querySelectorAll(`.${classes.highlight}`)
.forEach((e: any) => {
e.removeEventListener("mouseup", handleSelection);
});
selectorRef!
.current!.querySelectorAll(`a`)
.forEach((a: HTMLAnchorElement) => {
a.removeEventListener("click", handleLink(a));
});
};
}, [handleSelection, handleLink, classes.highlight, selectorRef]);
}

最佳答案

每次调用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]);

关于javascript - useEffect 不会删除我的事件监听器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60064777/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com