React Learnを読む会(旧Next.js ドキュメントを読む会)
- App Router, Pages Router 何が違う???
- templates の使い道
layouts との違いは state を共有するかどうか?
templates はページ遷移の都度インスタンスを生成する
↓
layout と 共存できるので、pageのlogとったりとか遷移の都度必要になるものにつかうっぽい
templateあまり使わないから見てなかったけどテンプレートが1回生成したら使い回すのに対してパスが変わる度にインスタンスが再生成されるLayoutなのね
app Routing Conventionsの量とpages Routing Conventionsの量を比べるとapp Routing Conventionsになってからめっちゃ予約されたキーワードが増えてるw
けど実用的なキーワードが多いから嬉しみを感じる
が目次に存在しないw
useSelectedLayoutSegments
これを使うとパンくずリストが簡単にできそう
(ただしレイアウトとかを綺麗に組んでいることが前提)
templateさんの特徴はここか
Features that rely on useEffect (e.g logging page views) and useState (e.g a per-page feedback form).
メモ
Linking and Navigationは一旦飛ばし(残り時間がない)
先にGroupRouteをやる
Intercepting Routesもやった
- Vueでもsuspense使えば既存コード改修できそう
絶対に200番を返すマン?
- status code のとこの説明が謎。
ここから React 勉強会
React はどの state を返すかをどのようにして知るのか?
トップレベルでuseStateを呼び出していればok(そこのチェックはlinterがやってくれる)
set関数に値を渡すのと関数を渡すので挙動が変わる
set関数の命名規則
setLastName(ln => ln.reverse());
あとで読む
次回ここから
上記非破壊的メソッド群はES2023なら使える(新jobs環境ではES2017なので使えない)
次回ここから
このへんReactの挙動クイズとしておもしろい(実務でハマるかは置いといて)
次回ここから
- props のバケツリレーで充分ではないか?
- コンポーネント切り出しが不十分なのでは?
次回ここから
RefObjectで簡単に親から子へ渡せるようになったようだ
useRef: イベントハンドラから呼び出し。レンダーに関与しない情報をもたせる(変更をフックに再レンダーされない)
useEffect: 外部との接続(呼び出すための特定のイベントがない)
次回ここから
エフェクトの中で fetch コールを書くことは普通のreactではあまり良くない(ボイラープレートでもろもろ調整が必要)
Next.js 使ってるなら fetch を拡張しているのでこれを使ってキャッシュとか設定して使えばOK
次回ここから
stateの連鎖の所で
場合によっては、イベントハンドラ内で次の state を直接計算することができないことがあります。例えば、複数のドロップダウンがあるフォームで、前のドロップダウンの選択値によって次のドロップダウンの選択肢が変わるところを想像してください。その場合は、ネットワークとの同期が発生しているので、エフェクトを連鎖させることは適切です。
とあってそういう場合はたしかに・・・となった
外部データを使う時は積極的に使っていこう
次回ここから
Reactコンポーネントと外部データをsyncさせたいときは useEffect より useSyncExternalStore のがベター
外部データはReactの世界とは関係なくいつでも変わる可能性があるのでコンポーネントの再レンダーが発生しないのでuseEffectの依存配列に含めることができない(Linterがチェックしてくれる)
グローバルな値やミュータブルな値は依存配列に含めるべき?
LinterがuseEffectの依存配列と見なしてくれない変数はグローバルな値やミュータブルな値であるということになる。無理やり依存配列に含めてもuseEffectの再同期は走らないはずなので注意。
依存配列を「選ぶ」ことはできません。依存配列には、エフェクトで読み取るすべてのリアクティブな値を含める必要があります。リンタがこれを強制します。これにより、無限ループや、エフェクトの再同期が頻発してしまうことがありますが、リンタを抑制してこれらの問題を解決としないでください! 代わりに、以下のことを試してみてください。
エフェクトが 1 つの独立した同期の処理を表していることを確認してください。もし、エフェクトが何も同期していない場合、エフェクトは不要かもしれません。複数の独立したものを同期している場合は、分割してください。
props や state に反応せずに、最新の値を読み取り、エフェクトを再同期したい場合、エフェクトをリアクティブな部分(エフェクト内に残す)と、非リアクティブな部分(いわゆるエフェクトイベントに抽出する)に分割することができます。詳しくは、エフェクトからイベントを分離するを参照してください。
オブジェクトや関数を依存配列に含めないようにしてください。レンダー中に作成したオブジェクトや関数をエフェクトから読み取ると、これらの値は毎回異なるものになります。これにより、エフェクトが毎回再同期されてしまいます。詳しくは、エフェクトから不要な依存関係を削除するを参照してください。
はい
次回ここから
オブジェクト型や関数型の依存値は、エフェクトが必要以上に再同期される原因となりえるので気をつけたい
useEffentなどの依存配列にObjectをそのまま指定ではなくメソッドチェインにする方法がある
( [obj.prop1, obj.prop2, ....] )
useXxxに処理を隠蔽して命名することでそのhookの役割を明示的にすることができる。useXxxに切り出すことは積極的に行ったほうが良い
- 今後の開発で誰かが意図を汲み取れずに余計な処理をuseEffectなどに追加してしまう可能性が減る
- コンポーネント側の処理が簡潔になる
React Learn編終了🎉
明日からReact API REFERENCE編に突入👹