Ja, Bestellung nicht egal. Der genaue Grund ist, wie Babel den JSX transpiliert. Sie können sehen, in der Babel REPL:
<MyComponent foo="should not override" {...o}>
</MyComponent>
Becomes:
React.createElement(MyComponent, _extends({ foo: "overridden" }, o));
Wo _extends
nur Object.assign
ist, oder wenn der Browser nicht unterstützt, _extends
ist funktional gleich. Per der MDN-Dokumentation:
Eigenschaften im Zielobjekt wird durch Eigenschaften in den Quellen überschrieben werden, wenn sie den gleichen Schlüssel haben. Die Eigenschaften der späteren Quellen überschreiben in ähnlicher Weise frühere.
(Hervorhebung ist meins). Wenn Object.assign
verwendet wird, um Requisiten an die Komponente zu übergeben, ist das Ziel { foo: "overridden" }
und die Quelle ist o
. Da foo
sowohl im Ziel als auch in der Quelle vorhanden ist, wird foo
im Ziel überschrieben. Dies gilt auch für:
<MyComponent {...o} foo="overridden">
</MyComponent>
Hier wird die JSX zum gegenüberliegenden transpiled:
React.createElement(MyComponent, _extends({}, o, { foo: "overriden" }));
Es ist ein bisschen anders, weil hier ist das Ziel ein leeres Objekt, aber in der zweiten Hälfte des Zitats von MDN gilt. Die Quellen sind o
und { foo: "overridden" }
. Da in beiden Quellen foo
existiert, überschreibt die foo
in Quelle { foo: "overridden" }
die foo
von o
.