组件的多个实例,试图删除 onclick - 但总是最后一个被删除
multiple instances of the component, trying to remove onclick - but always the last one is being removed
这是我的代码的简化示例
constructor(props) {
super(props);
this.state = {
components:[ComponentA, ComponentA, ComponentA, ComponentA, ComponentA ]
}
}
hide(i){
let components= this.state.components.filter((item,k)=>k!=i);
this.setState({components});
}
render() {
return (<div>
{this.state.components.map((item,i) => {
let ChildComponent = item;
return <div key={i} onClick={()=>this.hide(i)}>
<ChildComponent />
</div>
})
}
这里我有相同组件的实例。当我单击一个时 - 我希望删除带有此特定实例的 div。要检查 - 这是我的 ComponentA 代码:
constructor(props) {
super(props);
this.state = {
uid: Math.random()
}
}
render() {
return (
<div>
ComponentA - {this.state.uid}
</div>
);
}
因此每个实例在状态中都有其唯一的 uid。
当我单击其中一个组件时 - 总是最后一个组件被删除。
更新
那是简化版,现在可以用了。我真正的问题是反应网格布局:
this.state = {
testlayout: [
{"w": 10,"h": 100,"i": 0,"x": 0, "y": 0,"widget": Component4},
{"w": 10,"h": 100,"i":1,"x": 10, "y": 0,"widget": Component4},
{"w": 10,"h": 100,"i": 2,"x": 20, "y": 0,"widget": Component4},
]
}
onClose(i){
let testlayout = this.state.testlayout.filter((item,k)=>item.i!=i);
this.setState({testlayout});
}
render() {
return (<div>
<ReactGridLayout>
{this.state.testlayout.map((item, i) => {
let ChildComponent = item.widget;
return
<div onClick={() => this.onClose(item.i)} data-grid={this.state.testlayout[i]} key={item.i}>
<ChildComponent/>
</div>
}
)}
</ReactGridLayout>
</div>
);
}
好吧,这行代码删除了最后一个元素,因为索引不会保留。
let components= this.state.components.filter((item,k)=>k!=i);
首先,查看有关 Reconcilation 的文章。它可以帮助您理解为什么唯一、可预测和稳定的密钥很重要。
这是我的代码的简化示例
constructor(props) {
super(props);
this.state = {
components:[ComponentA, ComponentA, ComponentA, ComponentA, ComponentA ]
}
}
hide(i){
let components= this.state.components.filter((item,k)=>k!=i);
this.setState({components});
}
render() {
return (<div>
{this.state.components.map((item,i) => {
let ChildComponent = item;
return <div key={i} onClick={()=>this.hide(i)}>
<ChildComponent />
</div>
})
}
这里我有相同组件的实例。当我单击一个时 - 我希望删除带有此特定实例的 div。要检查 - 这是我的 ComponentA 代码:
constructor(props) {
super(props);
this.state = {
uid: Math.random()
}
}
render() {
return (
<div>
ComponentA - {this.state.uid}
</div>
);
}
因此每个实例在状态中都有其唯一的 uid。 当我单击其中一个组件时 - 总是最后一个组件被删除。
更新
那是简化版,现在可以用了。我真正的问题是反应网格布局:
this.state = {
testlayout: [
{"w": 10,"h": 100,"i": 0,"x": 0, "y": 0,"widget": Component4},
{"w": 10,"h": 100,"i":1,"x": 10, "y": 0,"widget": Component4},
{"w": 10,"h": 100,"i": 2,"x": 20, "y": 0,"widget": Component4},
]
}
onClose(i){
let testlayout = this.state.testlayout.filter((item,k)=>item.i!=i);
this.setState({testlayout});
}
render() {
return (<div>
<ReactGridLayout>
{this.state.testlayout.map((item, i) => {
let ChildComponent = item.widget;
return
<div onClick={() => this.onClose(item.i)} data-grid={this.state.testlayout[i]} key={item.i}>
<ChildComponent/>
</div>
}
)}
</ReactGridLayout>
</div>
);
}
好吧,这行代码删除了最后一个元素,因为索引不会保留。
let components= this.state.components.filter((item,k)=>k!=i);
首先,查看有关 Reconcilation 的文章。它可以帮助您理解为什么唯一、可预测和稳定的密钥很重要。