414 文字
2 分

ReactコンポーネントはJSXとして呼ぶべき

2023-12-23

React コンポーネントを JSX として記述しない場合、React エレメントとしてトランスパイルされず、React コンポーネント内で useState などを利用しているとバグが発生する原因になる。これは今後のトランスパイルの仕方によって解消する可能性もあるかもしれないし、そもそも解消する必要がないかもしれない。

問題が発生する例#

次のアプリは、ReactNode を返す Hoge コンポーネントと、それを renderHoge という名前の変数に代入しただけの関数に、全く同じ配列の要素をそれぞれに渡して呼ぶ。Shuffle を押すと配列の中身が入れ替わり、数字が入れ替わることを期待する。

https://react-ts-ncsxsw.stackblitz.io/

この例では、renderHoge の方だと再レンダリングがされなくなる。React Devtool の Components タブをよく見ると renderHoge はコンポーネントとして表示されておらず、hooks→eval の中に入っていることが分かる。

コンポーネントとして振る舞わなくなるため、このことを認識せずに利用すると様々なバグの原因になりうる。

対策#

JSX がトランスパイルされるということを意識せずにコードを書いている人はそこそこおり、次のように配列をマップするようなケースで書かれていることが多い。

const List = ({ data, renderItem }) => {
return <ul>{data.map(renderItem)}</ul>;
};

次のように名前を変更して JSX として呼べば回避できる。

const List = ({ data, renderItem: RenderItem }) => {
return (
<ul>
{data.map((item) => {
return <RenderItem key={item.key} {...item} />;
})}
</ul>
);
};
ReactコンポーネントはJSXとして呼ぶべき
https://blog.ohirunewani.com/posts/react-component-should-be-called-as-jsx/
作者
hrdtbs
公開日
2023-12-23
ライセンス
CC BY-NC-SA 4.0