javascript - 在onclick react中传递函数名和通过回调调用有什么区别
问题描述
我想知道这两个语句在反应中的区别。
<Button onClick={this.Callme}></Button>
<Button onClick={()=>this.Callme()}></Button>
它只是语法,或者在功能上也有任何区别。谢谢
解决方案
如果函数依赖于实例的调用上下文,并且函数尚未绑定到当前实例,则第一个代码将不起作用,因为this
内部callMe
将是undefined
:
class Component extends React.Component {
name = 'component_name';
Callme() {
console.log(this.name);
}
render() {
return (
<button onClick={this.Callme}>Click</button>
);
}
}
// Render it
ReactDOM.render(
<Component />,
document.getElementById("react")
);
<div id="react"></div>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>
第二个代码有效,因为this
匿名箭头函数中的 将从外部范围继承this
,实例:
class Component extends React.Component {
name = 'component_name';
Callme() {
console.log(this.name);
}
render() {
return (
<button onClick={() => this.Callme()}>Click</button>
);
}
}
// Render it
ReactDOM.render(
<Component />,
document.getElementById("react")
);
<div id="react"></div>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>
如果Callme
方法不需要引用实例,那么任何一种都onClick
可以。
此常见问题的其他解决方案包括:
- 在构造函数中绑定方法(
this.Callme = this.Callme.bind(this)
) - 设置回调时绑定方法(
onClick={this.Callme.bind(this)}>
) 将方法定义为构造函数中的箭头函数(或类字段),而不是原型的属性
class Component extends React.Component { this.Callme = () => { console.log(this.name); }
推荐阅读
- security - 为什么包含一个表情符号的域会将我重定向到其他不安全和现有的站点?
- javascript - 使用 requirejs 模块而不用 node 导入它
- java - 如何在 IntelliJ 中选择网络应用程序版本?
- python - 如何从csv文件中删除第一列中的字符串与另一个csv第一列中的字符串相同的行?
- javascript - 使用 javascript 提交 Thymeleaf 更改按钮
- r - ./ 从任何非主页链接单击时,标题中的相对 URL 会导致 404
- python - 在编译代码之前,在 Python 中将用户事件函数值作为字符串返回
- ethereum - NFT 能否用于 Web 应用的身份验证
- r - 从 pdf/rtf 中提取特定文本
- python - “亚当”对象没有属性“亚当”