質問1
Reactにクラスコンポーネントと関数コンポーネントの2つの書き方がありますが、どちらかに統一しての1つのアプリケーション開発をするのか、それとも、あるファイルではクラスコンポーネントで書いて別のファイルでは関数コンポーネントで書いてもいいのでしょうか。
分かる方がいましたら、回答いただけますと幸いです。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答3件
0
ベストアンサー
統一する必要はありません。使い分けることでパフォーマンス改善が見込めます。
特徴としては
- React.Component
クラスコンポーネント。デフォルトでは親がrerenderされると必ずrerenderされる。shouldComponentUpdate()
を実装すると、親がrerenderされてもshouldComponentUpdate()
の戻り値がtrue
でないとrerenderされない。
- React.PureComponent
クラスコンポーネント。親がrerenderされた時、自身のstateとpropsの変化をshallowEqual()
で比較する。変化があればrerenderする。(shouldComponentUpdate()
がshallowEqual()
によって実装済みと考えればよい)
不要なrerenderが減るので軽くなると思われがちだが、shallowEqual()
での比較にもコストがかかっているので、どうせ毎回rerenderされるようなComponentでは使わない方が良い。
- React.FC
関数コンポーネント。親がrerenderされると必ずrerenderされる。Stateを持つこともできるが、持たない場合SFC(Stateless Functional Component)と呼ばれる。クラスコンポーネントよりも動作が軽いことが多いが、constructorを持てない等、可読性が落ちる場合がある。完全にrerenderを必要としないcomponentを作りたい場合は、SFCで作るよりもmemoで作る方が良い。末端のComponentなどの機能の少ない単純なComponentで、rerenderを必要とするものに使用すると良い。
- React.memo
関数コンポーネント。第1引数と第2引数があり、第1引数のreturnがrenderされる。第2引数はrerenderをしないかどうかの関数(areEqual()
)を渡すことができる。shouldComponentUpdate()
に似ているが、あちらは「rerenderするかどうか」であるのに対し、areEqaul()
は「rerenderしないかどうか」なので、returnがtrueの時rerenderしないことに注意。また、第2引数は省略可能で、省略した場合はshallowEqual()
で比較される。
また全体を通して、shallowEqual()
は浅い比較であり、stateやpropsにObjectやArrayを含んでいる場合は正しい比較がなされない可能性があるため注意が必要。
投稿2020/08/13 00:46
総合スコア293
0
良し悪しはありますが、正直なところReact
もしくはReactNative
で何かしらのアプリケーションを実現する上では、どちらの方法を取っても可能です。
その上で、クラスコンポーネントと関数コンポーネントを使い分けると、パフォーマンス向上が見込めたり、可読性が上がったりします。
例えばReact.Component
を使うよりReact.PureComponent
を使った方が余分なrender
を省けますし、細かい単位で部品化するならReact.memo
を使うのもアリです。
もちろんstate
が不要なのであれば関数コンポーネントを使う方が、読み手がコンポーネントの状態に意識を割く必要がなくなり保守等が捗ります(関数コンポーネントでもuseState
等のhook
を用いればstate
は持てますが・・・)
このあたりはどれだけ作り込みに時間を割けるかとの相談なので、ご自身の目的に合わせて(例えば単に簡易プロトタイプを作るだけならそこまでコンポーネント構成を考える必要はないとか)どちらの手法を取るかを選択するといいと思います。
投稿2020/08/12 23:07
総合スコア2411
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
「あるファイルではクラスコンポーネントで書いて別のファイルでは関数コンポーネントで書いてもいい」です。
投稿2020/08/12 21:53
総合スコア146018
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2020/08/13 11:11
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2020/08/13 11:09