packages/utils/src/react.tsx
1. DOMAttributes
2. PropGetter
3. RequiredPropGetter
4. MaybeRenderProp
5. UseIsMountedProps
6. UseIsMountedReturn
7. FunctionReturningPromise
これは関数がPromiseを返すことを表現する型。
8. AsyncState
非同期処理の状態を表現する方。
この型で4つの状態を表現できる。
- 初期状態
- ローディング中
- エラー
- 成功
1. 初期状態
2. ローディング中
3. エラー
4. 成功
9. PromiseType
Promise<T>
型からT
型を抽出するだけの型。
10. AsyncFnReturn
非同期関数の戻り値の型とその状態を管理するための型。
この型は、非同期関数の実行結果とその状態(ローディング、成功、エラー)を一緒に返すために使用される。
StateFromFunctionReturningPromise
Promise<T>
を返す関数(もちろん非同期関数)の処理状態を表現する型。
11. AsyncStateRetry
12. createContext
React標準のReact.createContext
を拡張して使いやすくしたもの、と考えるとわかりやすい。
13. useSafeLayoutEffect
SSR環境やdocument
オブジェクトが存在しない環境においてuseLayoutEffect
をuseEffect
にフォールバックしてくれるフック。
14. useUnmountEffect
コンポーネントがアンマウントされた時に、特定のコールバック関数を実行するためのフック。
15. useIsMounted
16. getValidChildren
引数に渡したReactコンポーネントの子要素のうち、「有効な」子要素のみを抽出する関数。
「有効な」ってどういう意味?
ただ、先述の説明だけじゃこれだけじゃ何にもわからない。ちゃんとReactのドキュメントを読む。
The library for web and native user interfaces
このページを見る限り、React.isValidElement()
関数についてこう書かれている。
isValidElement は値が React 要素 (React element) であるかどうかを判定します。
なるほど、React的には「React element」であることが「有効」であるようだ。
では、「React要素」の具体的な定義はなんだろう?
もうちょっとこのページを読み進めると、こんな事が書いてある。
React 要素と見なされるのは、JSX タグと、createElement によって返されるオブジェクトだけです。例えば、42 のような数値は有効な React ノード (node) ではあります(コンポーネントから返すことができるため)が、有効な React 要素ではありません。配列や、createPortal で作成されたポータルも、React 要素とは見なされません。
なるほど、つまり「React要素」であるためには以下のいずれかの条件を満たしていなければならないらしい。
- JSXタグである(
<span>koralle</span>
や<MyComponent />
みたいな)
createElement
関数で返されるオブジェクトである。
この関数が必要になるケースについても言及されていた。
isValidElement が必要となることは非常に稀です。これが主に役立つのは、要素のみを受け入れる他の API(例えば cloneElement がそうです)を呼び出しており、引数が React 要素でないことによるエラーを避けたい場合です。
17. isValidElement
画面に表示される要素であるかどうかを判定する関数。
これはReact.isValidElement()
関数を拡張して作られている。
18. findChildren
子要素の中から指定した型の子要素を探して抽出する関数。
このテストコードのように、指定した型の子要素の中で最初に見つかった子要素をタプルの第一要素に持ってきて、その他の子要素をタプルの残りの要素に持ってくる。
19. includesChildren
指定した型の子要素を含むかどうかを判定する関数。
使い方はこんな感じ
20. omitChildren
指定した型の子要素を排除する関数。
使い方。
21. pickChildren
子要素の中から指定した型の子要素だけを抽出する関数。
条件を満たす最初の子要素を1つだけ抽出するfindChildren
とは異なり、こちらは条件を満たす子要素をすべて抽出する。
22. cx
配列形式で渡したクラス名を半角スペース区切りで結合して1つの文字列にする関数。
使い方。
23. isRefObject
ReactのRefオブジェクトかどうかを判定する関数。
24. assignRef
Reactのrefを安全に設定できる関数。
25. mergeRefs
26. useMergeRefs
27. useCallbackRef
簡単に言えば、useCallback
フックを拡張してパフォーマンスを向上させたもの。
再レンダリング時にコールバック関数の新しい参照を持つようにするのではなく、あくまで既に保持している参照を更新するようにすることでパフォーマンスを向上させている。
細かく分割しながら処理を見ていく
useRef
フックを使ってコールバック関数への参照を保持するRefObjectを作成する。
再レンダリング時は、そのRefObjectを更新することで同じ参照を使い回す。
最終的な返り値は下のコードブロックを見て分かる通り、useCallback
の返り値と同じ。
28. useUpdateEffect
初回レンダー時には実行されないが、依存配列が更新された時にのみコールバック関数を実行されるような副作用を定義するのに使用するフック。
流れとしてはこんな感じ。
まず、renderCycleRef
とeffectCycleRef
という2つのRefオブジェクトを作成する。
これらのRefオブジェクトで管理するboolean値をtrue
にするタイミングを上手く制御するのがキモ。
次に最初のuseEffect
。
このようなuseEffect
を定義することで、初回レンダー時の副作用の実行をスマートにスキップできる。
次に、2つ目のuseEffect
。このようにすることで2回目以降のレンダー時に副作用が更新されるようにしつつ、且つアンマウントされた場合には副作用が実行されないようにしている。
使い方はこんな感じ。
29. useAsync
30. useAsyncFunc
31. useAsyncRetry
32. createId