import React,{Component} from 'react';
class Search extends Component{
constructor(props){
super(props);
this.state = {name:''};
}
handleSearch(){
console.log(this); // null
console.log(this.state.name);// 报错
}
render(){
return (
<div>
<input type="text" value={this.state.value}/>
<button onClick={this.handleSearch}>搜搜</button>
</div>
);
}
}
请问代码中的打印log那里的this为什么是null?handleSearch是button中调用的,怎么也不可能是null啊?应该是button这个dom吧。
另外,在页面中直接这样写:
var handleClick = function (event) {
console.log(this); // 不是null是<div id="foo"></div>
}
document.getElementById('foo').addEventListener('click', handleClick);
document.getElementById('foo').click();
我知道怎么解决。我只想知道react中this为什么不是dom而是null??
更新
原来楼主问的是为什么
this
是null
,而不是DOM
或者window
之类的东西。。。嗯,我也很好奇,所以我查了一下源码,跳来跳去好晕。。。先说一下,按照你的写法,在
development
环境下,是null
。在production
环境下,是undefined
。简单的说一下原因:
babel
编译出来的代码都会添加"use strict"
,变成严格模式。而你知道,如果使用严格模式,而没有手动绑定this
的话,那么this
不是window
,而是undefined
。而如果使用bind(null)
的话,this
就是null
。然后,由于
react
使用的是事件代理,并不是原生的事件,所以他的调用方法并不会像原生那样绑定对象的DOM
。最后,经过源码的观察来看,事件的
callback
在存入的时候,并没有做任何绑定。在调用的时候,在production
下,没有做什么绑定。而在development
下,绑定了null
。(或者这么说不准确,事件的回调在添加的时候,使用proxyMethod
做了一层封装,而在里面是用了apply(this, arguments)
来调用原来的回调函数。而在production
下,没有对proxyMethod
做什么绑定,所以上面apply
时候的this
是undefined
。而在development
下,绑定了null
,所以上面的this
是null
)不知道你明白没。。。
原答案
四种解决方法,任何一种都可以解决
像@hyy1115那样在
constructor
里面绑定一下在
<button onClick={this.handleSearch.bind(this)}>搜搜</button>
绑定这个样子调用:
<button onClick={()=>{ this.handleSearch()}}>搜搜</button>
使用箭头函数可以解决这个问题