当前位置: 首页 > 知识库问答 >
问题:

setState与数组从onChange的避免更改标签

辛麻雀
2023-03-14

TL;DR:调用this.setState更新数组可避免更改

说明:我正在构建这样的选项数组(dd代表下拉列表):

let ddUsers = (this.state.users.map(user => <option key={uuid.v4()} value={user.key}>{user.name}</option>))

然后这里是我的选择:

<select onChange={this.handleFilter}>{ddUsers}</select>

这非常有效:它首先显示第一个选项,并且能够显示其他选项。

这是我的onChange函数:handleFilter

handleFilter = (event) => {

    let selectedUsers;

    console.log(event.target.value, this.state.DEFAULT_KEY)
    if (event.target.value === this.state.DEFAULT_KEY) {
        selectedUsers = [...this.state.users];
    } else {
        selectedUsers = (this.state.users.filter(user => user.key === event.target.value));
    }

    // this.setState({selected: selectedUsers}); <-- The problem comes from this line (looks like atleast)

}

现在,在注释的最后一行,select的标签将正确更新为所选选项。但是当我取消注释这一行时,函数被调用,this.state.selected被更新,但是select在第一个选项上被阻止。

清楚了吗?我错过了什么?

事实上:只需在函数中调用setState就可以避免正确的更改

共有1个答案

干高歌
2023-03-14

这是因为您正在将选项设置为每次更新的动态值。尝试使用已知且唯一的键作为。代码如下所示

<option key={user.key} value={user.key}>

这确保了您拥有唯一的密钥,并且是可预测的。

 类似资料:
  • 问题内容: 我的代码有效,但是我有一个最佳实践问题:状态中有一组对象,并且用户交互一次将更改一个对象的值。 据我所知,我不应该直接更改状态,而是应该始终使用。如果我想不惜一切代价避免这种情况,我将通过迭代深度克隆数组,然后更改克隆。然后将状态设置为克隆。我认为避免改变以后会改变的状态只是降低了我的表现。 详细版本: this.state.data是对象数组。它代表论坛中的主题列表,并且收藏夹按钮将

  • 这个项目是可以在Android Studio中找到的Master/Detail流模板的扩展。不同之处在于,这个应用程序使用一个活动和一个管理三个片段的ViewPager。第三个片段是Master(list)片段,其中包含一个可单击的Recyview。当单击列表项时,它会用子(细节)片段切换该片段。 在项目工作时,我希望避免在清单中使用。我该怎么做? baseFragment.java 接口:bri

  • 我正在尝试根据我的边2[]数组中的对象编写一个新文档。现在不幸的是,这个数组中的一些索引为空,当它击中其中一个时,它只是给了我一个NullPointerExc的。这个数组有10个索引,但在这种情况下并不需要所有的索引。我已经尝试了try的捕捉语句,希望在它遇到空值后继续,但它仍然停止执行,并且不写新文档。作为对象一部分的堆栈(sire)包含我想打印出来的数据。 这是我的代码:

  • 问题内容: React文档指出函数应该是 纯 函数,这意味着它不应该在函数中使用。但是,我相信当状态依赖于“远程”(即由ajax调用产生的结果)时。唯一的解决方案是在函数内部 就我而言。我们的用户应该可以登录。登录后,我们还需要检查用户的访问权限(ajax调用),以决定如何显示页面。代码是这样的 之所以无法显示ajax调用,是因为当用户单击LOGIN按钮时,页面会重新呈现,并且还需要ajax调用。

  • 我有两个简单的带有父子关系的reactjs组件。子级包含一个带有onChange事件的输入和一个回调父级以设置状态。当我运行它时,setState似乎在父组件中工作,但传递到子组件中的道具似乎没有更新。有什么想法吗?下面是一段代码片段: 在上面的示例中,子组件中的输入值保持为“bar”,尽管在父组件中触发了,并且通过。为什么输入值不改变以反映新的状态?

  • componentWillMount() 在组件将要挂载时被立即调用. 这个调用发生在render()函数执行之前, 所以如果在componentWillMount里面设置了state, 这个设置的state是不会触发重新渲染的. 同样我们也需要注意不要在componentWillMount()中引入其他可能会导致问题的代码. 如果你有类似的需求, 请在componentDidMount里面完成.