为什么这个 react/javascript "removeEventListener" 不删除侦听器?
why does this react/javascript "removeEventListener" not remove the listener?
这里似乎没有删除侦听器。知道如何解决这个问题吗?我猜这与我 "share" 听众的方式有关,我正在使用箭头函数(根据此处的建议 https://medium.freecodecamp.org/reactjs-pass-parameters-to-event-handlers-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));
};
}
单击 "horzontal drag test" 并向下拖动(按下鼠标按钮)后的控制台输出,释放鼠标按钮,然后再拖动一点..
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
...
具体问题是如何保留 "reusing" 事件处理程序用于多种用途的概念?
请注意,我在这里没有像建议的答案之一那样使用匿名函数 (Javascript removeEventListener not working)
即使您使用柯里化箭头函数定义函数并执行 say this.handleMouseDown('horizontal')
,每次都会返回一个新的函数实例,并且为了分配和删除 eventListeners,需要相同的函数实例被通过。您可以通过以下方式实现上述内容
import * as React from 'react';
export default class ITestComponent extends React.Component {
public render() {
return (
<div>
<div
onMouseDown={this.handleMouseDown.bind(this,'horizontal')}
draggable={false}
style={{ border: '1px solid blue', padding:20 }}
>
Horizontal Drag Test
</div>
<div
onMouseDown={this.handleMouseDown.bind(this,'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)
this._handleMouseMove = this.handleMouseMove.bind(this, eType);
this._handleMouseUp = this.handleMouseUp.bind(this, eType);
window.addEventListener('mousemove', this._handleMouseMove)
window.addEventListener('mouseup', this._handleMouseUp)
}
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)
window.removeEventListener('mouseup', this._handleMouseUp);
};
}
这里似乎没有删除侦听器。知道如何解决这个问题吗?我猜这与我 "share" 听众的方式有关,我正在使用箭头函数(根据此处的建议 https://medium.freecodecamp.org/reactjs-pass-parameters-to-event-handlers-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));
};
}
单击 "horzontal drag test" 并向下拖动(按下鼠标按钮)后的控制台输出,释放鼠标按钮,然后再拖动一点..
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
...
具体问题是如何保留 "reusing" 事件处理程序用于多种用途的概念?
请注意,我在这里没有像建议的答案之一那样使用匿名函数 (Javascript removeEventListener not working)
即使您使用柯里化箭头函数定义函数并执行 say this.handleMouseDown('horizontal')
,每次都会返回一个新的函数实例,并且为了分配和删除 eventListeners,需要相同的函数实例被通过。您可以通过以下方式实现上述内容
import * as React from 'react';
export default class ITestComponent extends React.Component {
public render() {
return (
<div>
<div
onMouseDown={this.handleMouseDown.bind(this,'horizontal')}
draggable={false}
style={{ border: '1px solid blue', padding:20 }}
>
Horizontal Drag Test
</div>
<div
onMouseDown={this.handleMouseDown.bind(this,'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)
this._handleMouseMove = this.handleMouseMove.bind(this, eType);
this._handleMouseUp = this.handleMouseUp.bind(this, eType);
window.addEventListener('mousemove', this._handleMouseMove)
window.addEventListener('mouseup', this._handleMouseUp)
}
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)
window.removeEventListener('mouseup', this._handleMouseUp);
};
}