我正在做一个Todo应用来练习React。我遇到了障碍,现在我想弄清楚如何唯一地编辑卡片。
目前,当我单击“编辑”时,我所有的卡都设置为isEditing == true
。我尝试添加密钥和索引,但是似乎不能唯一地标识所选的卡。
如我的gif所示:
显然,预期结果是只应将isEditing == true
设置为所选卡。
请参阅下面的代码。
有关更多上下文:,有一个状态组件将 Prop 传递给该组件,我使用的是react-bootstrap
(因此Panel
,Button
),为了简洁起见,我删除了一些代码(construct
和whatnot)。
edit() {
this.setState({
isEditing: true
})
}
renderEditDoneButtons() {
return (
<div>
<Button onClick={this.edit}>edit</Button>
</div>
)
}
renderNote(note) {
return (
<p> {note} </p>
)
}
renderCard(note, i) {
return (
<Panel key={i}
index={i}>
{
this.state.isEditing ?
this.renderForm() :
this.renderNote(note.note)
}
</Panel>
)
}
render() {
return (
<div>
{this.props.notes.map(this.renderCard)}
</div>
)
}
最佳答案
所有这三个都基于单个isEditing
状态而变化,这就是为什么当您单击任何“编辑”按钮时看到所有三个都被显示的原因。可以使用数组来维护所有三个状态,而不是使用单个isEditing
键来保持状态:
constructor(props) {
super(props);
// Sets a true/false editing state for all three panels
this.state = {
editingPanels: Array(3).fill(false)
}
}
edit(i) {
// Switches editing state to false/true for given i
const editingPanels = this.state.editingPanels.slice();
editingPanels[i] = !editingPanels[i];
this.setState({
editingPanels: editingPanels
})
}
renderEditDoneButtons(i) {
return (
<div>
<Button onClick={()=>this.state.edit(i)}>edit</Button>
</div>
)
}
renderNote(note) {
return (
<p> {note} </p>
)
}
renderCard(note, i) {
return (
<Panel key={i}
index={i}>
{
this.state.editingPanels[i] ?
this.renderForm() :
this.renderNote(note.note)
}
</Panel>
)
}
render() {
return (
<div>
{this.props.notes.map(this.renderCard)}
</div>
)
}