【发布时间】:2016-01-10 21:23:05
【问题描述】:
我正在编写一个为 ES5 完成的反应拖放教程,但我正在使用 ES6。
这是我的代码:
class Song extends React.Component{
constructor(props){
super(props);
this.state = {isPlaying:false,dragMode:editMode == 1 ? true : false,eligibleToDrag: false};
//this.dragStart = this.dragStart.bind(this);
}
_clickAction(){
if(this.state.dragMode == false){
changeSong(this.props.arrIndex);
playSong();
}
}
dragStart(e){
Array.prototype.forEach.call(document.getElementById('screen2').getElementsByClassName('track'),function(e1){
if(e1.getAttribute('data-songid') == e.currentTarget.getAttribute('data-songid')){
this.setState({eligibleToDrag: false});
console.log('ELIGIBLE?',this.state.eligibleToDrag);
}
else{
this.setState({eligibleToDrag: true});
console.log('ELIGIBLE?',this.state.eligibleToDrag);
}
});
console.log(this.state.eligibleToDrag);
if(e.currentTarget.parentElement.parentElement.id=="screen"){
e.dataTransfer.effectAllowed = 'link';
}
if(e.currentTarget.parentElement.parentElement.id=="screen2"){
e.dataTransfer.effectAllowed = 'move';
}
draggedObject = e.currentTarget;
e.dataTransfer.setData("text/html",e.currentTarget);
}
dragEnd(e){
}
dragOver(e){
e.preventDefault();
var relY = e.clientY - e.target.offsetTop;
var height = e.target.offsetHeight / 2;
if(e.target.parentNode.parentNode.id == 'screen2'){
if(relY > height){
e.target.parentNode.insertBefore(draggedObject,e.target.nextElementSibling);
}
else if(relY < height){
e.target.parentNode.insertBefore(draggedObject,e.target);
}
}
if(e.target.parentNode.parentNode.id == 'screen' && draggedObject.parentNode && draggedObject.parentNode.parentNode.id == 'screen2'){
draggedObject.remove();
//e.stopPropagation();
}
return;
}
render(){
var isDragMode = this.state.dragMode == true;
if(isDragMode){
document.getElementById('screen').classList.add("drag");
document.getElementById('screen2').classList.add("drag");
}
return <div data-songid={this.props.trackInfo.Id} onClick={this._clickAction.bind(this)} className={"track"} draggable={isDragMode ? "true": "false"} onDragEnd={isDragMode ? this.dragEnd.bind(this) : ''} onDragOver={isDragMode ? this.dragOver.bind(this) : ''} onDragStart={isDragMode ? this.dragStart.bind(this) : ''}>
<span draggable={"false"}>{this.props.trackInfo.Title}</span><br draggable={"false"} />
<span draggable={"false"}><i draggable={"false"}>{this.props.trackInfo.Artist}</i></span>
</div>
}
}
该类一直有效,直到我在 dragStart(e) 上添加了 Array.prototype.forEach.call 部分。然后它开始在控制台中给我“无法读取未定义的属性'setState'”,指向该部分。我不确定我错过了什么,因为据我所知,我已经在渲染方法中绑定了所有内容。我的猜测是我还没有绑定所有内容,但我不确定还能做什么。
【问题讨论】:
-
不要在 [] 方法中使用 this 而不传递 this 应该作为第二个参数。因此,在 dragstart 中,将
if/else之后的第一个});替换为}, this);并重试
标签: javascript reactjs ecmascript-6