主題
- #Virtual DOM
- #React useState
- #deepdive
- #React Hooks
- #React
作成: 2024-03-14
作成: 2024-03-14 01:53
React界隈は、useが付いたものを本当に好むのが奇妙だ
useServer、useCallback、useState、useMemoなど
カスタムフックもすべてuseが付いている
どこから始まったんだろうか
useStateは有名なフックです。
状態値を保存し、変更されると再レンダリングします。非常にシンプルです。
誰もが知っているあの例です。
pタグだけ?それとも、buttonタグまで?
答えは、useStateが呼び出されたコンポーネント全体です。
ExampleComponentを再レンダリングしますが
仮想DOMを使用して値を比較し、他の場所のみDOMを変更すると言われています。
これは、useStateの構造から答えが出てきます。
上記のコードは、実際のReact useStateコードです。
グローバルオブジェクトからdispatcherを取得してuseStateを呼び出します。
これだけでは、構造が理解できません。
さらに詳しく見てみると、次のコードが出てきます。
hookを取得し、set関数を直接hookにあるqueueにバインドして渡します。
(bindは既存の関数にthisをバインディングし、残りの引数はその関数の引数として使用し、thisがバインディングされた新しい関数を返します)
これだけでは、理由は分かりません。
もう少し詳しく見てみましょう
初期値を毎回割り当てているのが分かります。こうなると、stateが保持されることが説明できません。
もう少し詳しく見てみましょう。hookが何か怪しいです。
currentlyRenderingFiberとworkInProgressHookはグローバル変数です。
右側から割り当てが始まることを利用して、リンクリストを実装した形です。
そのため、フックを調べてみると、次の構造になると予想されます。
先頭に値が追加されていく様子です。
それでも説明がつかないため、他のuseStateの実装を見てみた結果
すべてmountStateを呼び出しているのではなく、再レンダリングされる場合にupdateState、rerenderStateを呼び出していることが分かりました。
したがって、構造は上記の通りであり、イベントに合わせて他の関数が呼び出されるということです。
直接コードを見たい場合は、react/packages/react-reconciler/src/ReactFiberHooks.jsを参照してください。
コメント0