ReactJS 中的 prevState 是什么?

IT技术 javascript reactjs react-native
2021-04-11 08:56:08

我认为问这个问题可能很愚蠢,但相信我,我是 reactJS 的初学者。可能有人请解释一下我为什么我们使用prevState在ReactjS。我努力去理解但失败了。

这是我的代码。请帮我理解

 state = {
    placeName : '',
    places : []
}



placeSubmitHanlder = () => {
    if(this.state.placeName.trim()===''){
      return;
    }
    this.setState(prevState => {
      return {
        places : prevState.places.concat(prevState.placeName)
      };
    });
  };
3个回答

prevState是您为传递给 setState 回调函数的参数指定的名称。它保存的是setStateReact 触发之前 state 的值由于进行setState批处理,因此当您想根据先前的状态值更新新状态时,了解先前的状态有时很重要。

因此,如果多个 setState 调用正在更新同一状态,则批处理 setState 调用可能会导致设置不正确的状态。考虑一个例子:

state = {
   count: 0
}
updateCount = () => {
    this.setState({ count: this.state.count + 1});
    this.setState({ count: this.state.count + 1});
    this.setState({ count: this.state.count + 1});
    this.setState({ count: this.state.count + 1});
}

在上面的代码中,您可能期望 count 的值为 4,但实际上它是 1,因为最后一次调用 setState 将在批处理期间覆盖任何先前的值。解决此问题的方法是使用功能性 setState:

updateCount = () => {
    this.setState(prevstate => ({ count: prevstate.count + 1}));
    this.setState(prevstate => ({ count: prevstate.count + 1}));
    this.setState(prevstate => ({ count: prevstate.count + 1}));
    this.setState(prevstate => ({ count: prevstate.count + 1}));
}
其实我明白幕后的一切,但在这条线上混淆了 prevState.places.concat这意味着什么。谢谢
2021-05-25 08:56:08
抱歉没看懂..
2021-05-28 08:56:08
您可以查看问题以获取更多详细信息
2021-06-06 08:56:08
知道了谢谢 。最后一个问题 。你能解释一下这段代码吗? this.setState(prevState => { return { places : prevState.places.concat(prevState.placeName) }; });
2021-06-18 08:56:08
prevState.places.concat(prevState.placeName) 将状态中的先前 placeName 值推送到放置状态数组并返回一个我们用来设置放置状态的新数组
2021-06-18 08:56:08

当您想用最后一个状态的参数覆盖当前状态时,可以使用它。

来自 React 文档:

根据 React 文档“setState()为了提高性能,React 可以将多个调用批处理为单个更新。因为this.propsthis.state可能会异步更新,您不应该依赖它们的值来计算下一个状态。”

“要修复它,请使用setState()接受函数而不是对象的第二种形式。该函数将接收先前的状态作为第一个参数,并将更新应用时的props作为第二个参数”

关联

当您使用 setState 设置为新状态时, prevState 是当前状态(在 setState 函数内)。因为 react 可以做一些批处理并且它是异步的,所以状态可能会随着时间的推移而改变,所以你不能依赖这个。
2021-06-10 08:56:08
@S.Haaviv 感谢您的评论。您能否解释一下您在回答中提到的“以前的状态值”。我的代码中出现了以前的状态。
2021-06-12 08:56:08

这是一个带有注释代码的演示,可为您提供更多信息:http : //codepen.io/PiotrBerebecki/pen/rrGWjm

constructor() {
  super();
  this.state = {
    value: 0
  }
}

react文档:https : //facebook.github.io/react/docs/reusable-components.html#es6-classes

[React ES6 class] API 与 React.createClass 类似,但 getInitialState 除外。不是提供单独的 getInitialState 方法,而是在构造函数中设置自己的状态属性。

prevState 来自哪里?

prevState 来自 setState api:https ://facebook.github.io/react/docs/component-api.html#setstate

也可以传递带有签名 function(state, props) 的函数。在某些情况下,当您希望在设置任何值之前将查询 state+props 的先前值的原子更新入队时,这可能很有用。例如,假设我们想增加 state 中的一个值:

this.setState(function(previousState, currentProps) {
  return {
     value: previousState.value + 1
  };
});
您能否解释一下先前值的含义以及该值的来源?.
2021-06-16 08:56:08
@user11037643 react 在内部将“this.state”作为“previousState”。顺便说一句,正如 S.Haviv 和 Shubham Khatri 所解释的,为了覆盖批处理,您必须传递一个函数而不是一个 obj。
2021-06-17 08:56:08
@user11037643 这里是“setState”在幕后实际所做的``` setState<K extends keyof S>( state: ((prevState: Readonly<S>, props: Readonly<P>) => (Pick<S, K > | S | null)) | (Pick<S, K> | S | null), callback?: () => void ): void;``` 所以你的 ``` state = { placeName : '', Places : [] }``` 将是你的 'previousState' 或者你为回调函数的第一个参数输入的任何变量名(function(previousState, currentProps) { return { value: previousState.value + 1 }; }
2021-06-18 08:56:08