我无法通过拖放操作获取元素的 ID API
I'm having trouble getting the ID of an element with a drag-and-drop API
所以我正在构建我的第一个 React 应用程序,它采用一个数组并将其元素呈现到具有自己的 id 的页面上,我喜欢使用拖放来确定项目的结束方式,但是当我拖动该区域的其中一项我似乎没有获得 ID,并且在谷歌搜索了几个小时后我遇到了困难。这是完成大部分工作的函数:
class Board extends React.Component {
constructor(props){
super(props)
this.state = {field: []}
}
search(stuff) {
//stuff.preventDefault();
for (let i = 0; i < knightDeck.length; i++) {
if (stuff == knightDeck[i].props.name) {
this.setState({ field: [...this.state.field, knightDeck[i]]})
break;
}
}
}
graveyard(stuff) {
stuff.preventDefault();
let data = stuff.dataTransfer.getData("Text")
alert(data.toString())
}
startDrag(e){
e.preventDefault()
e.dataTransfer.setData("Text", e.target.id);
}
render() {
return (
<form
onSubmit={e => {e.preventDefault(); this.search(document.getElementById("draw").value)}}>
<input
type="text"
id="draw"
name="x"
></input>
<button
type="button"
onClick={() => this.search(document.getElementById("draw").value)}>
Enter
</button>
<ol className="list">{this.state.field.map(function(card, index){return <li onDragStart={e => this.startDrag(e)} draggable id={index}>{card}</li>})}</ol>
<div className="delete" onDragOver={(e) => {e.preventDefault()}}onDrop={e => this.graveyard(e)}>Graveyard</div>
</form>
);
}
}
所以关注的区域(dropzone)是墓地,现在我只是让它在警告对话框中显示 id 以确保我首先得到它并且它一直出现空白。我使用了一些缺少 jQuery 的东西,因为我不确定它是如何与 React 一起工作的,我知道我在这里遗漏了一些东西,我们将不胜感激!
(我也知道它现在有点草率,一旦我让它正常工作,我会清理它并重命名一些东西)
真的拖了吗?我不确定您是否应该在 startDrag 函数中使用 e.preventDefault()
。删除它,看看会发生什么。
已解决,此代码段需要修复,我相信这么深 this
绑定无法正常工作,结果未定义
onDragStart={e => this.startDrag(e)}
解决方法如下:
onDragStart={e => {e.dataTransfer.setData("Text", e.target.id)}}
所以我正在构建我的第一个 React 应用程序,它采用一个数组并将其元素呈现到具有自己的 id 的页面上,我喜欢使用拖放来确定项目的结束方式,但是当我拖动该区域的其中一项我似乎没有获得 ID,并且在谷歌搜索了几个小时后我遇到了困难。这是完成大部分工作的函数:
class Board extends React.Component {
constructor(props){
super(props)
this.state = {field: []}
}
search(stuff) {
//stuff.preventDefault();
for (let i = 0; i < knightDeck.length; i++) {
if (stuff == knightDeck[i].props.name) {
this.setState({ field: [...this.state.field, knightDeck[i]]})
break;
}
}
}
graveyard(stuff) {
stuff.preventDefault();
let data = stuff.dataTransfer.getData("Text")
alert(data.toString())
}
startDrag(e){
e.preventDefault()
e.dataTransfer.setData("Text", e.target.id);
}
render() {
return (
<form
onSubmit={e => {e.preventDefault(); this.search(document.getElementById("draw").value)}}>
<input
type="text"
id="draw"
name="x"
></input>
<button
type="button"
onClick={() => this.search(document.getElementById("draw").value)}>
Enter
</button>
<ol className="list">{this.state.field.map(function(card, index){return <li onDragStart={e => this.startDrag(e)} draggable id={index}>{card}</li>})}</ol>
<div className="delete" onDragOver={(e) => {e.preventDefault()}}onDrop={e => this.graveyard(e)}>Graveyard</div>
</form>
);
}
}
所以关注的区域(dropzone)是墓地,现在我只是让它在警告对话框中显示 id 以确保我首先得到它并且它一直出现空白。我使用了一些缺少 jQuery 的东西,因为我不确定它是如何与 React 一起工作的,我知道我在这里遗漏了一些东西,我们将不胜感激! (我也知道它现在有点草率,一旦我让它正常工作,我会清理它并重命名一些东西)
真的拖了吗?我不确定您是否应该在 startDrag 函数中使用 e.preventDefault()
。删除它,看看会发生什么。
已解决,此代码段需要修复,我相信这么深 this
绑定无法正常工作,结果未定义
onDragStart={e => this.startDrag(e)}
解决方法如下:
onDragStart={e => {e.dataTransfer.setData("Text", e.target.id)}}