onHangeChangeQuanity = (opr) => {
    let { number } = this.state;
    if (opr === '+') {
      this.setState({ number: number+1 }, this.onSubmit);
    } else if (opr === '-' && number !== 0) {
      this.setState({ number: number-1 }, this.onSubmit());
    }
 }

onSubmit = () => {
   let { attributeName, typeOfField } = this.props.attribute;
   let { number } = this.state;
   let attr = { attributeName, typeOfField, selectedValues: [ number ] };
   this.props.onHandle(attr);
}


在上面的示例中,如果条件为(opr === '+'),则调用不带括号的onSubmit函数,它可以查找并显示number的当前状态,但在else条件(opr === '-' && number!==0)中,我在setState中使用带括号的onSubmit()回调,它不会像应有的状态那样更新状态。

有人可以解释带括号和不带括号的javascript函数之间的区别。

谢谢。

最佳答案

由于setState is not guaranteed to be synchronous,它接受回调函数作为第二个参数,在更新组件状态后将调用该函数。


  无法保证对setState调用的同步操作,并且可能会为提高性能而对调用进行批处理。


将该函数作为参考传递(不带括号)可确保仅在组件状态更新后调用onSubmit方法,并且您可以依靠this.state包含新值。

自己调用该函数(带括号)意味着您的onSubmit方法将始终在此this.state具有正确的值之前执行,因为该方法将在setState之前运行。如果这是故意行为,则明确地编写它可能更有意义。

this.onSubmit()
this.setState({ number: number-1 });

10-06 01:33