を使用することができReact.cloneElement
ます。アプリケーションでの使用を開始する前に、それがどのように機能するかを知っておくとよいでしょう。これはで紹介さReact v0.13
れています。詳細については、この作業と一緒に何かを読んでください。
<div>{React.cloneElement(this.props.children, {...this.props})}</div>
そのため、Reactのドキュメントの行を用意して、すべてがどのように機能し、どのように利用できるかを理解してください。
React v0.13 RC2では、React.addons.cloneWithPropsと同様に、次のシグネチャを持つ新しいAPIを導入します。
React.cloneElement(element, props, ...children);
cloneWithPropsとは異なり、この新しい関数には、transferPropsToからの機能がないのと同じ理由で、スタイルとclassNameをマージするための組み込みの動作はありません。マジックの完全なリストが正確に何であるかは誰にもわかりません。そのため、コードについて推論することが難しくなり、スタイルが別のシグネチャを持っている場合(たとえば、今後のReact Nativeで)再利用することが難しくなります。
React.cloneElementは、ほぼ以下と同等です。
<element.type {...element.props} {...props}>{children}</element.type>
ただし、JSXやcloneWithPropsとは異なり、refも保持されます。これは、refを持つ子を取得した場合、誤って祖先からそれを盗むことがないことを意味します。新しい要素に同じ参照が添付されます。
一般的なパターンの1つは、子供にマップして新しい小道具を追加することです。cloneWithPropsが参照を失うことについて報告された多くの問題があり、コードについて推論することが難しくなっています。これで、cloneElementで同じパターンに従うと、期待どおりに機能します。例えば:
var newChildren = React.Children.map(this.props.children, function(child) {
return React.cloneElement(child, { foo: true })
});
注:React.cloneElement(child、{ref: 'newRef'})はrefをオーバーライドするため、callback-refsを使用しない限り、2つの親が同じ子へのrefを持つことはまだ不可能です。
プロップは現在不変であるため、これはReact 0.13を導入する上で重要な機能でした。多くの場合、アップグレードパスは要素のクローンを作成することですが、そうすることで参照を失う可能性があります。したがって、ここにはより優れたアップグレードパスが必要でした。Facebookでコールサイトをアップグレードしているときに、この方法が必要であることに気付きました。私たちはコミュニティから同じフィードバックを得ました。そのため、最終リリースの前に別のRCを作成して、これを確実に実現することにしました。
最終的にReact.addons.cloneWithPropsを廃止する予定です。私たちはまだそれをしていませんが、これはあなた自身の使用について考え始め、代わりにReact.cloneElementの使用を検討する良い機会です。実際に削除する前に、必ず非推奨通知を含むリリースを出荷するので、すぐに対処する必要はありません。
もっとここに ...