javascript - 使用计算属性名称时 setState 不起作用
问题描述
我试图根据传递给 handleTime 方法的参数更新状态,所以我使用计算属性名称来执行更新(使用以前的状态)但是 setState(在 handleTime 方法中)不起作用。
这是状态:
const sessionLength = {min: 25,
sec: 0}
this.state = {
breakLength: {min: 5, sec: 0},
sessionLength: sessionLength,
sessionProcessed: sessionLength,
actualState: 'Session'
}
handleTime 方法负责更新状态,而 play 方法是一个单击事件处理程序方法,它使用参数(要更新的属性名称)调用 handleTime
handleTime(str="sessionProcessed"){
this.setState(state=>({[str]: {...state.[str], sec: state.[str].sec - 1}}));
}
play(){
if(typeof this.intervalId === 'undefined'){
this.intervalId = setInterval(this.handleTime.bind(this),1000);
this.setState({intervalId: this.intervalId});
}
}
JSX
render(){
return(
<div class="ml-5">
<div>{this.state.actualState}</div>
<div><strong id="session">{this.state.sessionProcessed.min}:{this.state.sessionProcessed.sec}</strong></div>
<div><i id="play" class="fa fa-play" onClick={this.play}></i> <i id="pause" class="fa fa-pause" onClick={this.pause}></i></div>
</div>
)
}
}
解决方案
您不能使用点表示法访问或设置计算的键值,您需要简单地使用括号表示法。
例如
handleTime(str="sessionProcessed"){
this.setState(state=>({[str]: {...state[str], sec: state[str].sec - 1}}));
}
我刚刚删除了 中的点,state.[str]
因为这会引发错误,因此您很可能没有正确设置这些属性。
尝试更改这些,看看它是否能解决问题。
参考:https ://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Property_accessors
推荐阅读
- javascript - 无法在地图内存储数组的状态 - Reactjs
- c - 为什么fmp4文件不能用VLC解码音频,但是用PotPlayer可以正常播放
- sql - 从SQL导入power bi时如何只选择前1000行?
- javascript - Shopify 电子商务网站如何根据颜色属性的变化来激活幻灯片?
- react-native - ESLint semi 规则不会在 react-native 中的类声明之前强制执行 import 语句
- c# - 将结果字符串 datetime 转换为 dateTime 值
- amazon-web-services - 将 EMR 5.19 升级到 5.20
- javascript - 在实例中绑定 this
- python - 提取以某个字符开头的所有单词
- c++ - 当我尝试为我的程序提供 3 个输入时,它需要 4 个才能正常运行。这是为什么?