无法访问事件处理程序[duplicate]中的React实例(此)

这个问题在这里已经有答案了
如何在回调中访问正确的’this’

(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引用它

发表评论