Похоже, слушатели здесь не удаляются. Есть идеи, как это исправить? Я предполагаю, что это связано с тем, как я «делюсь» слушателем, и я использую функции стрелок (согласно рекомендации здесь https://medium.freecodecamp.org/reactjs-pass-parameters-to-обработчикисобытий-ca1f5c422b9)
Код:
import * as React from 'react';
export default class ITestComponent extends React.Component {
public render() {
return (
<div>
<div
onMouseDown={this.handleMouseDown('horizontal')}
draggable={false}
style={{ border: '1px solid blue', padding:20 }}
>
Horizontal Drag Test
</div>
<div
onMouseDown={this.handleMouseDown('vertical')}
draggable={false}
style={{ border: '1px solid green', padding:20 }}
>
Vertical Drag Test
</div>
</div>
);
}
private handleMouseDown = (eType:string) => (e:any) => {
console.log('Add Event Listeners (handleMouseDown)', eType)
window.addEventListener('mousemove', this.handleMouseMove(eType))
window.addEventListener('mouseup', this.handleMouseUp(eType))
}
private handleMouseMove = (eType:string) => (e:MouseEvent) => {
console.log(' - handleMouseMove', eType, e.clientY)
};
private handleMouseUp = (eType:string) => (e:MouseEvent) => {
console.log('Remove Listeners (handleMouseUp)', eType)
window.removeEventListener('mousemove', this.handleMouseMove(eType))
window.removeEventListener('mouseup', this.handleMouseUp(eType));
};
}
Вывод консоли после нажатия на «тест горизонтального перетаскивания» и перетаскивания вниз (с нажатой кнопкой мыши), отпускания кнопки мыши, затем перетаскивания еще немного..
Add Event Listeners (handleMouseDown) horizontal
- handleMouseMove horizontal 61
...
- handleMouseMove horizontal 220
- handleMouseMove horizontal 221
Remove Listeners (handleMouseUp) horizontal
- handleMouseMove horizontal 222
- handleMouseMove horizontal 222
- handleMouseMove horizontal 228
...
В частности, вопрос заключается в том, как сохранить концепцию «повторного использования» обработчика событий для нескольких целей?
Обратите внимание, что я не использую здесь анонимную функцию, как в одном из предложенных ответов (Javascript removeEventListener не работает а>)
this.handleMouseMove(eType)
возвращает новую функцию каждый раз, когда вы ее используете, поэтому ссылка на удаляемую функцию не совпадает с той, которую вы добавляете. - person Tholle   schedule 21.12.2018