【发布时间】:2018-01-11 01:08:43
【问题描述】:
我有一个带有两个窗格的容器。我正在制作其中一个可重新调整大小和绝对大小,另一个根据第一个的大小实时调整。
不幸的是,我刚刚编写的 es6“resize-controller”出现了问题。因为我做出了使用箭头函数的错误决定,所以我无法删除事件侦听器。除此之外,我的数学有一个错误,它按预期运行。但是,当我尝试使用几种可能的解决方案来修复我的错误时,我要么没有功能,要么没有关于上下文和功能不是功能的错误。
希望这里的人可以看看我的确切设置并告诉我它应该是怎样的。用普通函数替换箭头函数,不管有没有事件参数,都不起作用。为这门课程放弃 Es6 课程会更好吗?也许我已经解开了几层复杂性。
class ResizeController {
constructor(){
this.chatContainer = document.getElementById("chatContainer");
this.messageWindowContainer = document.getElementById("messageWindowContainer");
this.messageWindowContentContainer = document.getElementById("messageWindowContentContainer");
this.messageWindowContent = document.getElementById("messageWindowContent");
this.startX = "";
this.startWidth = this.getMessageWindowWidth();
}
init(){
this.messageWindowContainer.addEventListener('mousedown', (e)=>{e.stopPropagation()});
this.messageWindowContentContainer.addEventListener('mousedown', (e)=>{this.onMouseDown(e)});
this.messageWindowContent.addEventListener('mousedown', (e)=>{e.stopPropagation()})
}
onMouseDown(e) {
this.onDown(e);
e.preventDefault();
}
onDown(e){
this.startX = e.clientX;
this.messageWindowContentContainer.addEventListener('mousemove', (e)=>{this.onMouseMove(e)});
this.messageWindowContentContainer.addEventListener('mouseup', (e)=>{this.onMouseUp(e)});
}
onMouseMove(e){
this.mouseMove(e);
e.preventDefault();
}
onMouseUp(e){
this.mouseUp(e);
e.preventDefault();
}
mouseMove(e) {
this.messageWindowContainer.setAttribute("style","width:"+( this.startWidth - e.clientX + this.startX)+"px");
}
mouseUp(e){
console.log("stopdrag")
this.messageWindowContentContainer.removeEventListener('mousemove', (e)=>{this.onMouseMove(e)});
this.messageWindowContentContainer.removeEventListener('mouseup', (e)=>{this.onMouseUp(e)});
}
getMessageWindowWidth(){
let chatContainerWidth = document.getElementById("chatContainer").offsetWidth;
let messageWindowContainerWidth = document.getElementById("messageWindowContainer").offsetWidth;
return (chatContainerWidth - messageWindowContainerWidth);
}
}
export default ResizeController
【问题讨论】:
-
作为第二个参数传递给
.addEventListener()和.removeEventListener()的值应该是函数引用而不是匿名函数 -
使用函数定义(而不是函数调用)更改匿名函数(允许我的控制器工作)会导致 onMouseDown() 等函数出错,这表明 mouseDown() 函数不是函数. onMouseDown 是处理程序,工作委托给 mouseDown
标签: reactjs ecmascript-6 event-handling dom-events mouseevent