Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 我应该在setState中使用callback,还是可以在React中不使用calback?_Javascript_Reactjs_Ecmascript 6 - Fatal编程技术网

Javascript 我应该在setState中使用callback,还是可以在React中不使用calback?

Javascript 我应该在setState中使用callback,还是可以在React中不使用calback?,javascript,reactjs,ecmascript-6,Javascript,Reactjs,Ecmascript 6,请帮助理解ReactsetState的实际工作原理。 下面是一个例子: 类应用程序扩展了React.Component{//第一个示例 状态={ 点击次数:0 }; handleButtonClick=this.handleButtonClick.bind(this); 把手按钮点击(){ this.setState({//像这样?还是应该使用回调而不是对象? 点击:this.state.clicks+1 }); } render(){ 返回( 计数:{this.state.clicks} 点击

请帮助理解React
setState
的实际工作原理。 下面是一个例子:

类应用程序扩展了React.Component{//第一个示例
状态={
点击次数:0
};
handleButtonClick=this.handleButtonClick.bind(this);
把手按钮点击(){
this.setState({//像这样?还是应该使用回调而不是对象?
点击:this.state.clicks+1
});
}
render(){
返回(
计数:{this.state.clicks}
点击
);
}
}
如果多次调用setstate,则应使用回调:

this.setState(prevState=>({//第二个示例
单击:prevState.clicks+1
}));
this.setState(prevState=>({
单击:prevState.clicks+1
}));
调用的方式如下:
setState
然后
setState
。 但在第一个示例中,我们有一个调用
setState
: 然后单击
setState
,然后单击
setState

看到了吗?在第一个示例中,我们在
setState
之间单击。 在第二个示例中,我们没有单击,而是立即逐个调用

问题:我们应该使用回调而不是对象吗?为什么?现在一切正常

我在互联网上搜索了很长一段时间,但没有找到关于这个案件的好论点


顺便说一句,很抱歉我的英语不好。

我想你所说的回调实际上是指
setState
的函数形式

要回答您的问题,一般的经验法则是——如果状态的下一个值取决于它以前的值——使用函数形式
setState

原因是当您调用
this.setState({clicks:this.state.clicks+1})时多次,对这些调用进行批处理,以避免不必要的对账操作。因此,例如,当您像那样调用3次
setState
时,您希望单击的最终值是
3
,但它将是
1
,因为所有更新都是批处理的,并使用
0
的初始值来计算下一个状态

另一方面,当您使用函数形式
setState
时,状态更新将排队,因此将使用状态的先前值逐个执行更新

.

这里有很多东西:

  • 您应该在您的状态和所有绑定所在的组件中使用构造函数。像这样:
  • setState
    是一个异步操作,因此如果您希望仅在设置状态后发生某些事情,则必须在setState中使用callback,但在您的情况下,您将该函数用作单击处理程序。React会自动处理此问题,您不必担心多次单击按钮。它将始终注册点击并正确增加点击次数

  • 这回答了你的问题吗?谢谢但是你的第二个答案呢?它是怎么工作的?谢谢。我知道你在说什么。但在我的情况下,一切正常。如果我理解你的问题是正确的,我链接的帖子应该提供更多细节。
    class App extends React.Component {
      constructor(props){
        super(props);
        this.state = {
          clicks: 0
        }
        this.handleButtonClick = this.handleButtonClick.bind(this);
      }
    
      //rest of our component here....
    }