目录
1、错误写法:onClick={this.acceptAlls()}
2、正确写法:onClick={this.acceptAlls}(不带括号)
在写代码时,看到别人写的点击事件,大家写法都不太一样,到底有什么需要注意的呢?
-----------需要注意 正确的绑定方式 和 事件触发时机
1、错误写法:
onClick={this.acceptAlls()}
原因:
- 这样写会立即执行
acceptAlls
函数,而不是在点击时执行。- 括号
()
表示函数调用- 组件渲染时就会执行
acceptAlls
onClick
实际上接收到的是acceptAlls
的返回值(这里是undefined
),而不是函数本身// 例如:错误的写法 class MyComponent extends React.Component { acceptAlls = () => { console.log("执行逻辑", this.props); // }; } <Button onClick={this.acceptAlls() }>保存</Button>
2、正确写法:
onClick={this.acceptAlls}
(不带括号)// 改正后的: class MyComponent extends React.Component { acceptAlls = () => { console.log("执行逻辑", this.props); // }; } <Button onClick={this.acceptAlls}>保存</Button>
总结
在 React 中,
onClick
需要接收一个函数引用(即函数本身),而不是函数的执行结果
-
onClick={函数}
:传递函数引用,点击时执行。-
onClick={函数()}
:立即执行函数,传递返回值(通常是无效的)。- 这里
() => {...}
创建了一个新函数,点击时才会调用acceptAlls(id)
方案1:构造函数绑定
<Button onClick={this.acceptAlls }>保存</Button>
上述写法的前提需要:this指向要明确(要么手动绑定、要么写成箭头函数)
class MyComponent extends React.Component { // 方式1:构造函数中绑定 constructor(props) { super(props); this.acceptAlls = this.acceptAlls.bind(this); // !!!!!! } acceptAlls() { console.log("执行逻辑", this.props); // this 正确指向组件实例 } <Button onClick={this.acceptAlls}>直接确认</Button > }
或
class MyComponent extends React.Component { // 方式2:箭头函数自动绑定 this acceptAlls = () => { console.log("执行逻辑", this.props); // this 始终正确 }; <Button onClick={this.acceptAlls}>直接确认</Button > }
或
class MyComponent extends React.Component { constructor(props) { super(props); this.acceptAlls = this.acceptAlls.bind(this); // ✅ 正确绑定 } acceptAlls(id) { console.log("执行ID:", id, this.props); // ✅ this 正确 } render() { return ( <Button onClick={() => this.acceptAlls(item.id)}>确认</Button> // ✅ 箭头函数传参 + 已绑定的方法 ); } }
方案2:箭头函数包装方法(更简洁)
class MyComponent extends React.Component { // 箭头函数自动绑定 this acceptAlls = (id) => { console.log("确认操作", id, this.props); }; render() { return ( <div> {/* 无参数 */} <Button onClick={this.acceptAlls}>直接确认</Button > {/* 有参数 */} // 需要传递额外参数时(如 id): <Button onClick={() => this.acceptAlls(item.id)}>确认</Button> </div> ); } }
注意:
- 箭头函数一定的性能影响,每次渲染都会创建新函数,可能影响性能(在循环或纯组件中慎用)
方案3:直接绑定 + 参数传递
class MyComponent extends React.Component { constructor(props) { super(props); this.acceptAlls = this.acceptAlls.bind(this); } acceptAlls(id) { /*...*/ } render() { return ( <Button onClick={this.acceptAlls.bind(this, item.id)}>确认</Button> // ✅ bind 直接绑定参数(注意性能影响) ); } }
方案的关键区别说明
方案 this
绑定参数传递 性能影响 构造函数绑定 手动绑定 需箭头函数传参 最优 箭头函数方法 自动绑定 可箭头函数传参 较优 直接bind传参 手动绑定 bind直接传参 较差(每次渲染新建函数) 最佳实践建议
- 优先使用方案2(箭头函数方法):既解决
this
问题,又保持代码简洁- 需要兼容旧代码时用方案1:显式绑定更易理解
- 避免在render中直接bind(方案3):可能引发性能问题