Javascript 给定React组件中的两个按钮单击之间有什么区别?

Javascript 给定React组件中的两个按钮单击之间有什么区别?,javascript,reactjs,Javascript,Reactjs,给定组件中的两个按钮单击事件之间是否存在任何差异?哪一种是首选的写作方式 export default class App extends Component { doSomething = () => { console.log('Hi'); } render() { return ( <Container> <Button onClick={this.doSomething} title="Test" />

给定组件中的两个按钮单击事件之间是否存在任何差异?哪一种是首选的写作方式

export default class App extends Component {
  doSomething = () => {
    console.log('Hi');
  }
  render() {
    return (
      <Container>
        <Button onClick={this.doSomething} title="Test" /> 
        <Button onClick={() => this.doSomething()} title="Test" />
      </Container>
    );
  }
}
导出默认类应用程序扩展组件{
doSomething=()=>{
console.log('Hi');
}
render(){
返回(
this.doSomething()}title=“Test”/>
);
}
}

首先,我们将了解何时同时使用这两种方法:

  • onClick={this.doSomething}
    :这是直接使用类变量,但在需要向函数传递参数时不能使用。为此,第二种方法是救援。 将参数传递给此的一种方法是:

    onClick={this.doSomething.bind(params,this)}

  • onClick={()=>this.doSomething()}
    :您可以将参数作为

    onClick={()=>this.doSomething(param1,param2)}


  • 另外,需要注意的一点是,当组件重新渲染时,每次都会为第二个组件分配内存,而第一个组件只使用内存引用。因此,如果您不必在函数中传递参数,则第一个更好。

    首先,我们将查看何时同时使用这两个参数:

  • onClick={this.doSomething}
    :这是直接使用类变量,但在需要向函数传递参数时不能使用。为此,第二种方法是救援。 将参数传递给此的一种方法是:

    onClick={this.doSomething.bind(params,this)}

  • onClick={()=>this.doSomething()}
    :您可以将参数作为

    onClick={()=>this.doSomething(param1,param2)}

  • 另外,需要注意的一点是,当组件重新渲染时,每次都会为第二个组件分配内存,而第一个组件只使用内存引用。因此,如果您不必在函数中传递参数,第一个更好

    我们通常建议在构造函数中绑定或使用类 字段语法,以避免此类性能问题

    我们通常建议在构造函数中绑定或使用类 字段语法,以避免此类性能问题


    当不需要传递参数时,可以使用

    {this.doSomething}
    
    但是,如果需要将参数传递给函数,则这将导致方法立即执行:

    {this.doSomething(param)}
    
    因此,为了不立即执行该函数,我们需要像您使用的那样使用arrow方法:

    {() => this.doSomething(param)}
    

    因此,在你的情况下,两者是相同的。因为它们只在调用onClick时执行,即单击元素


    奖金:

    即使要传递参数,也可以使用第一种方法:

    {this.doSomething(param)}
    
    但为此,您需要如下定义您的方法:

    doSomething = (param) => () => {
      console.log('Hi');
    }
    

    此外,如果您希望使用事件对象,则可以使用如下所示:

    doSomething = (param) => (event) => {
      console.log('Hi');
    }
    
    或者,使用第二种方法,即使用箭头功能:

    {(event)=>this.doSomething(event,param)}
    
    doSomething = (param) => () => {
    

    显然,如果您担心性能,我建议不要使用内联箭头函数。首选的使用方式:

    doSomething = (param1, param2,) => (event) => {
    

    误解:

    有些人可能会发现,不使用内联箭头函数传递参数的方法也可以工作。但这是不正确的。让我澄清一下

    当您使用
    {this.doSomething(param)}
    时,此函数似乎可以很好地处理其参数。但是如果您更改处理程序中的状态,那么您将知道其中的巨大差异。您将获得超过最大更新深度的错误

    但是,同样,您可以避免该错误,也可以避免性能问题,您需要像前面使用箭头函数所述那样定义方法:

    {(event)=>this.doSomething(event,param)}
    
    doSomething = (param) => () => {
    

    当不需要传递参数时,可以使用

    {this.doSomething}
    
    但是,如果需要将参数传递给函数,则这将导致方法立即执行:

    {this.doSomething(param)}
    
    因此,为了不立即执行该函数,我们需要像您使用的那样使用arrow方法:

    {() => this.doSomething(param)}
    

    因此,在你的情况下,两者是相同的。因为它们只在调用onClick时执行,即单击元素


    奖金:

    即使要传递参数,也可以使用第一种方法:

    {this.doSomething(param)}
    
    但为此,您需要如下定义您的方法:

    doSomething = (param) => () => {
      console.log('Hi');
    }
    

    此外,如果您希望使用事件对象,则可以使用如下所示:

    doSomething = (param) => (event) => {
      console.log('Hi');
    }
    
    或者,使用第二种方法,即使用箭头功能:

    {(event)=>this.doSomething(event,param)}
    
    doSomething = (param) => () => {
    

    显然,如果您担心性能,我建议不要使用内联箭头函数。首选的使用方式:

    doSomething = (param1, param2,) => (event) => {
    

    误解:

    有些人可能会发现,不使用内联箭头函数传递参数的方法也可以工作。但这是不正确的。让我澄清一下

    当您使用
    {this.doSomething(param)}
    时,此函数似乎可以很好地处理其参数。但是如果您更改处理程序中的状态,那么您将知道其中的巨大差异。您将获得超过最大更新深度的错误

    但是,同样,您可以避免该错误,也可以避免性能问题,您需要像前面使用箭头函数所述那样定义方法:

    {(event)=>this.doSomething(event,param)}
    
    doSomething = (param) => () => {
    

    对于第二个示例,此
    内部
    doSomething
    不会更改。@对于第一个示例,它会更改吗?它已经绑定到实例。@DaveNewton实际上没有任何限制,对于arrow函数没有
    这个
    。我没有看到它是一个箭头函数。@MinusFour我不确定“没有
    这个
    ”是什么意思。@DaveNewton没有本地
    这个
    绑定箭头函数。您仍然可以在arrow函数中使用
    this
    ,因为它不属于arrow函数。
    this
    inside
    doSomething
    在第二个示例中不会更改。@minus-four将在f中使用它