【问题标题】:dynamic variable on setState won't work for togglesetState 上的动态变量不适用于切换
【发布时间】:2017-06-16 09:57:13
【问题描述】:

我有这个功能

toggleDropdown = (name) => {
    this.setState({
        [`open${name}`]: !this.state[`${name}`]
    })
}

我在多个不同的下拉菜单中使用它

<div onClick={e=> toggleDropdown('Dropdown1')}</div>
<div onClick={e=> toggleDropdown('Dropdown2')}</div>

不知何故this.state.Dropdown1this.state.Dropdown2 在我单击div 时总是正确的,它不会切换,这是什么问题?

【问题讨论】:

  • 您确定要反转同一个字段吗? [`open${name}`]: !this.state[`open${name}`]
  • 请注意,setState 是异步的,在您的情况下,最好使用 this.setState(prevState => ({ }))
  • @hmnzr 是的,但为什么会这样:this.setState({openDropdown: !this.state.openDropdown})
  • 因为异步意味着它不保证任何顺序,所以如果处理速度慢,或者单个更新周期内多个setState会导致意外结果

标签: javascript reactjs ecmascript-6


【解决方案1】:

两件事,

  1. 当你根据前一个状态设置状态时,对setState使用prevState回调机制,因为setStateasynchronous

  2. 你想得到this.state.Dropdown1,但你仍然设置openDropdown1

试试

toggleDropdown = (name) => {
    this.setState((prevState) => ({
        [name]: !prevState[name]
    }))
}

【讨论】:

  • 但为什么会这样:this.setState({openDropdown: !this.state.openDropdown}) ??
  • 它有时会起作用,有时会不起作用,这取决于它的处理速度。上述代码的行为会不一致,建议使用setState的回调方式
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-21
  • 1970-01-01
  • 2021-08-12
  • 2021-12-30
相关资源
最近更新 更多