[解決済み] useMemo vs. useEffect + useState
2022-03-03 17:54:35
質問
を使用するメリットはありますか?
useMemo
を組み合わせて使うのではなく (たとえば集中的に関数を呼び出す場合)
useEffect
と
useState
?
以下は、一見してまったく同じように動作する2つのカスタムフックですが、他に
useMemo
の戻り値は
null
を最初のレンダリングで実行します。
useEffect & useState(ユースエフェクト&ユースステート
import { expensiveCalculation } from "foo";
function useCalculate(someNumber: number): number {
const [result, setResult] = useState<number>(null);
useEffect(() => {
setResult(expensiveCalculation(someNumber));
}, [someNumber]);
return result;
}
使用メモ
import { expensiveCalculation } from "foo";
function useCalculateWithMemo(someNumber: number): number {
return useMemo(() => {
return expensiveCalculation(someNumber);
}, [someNumber]);
};
どちらもパラメータ
someNumber
が変更された場合、そのメモ書きは
useMemo
を蹴っているのでしょうか?
解決方法は?
その
useEffect
と
setState
最初のレンダリングは古いデータで遅延し、その後すぐに新しいデータで追加のレンダリングがキューに入れられます。
があるとします。
function expensiveCalculation(x) { return x + 1; }; // Maybe I'm running this on a literal potato
仮に
someNumber
は初期状態では0です。
-
は
useMemo
を直ちにレンダリングします。1
. -
は
useEffect
のバージョンでレンダリングします。null
そして、コンポーネントがレンダリングした後にエフェクトを実行し、状態を変更し、新しいレンダリングを1
.
そして、もし
someNumber
を 2 に変更します。
-
は
useMemo
が実行され3
がレンダリングされます。 -
は
useEffect
バージョンが実行され、レンダリング1
の正しい値でコンポーネントを再実行します。3
.
頻度という点では
expensiveCalculation
が実行されると、両者は同じ挙動を示しますが
useEffect
の場合、2 倍のレンダリングが発生し、他の理由も含めてパフォーマンスに悪影響があります。
さらに
useMemo
の方がよりクリーンで読みやすいと思います。 不必要なミュータブルステートを導入しないし、可動部品も少ない。
ということは
useMemo
ここで
関連
-
[解決済み】TypeError: 'undefined'はオブジェクトではありません。
-
[解決済み】React、Uncaught ReferenceError。ReactDOMは定義されていません
-
[解決済み】未定義のプロパティ 'forEach' を読み取ることができない
-
[解決済み] ReactのuseEffectでローディング関数を1回だけ呼び出す方法
-
[解決済み] useEffect React Hook使用時の依存性欠如の警告を修正する方法
-
[解決済み] React Hook useEffectの非同期関数に関する警告:useEffect関数はクリーンアップ関数か何も返さないこと
-
[解決済み】useState setメソッドが変更を即座に反映しない。
-
[解決済み】React HooksのPushメソッド(useState)?
-
[解決済み】React Hooks useState()でオブジェクトを使用する。
-
[解決済み】React Hooks useEffectでoldValuesとnewValuesを比較する方法は?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】webpack: モジュールが見つかりません。Error: 解決できない(相対パスで)
-
[解決済み] テスト
-
[解決済み】WebpackとBabelで「このファイルタイプを扱うには適切なローダーが必要な場合があります。
-
[解決済み】getElementByIdはnullを返す?[クローズド]
-
[解決済み】Vueのテンプレートまたはレンダー関数が定義されていない 私はどちらも使っていないのですが?
-
[解決済み】TypeError: res.status は関数ではありません。
-
[解決済み】このオブジェクトの "forEach "はなぜ関数でないのですか?
-
[解決済み】Uncaught TypeError: 未定義のプロパティ 'msie' を読み取れない - jQuery tools
-
[解決済み】 \u003C とは何ですか?
-
[解決済み】module.exports "モジュールが定義されていません"