React.js和ES6:没有在构造函数中绑定函数的任何理由
React.js and ES6: Any reason not to bind a function in the constructor
我正在更新一个React组件到ES6的过程中,遇到了这个问题-无法访问React实例(这个)内部事件处理程序-即没有绑定到组件实例。
这很有意义,当然也有效,但我对答案的另一部分感到困惑:
注意绑定一个函数会创建一个新函数。你可以或者直接在渲染中绑定它,这意味着将会有一个新函数在每次组件渲染时创建,或者将其绑定到构造函数,只会触发一次。
constructor() { this.changeContent = this.changeContent.bind(this); }
和
render() { return <input onChange={this.changeContent.bind(this)} />; }
我假设在构造函数中绑定是性能等的首选方法,但是你知道他们说假设!
这两种方法的权衡是什么?有没有一种情况是其中一种肯定比另一种好?还是无所谓?
在构造器中绑定的缺点:react热加载器无法工作。
在render()中绑定的缺点:性能。
最近我一直在做这件事。它比绑定渲染稍微快一点,但我愿意用性能来换取灵活性和我梦寐以求的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>
);
}
我认为你所要理解的是Function.prototype.bind()
将返回一个新函数。所以你基本上每次都会通过在render()
方法中执行绑定动作来创建。render()
方法被多次调用的可能性非常高。
所以在构造函数中这样做意味着你最终只绑定一次,你可以随心所欲地重复使用它。即使多次调用render()
方法,也将使用用不同的绑定上下文创建的相同函数。
是的,理想情况下你应该在构造函数中绑定。这让我想起了几周前我读过的一段代码(检查构造函数)
我认为您已经解决了与重建函数有关的主要问题。我想强调使用箭头函数和属性初始化器的另一个选项。本例中的箭头函数将自动采用本地this
。
。
class MyClass extends React.Component {
changeComponent = (e) => {
// this will refer to the component
}
render = () => {
return <input onChange={this.changeContent} />;
}
}
您可以在这里阅读更多信息:http://babeljs.io/blog/2015/06/07/react-on-es6-plus/
当您想要绑定许多函数时,这可能是一个更好的解决方案。但是,您确实失去了仅仅使用标准函数声明的整洁性。
- 如何在动态创建的节点上绑定函数
- 绑定函数时在IE7中未实现Javascript错误
- jQuery结合了2个绑定函数(类型错误:a是未定义的)
- Jquery函数无法处理动态加载的内容(不是绑定函数)
- 从console.log调用webpack绑定函数/类
- React没有绑定函数调用,尽管有相反的警告
- jQuery使用最后一个参数在Javascript循环中单击绑定函数
- 如何在React Native中为ListView中的每个元素绑定函数
- jquery绑定函数不起作用
- 具有绑定与未绑定函数的数组筛选器
- 绑定函数仅适用于最后一个元素
- 如何将新函数绑定到元素的 onclick 事件,并使其在所有其他绑定函数之前运行
- 绑定函数链接
- 动态 JS 拖动绑定函数限制在线拖动
- 绑定函数的返回语句中参数的推理是什么
- 在jQuery上动态绑定函数
- 确定 JavaScript 函数是否为绑定函数
- jQuery 绑定函数不起作用
- 反应组件中的绑定函数
- Javascript 绑定函数到 Ajax 加载事件