javascript - setState 回调不等待状态更新
问题描述
我有这段代码:
handleMaxLevel = event => {
this.setState({
maxLevel: event.target.value
}, (minLevel, maxLevel) => {
let filter = this.state.filteredPlayers.filter(players => {
return players.level > minLevel && players.level < maxLevel
})
this.setState({
levelFilteredPlayers: filter
})
})
}
我在这段代码上调用这个函数:
<TextField
id="standard-number"
label="Highest level"
type="number"
onChange={() => this.handleMaxLevel(this.state.minLevel, this.state.maxLevel)}
InputLabelProps={{
shrink: true,
}}
/>
我得到的东西是:TypeError:无法读取未定义
的属性“值”据说问题出在这一行:maxLevel:event.target.value。
我不明白,回调不是应该等待第一个 setstate 结束以便执行吗?
为什么它没有重新调整设置为 maxLevel 状态的值?
解决方案
你的语法不正确。当您调用时,handleMaxLevel
您应该将事件对象传递给它。并且setState
回调不需要任何参数,它已经可以访问更新的状态。所以你onChange
的处理程序应该是这样的:
onChange={handleMaxLevel} // If we pass function directly, it will be given the event argument by default
然后在您的setState
回调中,直接引用状态值,因为在回调中它们将被更新:
handleMaxLevel = event => {
this.setState({
...this.state,
maxLevel: event.target.value
}, () => {
let filter = this.state.filteredPlayers.filter(players => {
return players.level > this.state.minLevel && players.level < this.state.maxLevel
})
this.setState({
...this.state,
levelFilteredPlayers: filter
})
})
}
编辑:我相信你也需要传播旧状态,以防止价值丢失。此外,最好在一次setState
调用中完成所有操作,而不是使用回调
推荐阅读
- javascript - React/JavaScript:使用 React spread 对数组执行 2 次更改(同时)
- vb.net - 将位图中的红色像素更改为蓝色
- jquery - jQuery keyup 或 click 没有立即响应,为什么?
- c# - 预构建事件:使用 XCopy 复制文件并包含在项目中
- javascript - 如何在 Alert.alert 中使用 foreach 进行本机反应
- c++ - 继承的一元运算符的协变返回类型无效
- vba - VBA执行函数在参数cmd.exe中有几个引号
- sql-server - SQL 条件返回 HAVING
- ios - 如何导航到另一个导航控制器 iOS
- dart - 尝试创建 Flutter App Bar 子菜单小部件