【发布时间】:2019-06-26 14:13:45
【问题描述】:
这是我第一次尝试 React。我正在尝试构建一个 UI,我可以在其中拖放图像并移动它们的顺序。我意识到首先,这将要求每个图像都有一个唯一的密钥,但我找不到正确的方法。我不明白为什么,即使我明确分配了一个键,当我在控制台上查看对象时它仍然为空。我试过了:
<div>
{this.props.imageArray.map((image, index) => (
<span
key={index}
>
{image}
</span>
))}
</div>;
这仍然给了我null 的键(我也尝试为外部 div 分配它自己的键,但这也不起作用)。
我已经读过,如果未指定 key,它默认为数组中元素的 id(当未指定 key 但这是预期时,我仍然得到一个空值),所以我尝试手动分配它
<div>
{this.props.imageArray.map(image => (
<span key={this.props.images.length}>{image}</span>
))}
</div>;
但这给了我这个错误:
警告:遇到两个孩子使用相同的密钥,2。键应该是唯一的,以便组件在更新时保持其身份......
即使# 随着每个错误的增加而增加,该错误也会随着添加到数组中的每个新图像而继续存在。这告诉我密钥正在增加,但由于某种原因,它仍然不是唯一的。我的猜测是每次都以某种方式创建了 2 个孩子?无论如何,这给了我错误的输出,所以我不能使用它。
我也简单地尝试过这个,它给了我正确的输出,但我得到了与上面相同的警告,除了 # 它说 [object Object]
<div>
{this.props.imageArray.map(image => (
<span key={image}>{image}</span>
))}
</div>;
这是我完整的组件代码。当我在图像周围移动时检查拖动事件中的对象 ID 时,它始终是未定义的。我只需要弄清楚这个独特的关键问题是怎么回事,但是如果您发现拖放功能有任何问题,我也可以使用一些指针。
class Images extends Component {
state = {
arrayOfImages: [...this.props.imageArray],
droppedImage: []
};
onDragStart = (ev, id) => {
ev.dataTransfer.setData("id", id);
};
onDrop = ev => {
let id = ev.dataTransfer.getData("id");
let draggedImage = this.state.arrayOfImages.filter(function(image) {
return image === id;
});
this.setState({
droppedImage: draggedImage
});
};
onDragOver = ev => {
ev.preventDefault();
};
render() {
return (
<React.Fragment>
<div>
{this.props.imageArray.map((image, index) => (
<span
key={index}
onDragStart={this.onDragStart}
draggable //I know this isn't necessary for images
>
{image}
</span>
))}
</div>
<div
className="dropTarget"
onDragOver={e => this.onDragOver(e)}
onDrop={e => this.onDrop(e)}
>
{this.state.droppedImage}
</div>
</React.Fragment>
);
}
}
export default Images;
【问题讨论】:
-
你在这里和那里提到“我读过......”和“它说......”。你在关注/指的是什么?
-
Randy,我一直在寻找类似的 stackoverflow 帖子和 React 文档
-
你能把这个配对一下吗?当您使用索引作为键时,有什么问题?使用长度作为键永远不会起作用,对象也是如此。
-
Kyle,当我使用索引作为键时,我得到每个对象中键的空值,并且每个拖放事件传递的 id 未定义
-
您在哪里尝试读取密钥,您是否遇到错误?
标签: javascript reactjs drag-and-drop key