Open5
普段コンポーネントを作るときに意識していることをまとめる
このイベントに影響を受けて、自分が普段どういう感じにコンポーネントを作っているかをまとめておこうと思った。
付け足し付け足しされるだろうから、スクラップよりはブック化する方が合ってるかな。
上記イベント視聴中にメモしていたもの(自分用)。
あとで分類分けしたりより詳細に書いたりする
- 基本方針、そのコンポーネントに関わることはそのコンポーネントの周辺を探せば済むようにしたい(コロケーション)
- 基本的にコンポーネントはUI責務に特化させるのが見やすくて好き
- コンポーネント内のロジックは安易にカスタムフックや関数に切り出す
- この時の切る場所が悩みどころ。コロケーションが好きなので、近くに切り出すことを意識している
- カスタムフックから返すオブジェクトや関数はメモ化して返す
- 再レンダリングの抑制判断は使う側に任せる。フックからはやることやってるよという状態で返す(uhyoさん記事参照)
- よしこさんが言っていたように、ここをリンターとかで縛れるとなお良き
- コンポーネントがイベントハンドラを受け取る場合は、on~で受け取り、handle~で渡すように意識する
- learn nextのReactのやつにも軽い説明あった
- ちなみに語順は、on〇〇Click、handle〇〇Clickが綺麗。ただ、〇〇が長くなりすぎると分かりづらいので注意。また、onClick〇〇だとClickが動詞みたいに個人的に見えて気持ち悪い。
- コンポーネントのメモ化(React.memo)はあまり意識していないが、基本付けるという方針でもいいのでは?という気がしないでもない。
- memoする際に生じるオーバーヘッドの記事とかあった気がするのでまたそれ読んでおく
- コンポーネントはアロー関数式で作り、型はFCで付ける
- 関数宣言の形式だとmemo化や、forwardRefする際に形を関数式に変える必要が出てくる(確か)。だったら初めから関数式の形の方がいい
- テンプレ作って強制
- 状態を扱う際カスタムフックを作る際、setStateをそのまま外出しすることはせず、目的に応じた関数でラップして、それを外部へ公開する(ある種カプセル化?)
- オブジェクト指向の無闇にセッターを公開しないと同義
- 関係性が比較的強いものであれば、割とライトに同じコンポーネントファイルにexportつけないprivateなコンポーネントとして切り出すことも多い
- クラスで、publicメソッド内からある一連の処理をprivateメソッドに切り分ける感覚
- レイアウトは外側・親側・使う側のコンポーネントが担う(マージンは外ってやつ)
- 子側・使われる側は、どのように使われるかを意識しない(レイアウトに口出さない)
- 切り出したフックの命名は、「use機能名」を意識する。使う側から見た時に「〇〇という機能の利用を宣言する」という意味合いで使えているか。基本useの後は名詞になる。
- ex. useStateは、「"状態"という機能の利用を宣言」というメンタルモデル。
観点
そもそもコンポーネントとはなんぞや。
コンポーネントにはおそらく「レイアウトを規定するコンポーネント」と「UIを規定するコンポーネント」がある。
「レイアウトを規定するコンポーネント」は「〇〇Layout」と命名されるようなものだけではなく、「〇〇Header」のようなものもこちらに属する気がする。
このとき、今回「コンポーネントを作る時に意識していること」といったときのコンポーネントは、後者のUIを規定するコンポーネントのことを主に言っているのではないかと思った。
観点
- 機能追加・削除等の変更・改修が容易であること
- (テストが書きやすいこと)
- コンポーネント単位のテストの旨味がまだあまり分かっていないので微妙
「コンポーネント設計」とタイトルに入れて本を書く。
まず「コンポーネント設計」という際の「コンポーネント」が何を指すのかを定義する。
レイアウトを規定するのではないコンポーネントのこと。UIを責務とする。
その後、テーマを細分化して小さく書いていく(コンポーネント分割、スタイリング、テストなど)。
これらのテーマが相互に絡み合うこともあるかもしれないね。