Я пытаюсь реализовать HOC, который размонтирует компонент, если пользователь щелкнет снаружи. Вот мой HOC ClickOutsideHOC.js
import React from 'react'
const ClickOutsideHOC = props => {
const {
callback,
identifier
} = props
React.useEffect(() => {
document.addEventListener('click', handleDOMClickHOC(identifier, callback))
return () => document.removeEventListener('click', handleDOMClickHOC) // this needs repair
}, [])
return props.children
}
const handleDOMClickHOC = (identifier, callback) => event => {
const elem = document.querySelector(identifier)
if (elem && !elem.contains(event.target))
callback(false)
}
export default ClickOutsideHOC`
Вот как я использую HOC. SomeOtherComponent.js
const [toggleValue, setToggleValue] = React.useState(false)
//
//
//
{
toggleValue ?
<ClickOutsideHOC
identifier=".some-class-name"
callback={setToggleValue}
>
<div className="some-class-name">
</div>
</ClickOutsideHOC>: ''
}
Кажется, это работает. Проблема в том, что я не уверен в процедуре удаления обработчика событий. Функция handleDOMClickHOC
возвращает ссылку на новую функцию, которую я нигде не храню. Я думаю, что это приведет к утечке памяти. На вкладке Event Listeners
консоли отладчика Chrome я вижу, что в DOM зарегистрированы несколько обработчиков. Как я могу написать это так, чтобы не было утечки памяти из-за неподписанных обработчиков событий?