【问题标题】:setState doesn't work when using computed property names使用计算属性名称时 setState 不起作用
【发布时间】:2020-06-03 22:52:06
【问题描述】:

我正在尝试根据传递给 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>
    )
  }
}

【问题讨论】:

  • 发布密码笔

标签: javascript reactjs setstate


【解决方案1】:

您不能使用点表示法访问或设置计算的键值,您需要简单地使用括号表示法。

例如

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

【讨论】:

  • 它解决了问题
  • 酷!如果它修复它,请接受这个作为答案。 :)
猜你喜欢
  • 1970-01-01
  • 2015-08-19
  • 2016-04-05
  • 1970-01-01
  • 2018-02-06
  • 1970-01-01
  • 2014-06-09
  • 2016-03-18
  • 1970-01-01
相关资源
最近更新 更多