tl;dr
Reactのchildrenに特定のpropsを追加したい時は、React.cloneElement
を使う。
やりたいこと
<Dialog closeEvent='onFinish'>
<RegistrationForm/>
</Dialog>
Dialog
はモーダルダイアログっぽく表示するコンポーネントで、中のRegistrationForm
は登録フォームでいろんなところで使える再利用可能な感じに仕上がってるものとする。Dialog
自体としては標準で閉じるボタンを表示するものの、登録フォームでの処理が終わったら自動で閉じたい、なんてこともあるはず。
とはいえ、RegistrationForm
自体はDialog
内で使われることを意識してないので、処理が成功したらモーダルダイアログを閉じる処理をRegistrationForm
自体に入れるわけにもいかない。
Dialog
のchildren
として渡されたコンポーネントの特定のイベントに対して、モーダルダイアログを閉じる処理を設定すればよさそうだが、children
のpropsにどうやって後から指定すれば良いのか。
React.cloneElement
で
https://facebook.github.io/react/docs/top-level-api.html#react.cloneelement
既存のpropsに新しいpropsをマージすることができる。
render() {
return React.cloneElement(
this.props.children,
{マージしたいprops}
);
}
てな感じである。
こちらのfiddleに実装してみた。細かい制御はないが、Content
自体に一切Dialog内にあることを意識させずに、Dialogを閉じる処理を追加できている。
https://jsfiddle.net/hokuma/1mu5opr4/