UNPKG

eslint-plugin-listeners

Version:

ESLint plugin for preventing memory leaks around event listeners

139 lines (106 loc) 2.64 kB
# matching-remove-event-listener ## Rule Details This rule enforces that the handler for a `removeEventListener` is the same handler that was passed in to the associated `addEventListener` Note that if the `addListener` specifies the `useCapture` argument, so must the `removeEventListener` for it to match and be removed as expected EventEmitters with `addListener` and `removeListener` are also supported. If the `removeAllListeners` function is called, a matching `removeListener` is not required. The `on` and `off` alias are also supported. Examples of **incorrect** code for this rule: ```js class App { handleRootNodeClick = () => { console.log('click'); }; handleRootNodeKeyPress = () => { console.log('keyPress'); }; componentDidMount() { window.addEventListener('click', this.handleRootNodeClick); } componentWillUnmount() { window.removeEventListener('click', this.handleRootNodeKeyPress); } render() { return null; } } ``` ```js class App { handleRootNodeClick = () => { console.log('click'); }; componentDidMount() { window.addEventListener('click', this.handleRootNodeClick, true); } componentWillUnmount() { window.removeEventListener('click', this.handleRootNodeClick); } render() { return null; } } ``` ```js const emitter = new EventEmitter() const dataHandler = () => { console.log('data') } const data2Handler = () => { console.log('data') } emitter.on('data', dataHandler) emitter.once('close', () => { console.log('close') emitter.removeListener('data', dataHandler2) }) ``` Examples of **correct** code for this rule: ```js class App { handleRootNodeClick = () => { console.log('click'); }; handleRootNodeKeyPress = () => { console.log('keyPress'); }; componentDidMount() { window.addEventListener('click', this.handleRootNodeClick); } componentWillUnmount() { window.removeEventListener('click', this.handleRootNodeClick); } render() { return null; } } ``` ```js class App { handleRootNodeClick = () => { console.log('click'); }; componentDidMount() { window.addEventListener('click', this.handleRootNodeClick, true); } componentWillUnmount() { window.removeEventListener('click', this.handleRootNodeClick, true); } render() { return null; } } ``` ```js const emitter = new EventEmitter() const dataHandler = () => { console.log('data') } const data2Handler = () => { console.log('data') } emitter.on('data', dataHandler) emitter.once('close', () => { console.log('close') emitter.removeListener('data', dataHandler) }) ```