使い始めたときは、useState とそのすべての癖に圧倒されるかもしれません。 useRef をミックスに投入すると、大音量の脳内爆発が起こります。
エンジニアは通常、useRef と useState の違いを理解し、どちらを選択すべきかを理解するのが難しいため、useRef と useState の専門性をもう少し深く掘り下げることが有益であると考えました。
ここでは、それぞれについて私の定義を大まかに示しますが、明らかに単純化しすぎています。
useState は、値にアクセスして更新し、再レンダリングをトリガーできるようにするフックです。
useRef は、レンダリングに必要のない値を参照できるようにするフックです。
あなたは、なぜ、それぞれが何をもたらすのかを理解することが重要なのか、と自問しているかもしれません。まあ、実際に機能するという理由だけで、すべてに useState を組み込みたくなるかもしれません。
はい、ただし、コンポーネントが状態プロパティを 5 レベル下に渡してアプリが複雑になればなるほど、途中で大量の不要な更新がトリガーされ、おそらくパフォーマンスの問題が早く発生し始めるでしょう。想像以上に。
多くの開発者が抱いているもう 1 つの誤解は、useRef は DOM 要素の操作とアクセスのみができると考えていることです。これは悲しいことです。なぜなら、皆さんは useRef ができる他の 99 の機能を見逃しているからです。
useState から始めましょう!親愛なる開発者よ、今は耳を傾けてください ʕ◉ᴥ◉ʔ
useState は、変数の値が変更されたときにビューを更新するための強力かつ簡単な方法であり、手動で操作を実行することなく最新の値を画面と同期させます。宣言構文は次のようになります const [memesILiked, setMemesILiked] = useState(9000).
ここで、useState を使用して操作を実行するときに内部で何が起こるかについて話しましょう。
状態値を更新すると再レンダリングがトリガーされます。ご想像のとおり、ビューの再レンダリングはブラウザーにとって非常に処理コストの高い操作です。 React とブラウザーが連携してアプリが確実に更新されるようにする方法は次のとおりです:
ふぅ、それはたくさんのことです...上記のプロセスにより、UI がアプリケーションの状態と同期していることが保証されますが、過度または不必要な再レンダリングがパフォーマンスの問題につながる可能性がある理由も強調されます。 。幸いなことに、React は、useMemo や useCallback など、このプロセスの最適化に役立ついくつかの戦略とツールを提供していますが、それはこの記事の範囲を超えています!
要約すると、useState は非常に便利なフックであり、正しく使用すると、ユーザーに素晴らしいエクスペリエンスを提供できます。たとえば、テーマの切り替えを考えてみましょう。 useState を使用すると、ライト モードとダーク モードを簡単に切り替えることができ、ユーザーは自分の好みに基づいてアプリが変化するのを即座に確認できます。
さて、useRef について話しましょう。 useState は状態が変化したときに再レンダリングをトリガーすることがすべてであるのに対し、useRef は自分自身に決して注目を集めたくない静かな観察者のようなものです。これは、値が変更されたときに再レンダリングする必要がない、変更可能な値を保存するのに最適です。構文は const memeRef = useRef(null).
のようになります。useRef は、DOM 要素に直接アクセスするために最もよく使用されます。たとえば、プログラムで入力フィールドにフォーカスする必要がある場合、useRef はその要素への参照を保持できます。ただし、useRef の機能は DOM アクセスだけにとどまりません。 任意の可変値を保存することもできます。そして、皆さん、ここは魔法が起こる場所です ??? (とにかく私の意見です)。
次のように考えてください。useRef は、再レンダリングをトリガーせずに、レンダリング間で値を保持する方法です。これにより、タイマー、カウンター、さらにはコンポーネントの以前の状態などのデータを保存するのに最適になります。 useState とは異なり、ref を更新しても、コンポーネントを再レンダリングするように React に通知されません。ただ静かに価値を更新し、ビジネスを続けます。
これは実際的な例です。単純なカウンターを実装したいとしますが、カウンターをインクリメントするたびに UI を更新したくないとします。 useRef を使用してカウンター値を保存できます。カウンタは期待どおりに増加しますが、コンポーネントはレンダリングの目的でこの ref 値を気にしないため、再レンダリングは行われません。
useRef は、追加のレンダリングを発生させずに状態の最新の値を保持するのにも優れています。たとえば、interval を使用して値を更新しているが、その値でミリ秒ごとに再レンダリングをトリガーしたくない場合は、useRef が頼りになるツールです。これにより、バックグラウンドで値を変更できるため、UI の応答性が維持され、不必要な再レンダリングが回避されます。
要約すると、useRef は次の用途に最適です。
違いは理解できたと思います願っています (義務を正しく果たしたなら²)、次に、あまり一般的ではない使用例をいくつか見てみましょう。ここでは useRef が縁の下の力持ちであるように感じられるので、もう少し useRef に焦点を当てたいと思います。
コンポーネントのマウント ステータスの追跡: useRef を使用して、コンポーネントがマウントされているかアンマウントされているかを追跡できます。これは、アンマウント後の状態更新を回避するのに役立ちます。
静的な値の保持: 定数やキャッシュされた値など、レンダリング間で変化しない静的な値を保存するには、useState より useRef の方が効率的です。
再初期化の防止: コードの一部がレンダリングごとに再実行されるのを防ぎたい場合 (WebSocket 接続の初期化など)。
以前のコールバックの保存: 以前のコールバック関数への参照を保持する必要がある場合、useRef はコンポーネントのレンダリング サイクルに影響を与えることなく、以前の関数参照を保存できます。
タイマー ID の参照: タイマー (setTimeout や setInterval など) を操作する場合、タイマーが設定またはクリアされるたびに再レンダリングがトリガーされるのを避けるために、タイマー ID を useRef に保存します。
アニメーションのトリガー: アニメーションを強制的にトリガーする場合 (CSS トランジションやスクロール アニメーションなど)、useRef を使用すると、再レンダリングを行わずに DOM 要素と直接対話できます。
useState は、再レンダリングをトリガーする状態の変更を管理し、それに反応するために重要ですが、useRef は、UI を中断せずに状態を管理するのに役立つサイレント パートナーです。
それぞれをいつ使用するかを知ることで、潜在的なパフォーマンスの問題を回避し、React アプリケーションをより効率的で保守しやすくすることができます。
読んでいただきありがとうございます。ここにたどり着いた方は、ポーズをとってハイタッチしてください! ⊹⋛⋋( ਊ )⋌⋚⊹
脚注:
¹ 明らかに誇張です。
² 伝わらない方のために言っておきますが、私は少しドラマチックです。
以上がReact シリーズ: useState と useRefの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。