Open18

Reactのコードデザインパターンとか設計原則とか

enpolioenpolio

Reactのリーダブルコードとか設計原則みたいなエントリをまとめていく

いずれ自分でもエントリ書く!

コードパターンに関して、銀の弾丸はどうやらなさそう

enpolioenpolio

https://qiita.com/JNJDUNK/items/e040925e546a45a1d913

  1. render内イベント命令系は切り離す

イベント命令はすべて切り離す原則は良くないような気がする。このQiitaくらい短くて分かりやすい関数なら切り離す必要なさそう。イベント命令をすべて切り離すのではなく、 切り出すことでコードが(切り出す前に比べて)読みやすくなる・理解しやすくなる(ので切り出すことに意味がある) 場合に切り出すのが良い。


https://qiita.com/JNJDUNK/items/2dbb511e38ddbba038b4

  1. useEffectは複数書いても良い

これは必ずしもそうとは限らない気がする。effectの依存関係・実行順序がある場合は、一つにまとめる必要がある。

enpolioenpolio

https://zenn.dev/seya/articles/0317b7a61ee781

  • functionではなくアロー関数を使う
  • 型は基本的にVFCを使う
    • FCもしくはFCをちゃんと書くのは大事(Reactコンポーネントだとわかるので)
    • VFCとFCの違いがあまり分かってないからちゃんと調べよう
  • returnは省略可能でも省略しない
  • propsはdestructureした方が良いかも
    • 個人的には何がpropsとして渡されているか一目瞭然なので冗長でも書いた方が良いと思う
enpolioenpolio

https://zenn.dev/takepepe/articles/howto-withstand-aging-react-component

  • PresentationalConponent / ContainerContainerの区分が大事
  • PresentationalComponentは完全にステートレスなコンポーネント
    • ビジネスロジックは存在しない
    • returnを用いずprops => (...)にする事によってHooks APIの介入を阻む
      • なるほど、賢い
    • ローカル変数とか軽微なstateとかもpropsで渡すのは逆に分かりにくい気がする
    • 完全なUIコンポーネントなのでstoryとか書きやすそう
  • ContainerComponentはステートフルなコンポーネント
    • ここで依存の注入を行う
  • Presentational / Containerの区分は重要だと思う
    • Presentational : APIなど外部とのやり取りが発生するコンポーネント、みたいな認識が良さそう
    • Container : (他のコンポーネントが持っていない)スタイルの情報を一つでも持っているようなコンポーネント、みたいな認識がしっくりくる
enpolioenpolio

https://google.github.io/styleguide/tsguide.html

Do not use import type ... from

  • Google先生はimport typeする必要ないと仰っている
    • importと同じなので、わざわざそんなところに気を割く必要無し
  • でもimport typeすると「このオブジェクトは型なんだな」とすぐに分かるので書いても良い気が...
  • SWRとか使うとimport type使わなきゃいけないっぽい...?(要確認)
enpolioenpolio

https://zenn.dev/haniwa_www/articles/8ebacbd8e24321

stateはプリミティブにする

これは微妙かも。
この例みたいにname, firstName, familyNameだったら一つのまとまりとして扱う方が良い。
stateを無駄に増やさないことでデバッグが簡単になるし、stateの更新・コンポーネントのレンダリングタイミングを制御できるようになる
「モデル」に基づいてstateを作って行くのが良さそう。
業務上nameが他と比べて特別に使うことがあるなら分けたほうが良い。モデル上3つが並列ならまとめて良さそう。

enpolioenpolio

https://zenn.dev/takepepe/articles/cssmodules-naming-convention

一つの UI コンポーネントに必要になるセレクター名称はせいぜい片手で数えられる程度で、両手で数えるぐらいの量になってきた時はコンポーネントの粒度を見直します。これが大抵、よいリファクタに繋がったりします。

なるほど!これは良い設計原則な気がする

enpolioenpolio

ディレクトリ設計の話
ディレクトリ構成は大きく分けると以下の2つに分けられる

  • Layer型(Atomic Designなど)
  • Feature型(Features Directoryなど)

この2つのどちらかではなく、両方の組み合わせみたいなことが良いのでは?
PagesにはFeature型を適用し、ComponentsにはLayer型を適用する

https://speakerdeck.com/teppeita/hurontoentonoteirekutorishe-ji-si-xiang