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
insidedoSomething
在第二个示例中不会更改。@minus-four将在f中使用它