反应:将输入字段的值与删除的组件相关联

饼干怪兽

我存储了一系列项目this.state.items,用户可以通过单击“修改”按钮来添加/删除项目this.state.items

我有这样的东西。(此代码未经测试,可能无法编译,但您可能会明白。)

TextField = React.createClass({
    render() {
        return <input type="text"/>;
    }
});

TextList = React.createClass({
    getInitialState () {
        return {
          items: [<TextField />, <TextField />, <TextField />]
        };
    },

    addItem() {
        // Adds a new <TextField /> to this.state.items
    },

    removeItem(index) {
        // Filters out the item with the specified index and updates the items array.
        this.setState({items: this.state.items.filter((_, i) => i !== index)});
    },

    render() {
        return (
            <ul>
            {this.state.items.map((item, index) => {
                return (
                    <li key={index}>
                        {item}
                        <button onClick={this.props.removeItem.bind(null, index)}>Remove</button>
                    </li>
                );
            })}
            </ul>

            <button onClick={this.addItem}>Add New Item</button>
        );
    }
});

这样可以删除中的指定项目this.state.items我在控制台中看到了它,这部分工作正常。但这不是呈现给用户的。

例如,如果有3个输入字段,并且用户类型分别为“ One”,“ Two”和“ Three”,则如果他单击“ Two”的删除按钮,则将带有“ Three”的输入字段删除。换句话说,总是最后一个字段被删除。

如何解决此问题,以使输入字段的值与删除的字段正确关联?

温特维尔特

这是因为react为了提高速度和效率而根据其键回收项目。因此,使用始终为0、1,2等的索引会产生不良后果。

反应如何工作:

  • 您有一个索引为0,1,2:的项目列表,该项目可以响应渲染。
  • 用户删除第一项
  • 该列表现在有2个项目长:索引0,1
  • 当react重新渲染时,它从您的键中扣除(错误地),第0,1项未更改(因为键相同),并且第三个项已删除。

解决方案:使密钥对于特定项目而言是唯一的。更好地基于项目内容。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章