我正在将React组件更新到ES6的过程中,遇到了该问题中描述的问题- 无法在事件处理程序内部访问React实例(this) -即未绑定到组件实例。
这是有道理的,当然可以,但是我对答案的另一部分感到困惑:
请注意,绑定功能会创建一个新功能。您可以将其直接绑定到render中,这意味着每次渲染该组件时都会创建一个新函数,或者将其绑定到构造函数中,后者只会触发一次。 constructor() { this.changeContent = this.changeContent.bind(this); } 与 render() { return <input onChange={this.changeContent.bind(this)} />; }
请注意,绑定功能会创建一个新功能。您可以将其直接绑定到render中,这意味着每次渲染该组件时都会创建一个新函数,或者将其绑定到构造函数中,后者只会触发一次。
constructor() { this.changeContent = this.changeContent.bind(this); }
与
render() { return <input onChange={this.changeContent.bind(this)} />; }
我假设在构造函数中进行绑定是性能等方面的首选方法,但是您知道他们说的 前提 !
这两种方法的权衡是什么?有没有一种情况肯定比另一种更好?还是没关系?
构造函数中绑定的缺点:反应热加载器将无法工作。
在render()中绑定的缺点:性能。
最近,我一直在这样做。它比在渲染中绑定要快一些,但是我愿意为了灵活性和我梦H以求的HMR而牺牲性能。
render(){ return <input onChange={(e) => this.handleChange(e.target.value)}>; }
例如,它提供了更多的灵活性,并且更容易过渡到规范的Input原子。
render(){ return <input onChange={(x) => this.handleChange(x)}>; }
或在需要的地方添加参数:
render(){ return ( <ul> {this.props.data.map((x, i) => { // contrived example return ( <li onMouseMove={(e) => this.handleMove(i, e.pageX, e.pageY)}> {x} </li> ); }} </ul> ); }