这个问题在这里已经有答案了:
如何在回调中访问正确的’this’
(13个答案)
(13个答案)
去年关闭了
我正在用ES6编写一个简单的组件(使用BabelJS),函数this.setState不起作用
典型的错误包括
无法读取未定义的属性“setState”
或
this.setState不是一个函数
你知道为什么吗?代码如下:
从“React”导入React
类SomeClass扩展了React.Component{
建造师(道具){
超级(道具)
this.state={inputContent:'startValue'}
}
发送内容(e){
log('发送输入内容'+React.findDOMNode(React.refs.someref).value)
}
更改内容(e){
this.setState({inputContent:e.target.value})
}
render(){
返回(
<;div>;
<;h4>;输入表单在此处:<;/h4>;
标题:
<;input type=“text”ref=“someref”value={this.inputContent}
onChange={this.changeContent}/>;
<;button onClick={this.sendContent}>;提交<;/button>;
<;/div>;
)
}
}
导出默认类
this.changeContent需要通过this.changeContent.bind(this)绑定到组件实例,然后作为onChange属性传递,否则函数体中的this变量将不会引用组件实例,而是引用窗口。请参阅函数::bind
当使用React.createClass而不是ES6类时,在组件上定义的每个非生命周期方法都会自动绑定到组件实例。请参阅自动绑定
请注意,绑定函数会创建一个新函数。您可以在render中直接绑定它,这意味着每次组件渲染时都会创建一个新函数,也可以在构造函数中绑定它,这将只触发一次
constructor(){
this.changeContent=this.changeContent.bind(this);
}
vs
render(){
返回<;input onChange={this.changeContent.bind(this)}/>;;
}
引用在组件实例上设置,而不是在React.Refs:您需要将React.Refs.someref更改为this.Refs.someref。您还需要将sendContent方法绑定到组件实例,以便this引用它