我正在阅读React教程。这是我向Greeter对象添加属性时无效的代码
let Greeter=React.createClass({
render: ()=>{
let name=this.props.name;
return (<div>
<h1>Hello {name}!</h1>
</div>);
}
});
ReactDOM.render(
<Greeter name ="Your name"/>,
document.getElementById("app")
);
根本没有渲染,当我使用Firefox时,这就是我得到的:
返回statementbrowser.min.js:37:6409之后的无法访问的代码 TypeError:undefined没有属性
答案 0 :(得分:6)
这不起作用的原因是因为您在ES5组件中使用了箭头功能。由于箭头函数,每个the MDN documentation for arrow functions:
,this
未定义
与函数表达式相比,箭头函数表达式的语法更短,而不绑定自己的
this
,参数,超级或new.target。(强调我的)
React执行名为'autobinding'的操作,它会自动为组件中的函数绑定this
以引用该组件。但是因为你正在使用箭头函数,所以绑定不起作用(由于事实,如前所述,箭头函数不绑定this
)。这意味着this
没有绑定,因此在render
函数中未定义render: function() {
//...
}
。这会导致错误,因为undefined没有任何属性。
解决方案是使用常规函数而不是使用React自动绑定的箭头函数:
this
对自动绑定render() {
//...
}
进行反应,以便它引用函数中的组件,以便它可以正常工作。如果您使用的是ES6,则可以使用如下的ES6方法:
this
这只是ES6中常规函数的语法糖,并且会发生绑定。因此,Lambda
将引用组件,而不是未定义的组件,并且将正确接收道具。
答案 1 :(得分:0)
这是因为您使用的是fat arrow function。与常规函数不同,胖箭头函数的this
不受其调用方式的约束。这是在外在背景下的情况。
例如,您的代码可以按如下方式重写,它会做同样的事情(这就是转换器所做的事情)。
// _this will be window in regular mode and undefined in strict mode
let _this = this;
let Greeter = React.createClass({
render: function() {
let name = _this.props.name;
return (
<div>
<h1>Hello {name}!</h1>
</div>
);
}
});
ReactDOM.render(
<Greeter name ="Your name"/>,
document.getElementById("app")
);
使用常规函数修复它,因为React会调用component.render()
,在渲染函数中将this
设置为component