React docsからのこのサンプルコードを考えると:
var props = {};
props.foo = x;
props.bar = y;
var component = <Component {...props} />;
...props
が実際に評価するものを調査しましたが、これは次のとおりです。
React.__spread({}, props)
次に{foo: x, bar: y}
と評価されます。
しかし、私が疑問に思っているのは、なぜ私はこれを行うことができないのですか:
var component = <Component props />;
スプレッド演算子のポイントが何なのか理解できません。
これは、コードをより簡潔にするのに役立ちます-props
はオブジェクトであるため、スプレッド演算子は、渡すオブジェクトのpropertiesを取り、コンポーネントに適用します。したがって、コンポーネントには、foo
の値を持つx
およびbar
の値を持つy
のプロパティがあります。
次と同じです。
var component = <Component foo={props.foo} bar={props.bar} />;
ただ短く
Object-rest-spread構文がreactでどのように機能するかについての最良の概要の1つは、 reactpatterns.com で公開されています。
JSXスプレッド属性
スプレッド属性はJSXの機能です。オブジェクトのすべてのプロパティをJSX属性として渡すための構文糖衣です。
これら2つの例は同等です。
// props written as attributes <main className="main" role="main">{children}</main> // props "spread" from object <main {...{className: "main", role: "main", children}} />
これを使用して、
props
を基礎となるコンポーネントに転送します。const FancyDiv = props => <div className="fancy" {...props} />
これで、
FancyDiv
が関係する属性と関係ない属性を追加することが期待できます。<FancyDiv data-id="my-fancy-div">So Fancy</FancyDiv> // output: <div className="fancy" data-id="my-fancy-div">So Fancy</div>
順序が重要であることを覚えておいてください。
props.className
が定義されている場合、className
で定義されているFancyDiv
を上書きします。<FancyDiv className="my-fancy-div" /> // output: <div className="my-fancy-div"></div>
FancyDiv
s classNameを、スプレッドプロパティ({...props})
。// my `className` clobbers your `className` const FancyDiv = props => <div {...props} className="fancy" />
これらのタイプの小道具は適切に処理する必要があります。この場合、著者の
props.className
コンポーネントのスタイル設定に必要なclassName
付き。const FancyDiv = ({ className, ...props }) => <div className={["fancy", className].join(' ')} {...props} />
- reactpatterns.com から引用- @ chantastic
別の優れた概要がbabeljsのブログ投稿で公開されました React on ES6 + Steven Luscher:
属性の分解と拡散
多くの場合、コンポーネントを構成するとき、すべてではなく、親コンポーネントの小道具のほとんどを子コンポーネントに渡したい場合があります。 ES6 +のデストラクチュアリングとJSXスプレッド属性を組み合わせると、これは式なしで可能になります。
class AutoloadingPostsGrid extends React.Component { render() { const { className, ...others // contains all properties of this.props except for className } = this.props; return ( <div className={className}> <PostsGrid {...others} /> <button onClick={this.handleLoadMoreClick}>Load more</button> </div> ); } }
"BabelJS.org blog-React on ES6 +" by Steven Luscherから引用