我正在做一个Todo应用来练习React。我遇到了障碍,现在我想弄清楚如何唯一地编辑卡片。

目前,当我单击“编辑”时,我所有的卡都设置为isEditing == true。我尝试添加密钥和索引,但是似乎不能唯一地标识所选的卡。

如我的gif所示:

javascript - ReactJS从 map 上唯一选择一个元素-LMLPHP

显然,预期结果是只应将isEditing == true设置为所选卡。

请参阅下面的代码。

有关更多上下文:,有一个状态组件将 Prop 传递给该组件,我使用的是react-bootstrap(因此PanelButton),为了简洁起见,我删除了一些代码(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>
    )
}

08-19 14:16