【问题标题】:Reactjs: setstate rendering order problemReactjs:setstate 渲染顺序问题
【发布时间】:2021-01-28 08:47:33
【问题描述】:

我是使用 reactjs 的新手。 我正在使用带有 onChange 句柄的 Select 元素。我使用 setState 保存选定的值:productFilterChosenValue。 然后用我的按钮“onClick”事件上的handleClick,我做

this.setState({
  productFilterChosenValue: this.state.productFilterValue,
});

所以我让 productFilterChoseValue 仅在单击时使用当前 Select 值更新他的值。 它工作正常,因为如果我在我的 render() 函数中输入{this.state.productFilterValue},那么它只会在按钮单击时显示值变化。

但是如果我在底部添加一个组件(我自己的组件),给它作为 prop 相同的值

<FetchedTableGrid
     apiRoute={
       this.state.productFilterChosenValue
     }
/>

它只会在点击 2 次后更新。因此,我打印了我的值并正常工作,并且与第二次单击时更改状态的 prop 值相同。

在我的 FetchedTableGrid 组件中,我已将 console.log(this.props); 放入尝试 componentDidMount 和 componentWillReceiveProps 得到相同的错误。如果我使用componentWillUpdate 或componentDidUpdate,它会无限循环。

【问题讨论】:

  • 如果你能提供这个问题的sn-p代码将会很有帮助。所以我们可以重现这个问题

标签: javascript reactjs setstate


【解决方案1】:

你不能这样做。问题是,如果您设置状态,则 state 会更新,并且由于 setState 函数显式依赖于 state 它会被召回。因此是一个无限循环。

您需要做的是将先前的值作为输入传递给setState:

this.setState((prevState) => ({
  productFilterChosenValue: prevState.productFilterValue,
}));

【讨论】:

  • 我做了这个改变,但没有任何改变。它仍然适用于第二次点击。打印出来的值没问题,但是 prop 不行,如果是同一个 var,这怎么可能?
  • 使用componentWillUpdate时,修改后是否还会出现死循环?
  • 不,我也尝试过使用 componentWillUpdate,但它仍然循环
  • 很好,我已经设置了一个 if 来检查 oldstate 是否与 newstate 相同,并且它显然会停止循环,但我认为这不是正确的方法..
  • 好的,当您的状态更新依赖于先前的状态值时,您确实需要将先前的状态作为输入传递。你可以在这里阅读更多信息:css-tricks.com/understanding-react-setstate
猜你喜欢
  • 1970-01-01
  • 2019-02-24
  • 1970-01-01
  • 2013-07-05
  • 1970-01-01
  • 1970-01-01
  • 2021-02-18
  • 2018-10-02
  • 2016-04-01
相关资源
最近更新 更多