Asa Tech Blog

学んだことを備忘録として残しています

なぜReact propsをスプレッド演算子で渡すことができるのか?

通常、JSXでComponentにprops を渡す場合、下のように書ける。

const props = { hoge: 'aaa', fuga: 'bbb' }

<Component hoge={props.hoge} fuga={props.huga} />

スプレッド演算子を用いると、より簡潔に書き換えられます.

const props = {hoge: 'aaa', fuga: 'bbb' }
<Component {...props} />

僕は、スプレッド演算子の書き方でReact propsを渡せることに違和感がありました。そのため、なぜReact propsをスプレッド演算子で渡すことができるのか調査しました。

JSXとReact.createElementの関係

公式ドキュメントによれば、JSX とは、つまるところ React.createElement(component, props, ...children) の糖衣構文にすぎないそうです。 JSXで書いたコードは、React.createElementにコンパイルされます。

JSX

<MyButton color="blue" shadowSize={2}>
  Click Me
</MyButton>


React.createElement(
  MyButton,
  {color: 'blue', shadowSize: 2},
  'Click Me'
)

createElement()の第1引数は、タグ名の文字列('div' や 'span' など)、React component 型(クラスもしくは関数)、React fragment 型のいずれか、第2引数は、各propsをまとめてObject化したもの 第3引数は、タグの子要素が入ります

スプレッド構文利用パターンだと下のようになります。React.createElementへのコンパイルをイメージすればなぜreact propsをスプレッド演算子で渡すことができるのか理解できました。

JSX

<MyButton {...props}>
  Click Me
</MyButton>


React.createElement(
  MyButton,
  {..props},
  'Click Me'
)

参考:

ja.reactjs.org

Reactコンポーネントでのスプレッド構文はよくよく考えたら気持ち悪くなかった - Qiita