0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

React FCが使わない流れがきてるっぽい

Posted at

はじめに

業務でTypeScriptを記述していて、フロントエンドの設計方針についてどうするか議論した。

現場のフロントエンドエンジニアと話をしていたところ、近年は、TypeScriptのReact FCという記述を使わなくなっているということを耳にしたので記事にあらためておきたい。

React FCってなんなん?

Function Component(関数コンポーネント)の略で、Reactの関数コンポーネントに型をつけるための型定義の一つとされています。

.tsx
type Props = {
  text: string;
};

const MyComponent: React.FC<Props> = ({ text }) => {
  return <p>{text}</p>;
};

この関数は「Reactのコンポーネントだよ〜」っていうのを伝えるのに使用されますよね。(書いた本人が納得しているが....)

これを定義することで....

  • この関数はReactのコンポーネントであることを明示できる
  • Propsの型を明確に定義できるので、エラーのデバックがしやすくなる

などといったメリットがあります。

なぜ最近は使われない波にきているのか?

React.FCは、React18以降のプロジェクトで、見かけなくなっているようです。

childrenがReact17までは含まれていたものの、React18以降では含まれなくなりました。

コンポーネントの中身の要素を含むプロパティが不要なときにも使わらなくてはならなくなったこともあり、自動に含まれないことでより柔軟性が増したのではないでしょうか?

.tsx
/** React17まで */
type Props = {
  text: string;
};

const MyComponent: React.FC<Props> = ({ text }) => {
  return <p>{text}</p>;
};
.tsx
/** React18以降 */
type Props = {
    text: string
};

const MyComponent = ({ text }: Props) => {
    return <p>{text}</p>
};

Reactのバージョンが1つ違うだけでこんなに違うものですね。

React VFCっていうのもあるらしい

VFCはVoid Function Component の略で、React.FCと似たように関数コンポーネントの型を定義するためのもの。

ただし、FCとの大きな違いは「children(子要素)」をpropsに自動で含めないという点です。

.tsx
type Props = { title: string };

// childrenを受け取らない場合
const MyComponent: React.VFC<Props> = ({ title }) => {
  return <div>{title}</div>;
};

childrenを受け取りたいときは明示的に含める必要がありそうです。

ただ、このVFCもReact18以降はVFC自体が非推奨となり、FCからもchildrenが削除されましたようです。

おわりに

プロジェクトによるとは思いますが、React.FCという記述を見つけたらなるべく使わないように心がけたいですね。

ReactのVerが18以降かその前なのかも要チェックです

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?