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就可以避免正确的更改
这是因为您正在将选项
的键
设置为每次更新的动态值。尝试使用已知且唯一的键作为键
。代码如下所示
<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里面完成.