结合React和es6中Class类, 目的是加深理解react框架中 this 上下文指向问题,记录笔记;react
React 中建立组件的方式已经不少,比较古老的诸如 React.createClass 应该不少人并不陌生。固然,从 React 0.13 开始,可使用 ES6 Class 代替 React.createClass 了,这应该是从此推荐的方法。
可是须要知道,React.createClass 建立的组件,能够自动绑定 this。也就是说,this 这个关键字会自动绑定在组件实例上面。es6
// This magically works with React.createClass
// because `this` is bound for you.
onClick = {this.handleChange}
复制代码
固然,对于组件的建立,官方已经推荐使用 class 声明组件或使用 functional 无状态组件;bash
咱们假定全部的组件都采起 ES6 class 方式声明。这种状况下,this 没法自动绑定。一个常见的解决方案即是:框架
onClick = {this.handleChange.bind(this)}
复制代码
这种方法简明扼要,可是有一个潜在的性能问题:当组件每次从新渲染时,都会有一个新的函数建立。 这听上去貌似是一个很大的问题,可是其实在真正的开发场景中,由此引起的性能问题每每不值一提(除非是大型组件消费类应用或游戏)。函数
这种方法其实和第二种相似,都是用 es6 Class定义,咱们能够隐式绑定 this:
post
//普通函数
handleClick(){
console.log('handleClick--实例',this);
};
render () {
return (
<div>
<Button type="primary" onClick={ ()=>{ this.handleClick() } }>修改 username </Button>
</div>
)
}
复制代码
固然,也与第二种方法同样,它一样存在潜在的性能问题。 下面将要介绍的两种方法,能够有效规避没必要要的性能消耗.性能
constructor 方法是class类的默认构造方法,默认返回实例对象,经过new命令生成对象实例时,自动调用该方法。es6 阮一峰 Classui
constructor(props) {
super(props);
this.handleChange = this.handleChange.bind(this);
}
复制代码
这种方式每每被推荐为“最佳实践”.
可是就我的习惯而言,我认为与前两种方法相比:
constructor 内绑定,在可读性和可维护性上也有些欠缺。同时,咱们知道在 constructor 声明的方法不会存在实例的原型prototype上,而属于实例自己的方法。每一个实例都有一样一个 handleChange,这自己也是一种重复和浪费。this
//箭头函数
handleClick = () => {
console.log('handleClick--实例',this);
// call this function from render
// and this.whatever in here works fine.
};
render () {
return (
<div>
<Button type="primary" onClick={ this.handleClick }>修改 username </Button>
</div>
)
}
复制代码
咱们来总结一下这种方式的优势:
spa