【发布时间】:2016-10-29 00:43:05
【问题描述】:
我使用 React 已经有一段时间了,我已经习惯了我必须手动将我的组件方法绑定到我的组件实例的概念,因为 React 决定不自动绑定是“惯用的”:
因此我们决定不将这个内置到 React 的类中 模型。您仍然可以在构造函数中显式预绑定方法,如果 你想要的。
class Counter extends React.Component { constructor() { super(); this.tick = this.tick.bind(this); } tick() { ... } ... }-https://facebook.github.io/react/blog/2015/01/27/react-v0.13.0-beta-1.html
我们可以从这个类似的问题http://jsbin.com/citafaradu/2/edit?js,console,output 中清楚地看到这个例子的效果:How to properly bind current object context in ES6 using babelify
但是,最近有人问我基于原型的类和新的 ES2015 类之间是否有任何区别。直观地说,这个答案应该是一个强调的“不!”,因为生成的实例对象自然会有正常的原型并且行为......嗯,就像 JS 对象一样!此外,不绑定到实例的实例方法有什么用?
我试图寻找任何迹象表明这对于 es6 类来说是“惯常的”,但我发现的只是来自 React 开发人员的其他问题,答案如下:
React 的 ES6 类没有自动绑定。这记录在这里: https://facebook.github.io/react/docs/reusable-components.html#no-autobinding
原因是 javascript 的 ES6 类没有自动绑定 也没有[原文如此]。 React 试图不重新发明已经存在的东西 javascript。 ES5 没有很好的类语法,所以 React 不得不发明 它是自己的课程。但是现在有了 ES6 类,我们可以只使用标准 javascript。
- “科迪”,https://github.com/facebook/react/issues/4065
现在我真的很困惑。这可能是 JSX 转译的一个技巧吗?看一下前面例子的 render 方法的输出:
{
key: "render",
value: function render() {
return React.createElement("div",null,
React.createElement("input", {
type: "text", onChange: this.handleBindedChange
}),
React.createElement("br", null),
React.createElement("input", {
type: "text", onChange: this.handleUnbindedChange
}),
React.createElement("br", null),
React.createElement("p",null,"Result: ",this.state.demo)
);
}
}
这里也没有骰子 - babel 输出使用 Object.defineProperty,它绝对会将添加的函数绑定到它们所附加的对象。
所以,我不知所措。我发现的大多数回复都比最终的 es2015 规范更老——因为我在规范本身中找不到任何关于它的内容,是否有任何改变会使 React 团队的方法无效?这是我以某种方式误解的奇怪的编译器吗?反应是否在幕后做了一些古怪的事情来导致这种情况?如果是这样,为什么他们会一再声称这样做是为了符合 ES2015 标准?如果不是,是什么导致了给出的第一个示例中的行为?
【问题讨论】:
-
我不确定你的意思。
Object.defineProperty不会“自动绑定”,调用函数会根据函数的调用方式设置this,与其他任何地方一样。 -
@loganfsmyth,Object.defineProperty 并不是我真正关心的,就像人们一开始甚至会谈论“自动绑定”一样——讨论它的方式可能是来源我的困惑。
-
你可能想看看over here
标签: javascript reactjs ecmascript-6