是,排序很重要。确切的原因是巴贝尔如何处理JSX。您可以在Babel REPL看到:
<MyComponent foo="should not override" {...o}>
</MyComponent>
变为:
React.createElement(MyComponent, _extends({ foo: "overridden" }, o));
哪里_extends
只是Object.assign
,或者如果浏览器不支持它,_extends
在功能上是相同的。根据MDN文档:
如果目标对象中的属性具有相同的键,则它们将被源中的属性覆盖。后来的资源属性会覆盖前面的属性。
(强调是我的)。因此,使用Object.assign
将道具传递给组件时,目标是{ foo: "overridden" }
,而源是o
。由于目标和源中都存在foo
,因此目标中的foo
将被覆盖。这也适用于:
<MyComponent {...o} foo="overridden">
</MyComponent>
这里,JSX是transpiled到对面:
React.createElement(MyComponent, _extends({}, o, { foo: "overriden" }));
这是一个有点不同,因为在这里,目标是一个空的对象,但报价的后半段来自MDN适用。这里的来源是o
和{ foo: "overridden" }
。由于foo
存在于两个来源中,因此{ foo: "overridden" }
中的foo
将从o
覆盖foo
。