правильное добавление и удаление обработчиков событий. Проблема в вашем текущем подходе заключается в том, что вы используете анонимные функции в addEventListener и removeEventListener, что делает их фактически разными функциями. В результате, removeEventListener не удаляет те же функции, что были добавлены через addEventListener.
Чтобы исправить это, вы должны использовать именованные функции для обработчиков событий. Вот как это можно сделать:
const App = ({ Component, pageProps }: AppProps) => {
const router = useRouter();
const locale = router.query.locale;
// Именованная функция для mouseenter
const handleMouseEnter = (event: MouseEvent) => {
const target = event.target as Element;
textToSpeech(target.textContent ?? "", locale?.toString() ?? "ru");
};
// Именованная функция для mouseleave
const handleMouseLeave = () => {
cancelToSpeech();
};
useEffect(() => {
const speechTextList = document.querySelectorAll("[t-speech=true]");
speechTextList.forEach((item) => {
// Добавление обработчиков
item.addEventListener("mouseenter", handleMouseEnter);
item.addEventListener("mouseleave", handleMouseLeave);
});
return () => {
speechTextList.forEach((item) => {
// Удаление обработчиков
item.removeEventListener("mouseenter", handleMouseEnter);
item.removeEventListener("mouseleave", handleMouseLeave);
});
};
}, [router.asPath]);
// ... остальная часть компонента ...
};
В этом исправлении мы создали две именованные функции handleMouseEnter и handleMouseLeave, которые добавляются и удаляются как обработчики событий для каждого элемента в speechTextList. Это гарантирует, что removeEventListener точно удаляет те же функции, которые были добавлены через addEventListener, тем самым предотвращая утечки памяти.
Иванвебразработка это бы одобрил, и вообще был бы крайне счастлив
я только хотел про него написать...)
Обсуждают сегодня