gAN*_*ALF 2 javascript reactjs
我想知道这两个语句在反应中的区别。
<Button onClick={this.Callme}></Button>
<Button onClick={()=>this.Callme()}></Button>
Run Code Online (Sandbox Code Playgroud)
它只是语法,或者在功能上也有任何区别。谢谢
如果函数依赖于实例的调用上下文,并且函数尚未绑定到当前实例,则第一个代码将不起作用,因为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")
);Run Code Online (Sandbox Code Playgroud)
<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>Run Code Online (Sandbox Code Playgroud)
第二个代码有效,因为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")
);Run Code Online (Sandbox Code Playgroud)
<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>Run Code Online (Sandbox Code Playgroud)
如果Callme方法不需要引用实例,那么任何一种类型都onClick可以工作。
此常见问题的其他解决方案包括:
this.Callme = this.Callme.bind(this))onClick={this.Callme.bind(this)}>)将方法定义为构造函数中的箭头函数(或类字段),而不是原型的属性
class Component extends React.Component {
this.Callme = () => {
console.log(this.name);
}
Run Code Online (Sandbox Code Playgroud)| 归档时间: |
|
| 查看次数: |
506 次 |
| 最近记录: |