【问题标题】:React setState of boolean value not updating反应布尔值的setState不更新
【发布时间】:2019-05-14 10:00:57
【问题描述】:

React 新手,尝试更新一个对象的状态,其中 on 属性已经设置了布尔值。但是,状态似乎没有更新。

我知道状态是异步更新的,也许这可以在这里发挥作用?我不相信我可以使用带有对象和回调函数的 setState 方法,因为我需要访问之前的状态。

这是我的初始状态:

items: [
    {
        id: 0,
        title: 'Dev Grub',
        selected: false
    },
    ...
]

这是我的事件处理程序:

handleCardClick(id, card) {
    this.setState((preState, props) => ({
        [preState.items[id].selected]: [preState.items[id].selected] ? false : true
    }));

    console.log('new state: ', this.state.items[id].selected);

}

我也试过这个而不是三元:![card.selected]

【问题讨论】:

  • [preState.items[id].selected]: 应该是 selected: ... 尝试记录状态并检查您更新的对象
  • 你必须返回一个看起来像这样的对象:{items: [....]},但是你返回的是这样的:{'true': false}

标签: javascript reactjs


【解决方案1】:

仅在状态的第二级更新属性是行不通的。使用类似下面的东西:

handleCardClick(id, card) {
    let items = [...state.items];
    items[id].selected = items[id].selected ? false : true
    this.setState(() => ({
        items
    }));
}

【讨论】:

  • 这行得通,但我特别喜欢你提到的状态不能像我一样在第二级编辑。谢谢
【解决方案2】:

React setState 不能以这种方式工作,它不会立即更新状态,而是将更改排入队列以在将来的某个时间更新它。

如果你想在状态更新后立即做某事,你可以使用回调参数

this.setState((preState, props) => ({
    [preState.items[id].selected]: [preState.items[id].selected] ? false : true
}), () => console.log('new state: ', this.state.items[id].selected);)

docs on setState

【讨论】:

    【解决方案3】:

    setState 是异步的,你可以在状态改变后进行控制台日志

    handleCardClick = (id, card) => {
      this.setState(
        {
          [this.state.items[id].selected]: [this.state.items[id].selected]
            ? false
            : true,
        },
        () => console.log('new state: ', this.state.items[id].selected),
      );
    };
    

    【讨论】:

    • 我认为在更新状态时引用this.state 并使用setState(() => {}) 方法很糟糕?
    • 您可以在更改时访问状态,例如切换:this.setState({show:!this.state.show}})
    • 我知道你可以,文档提到你不应该。我想如果您知道如何在其他地方更新状态就可以了? reactjs.org/docs/…
    • 是的,你必须小心。但这也取决于您的实施,
    猜你喜欢
    • 2017-12-23
    • 1970-01-01
    • 2021-03-23
    • 1970-01-01
    • 2021-09-10
    • 2021-01-28
    相关资源
    最近更新 更多