USEMMEOとUSECOLLACKを使用するときには?
8523 ワード
これらの2つの反応フック.
あなたが反応コンポーネントの中のそれらの高価な操作のうちの1つを含むならば、これらの高価な仕事はコンポーネントを再貸し出すたびに実行されます.そして、アプリケーションを遅くします.
これらの2つのフックは、高価な操作を実行し、キャッシュ内の結果を格納することによって、アプリケーションを最適化するのに役立ちます.次のコンポーネントの再レンダリング、それは操作を実行しません.代わりに、キャッシュから結果を返します.
この高価な操作とそれを使う反応コンポーネントを持っていると仮定しましょう.
今、これはあなたが使用する場合に起こることです
依存配列のアイデアは、高価なオペレーションが必要とする変数を含めるべきです.この例では、高価な操作に依存関係がないので、配列は空です.
このフックはとても似ている
しかし、プロップのうちの1つが親コンポーネントでつくられた関数であるなら、問題があります.親コンポーネントが再レンダリングされるたびに、内部関数が再び作成され、コードが変更されていない場合でも、異なる関数と見なされます.
したがって、キャッシュされたコンポーネントにプロップとして“異なる”関数を渡すと、不要な再レンダリングをトリガします.
を使用する場合
いくつかの開発者が行う一般的な間違いは、これらのフック(および他の最適化手法)を使用することです.しかし、それがコードをより複雑にする(したがって、維持するのが難しい)ので、それは推薦されません、そして、場合によっては、より悪い実行さえします.
あなたがパフォーマンスの問題を見つけた後、これらのテクニックを適用する必要があります.何かがあなたが望むほど速く走らないとき、ボトルネックがどこにあるかについて調査して、その部分を最適化してください.
無料JavaScriptニュースレター!すべての他の月曜日、簡単に、あなたのJavaScriptスキルをレベルに対応できる手順.Click here to subscribe
useMemo
and useCallback
あなたが高価な操作を扱うときに便利です(つまり、非常に複雑で、CPUのように多くの時間とリソースを取ります).あなたが反応コンポーネントの中のそれらの高価な操作のうちの1つを含むならば、これらの高価な仕事はコンポーネントを再貸し出すたびに実行されます.そして、アプリケーションを遅くします.
これらの2つのフックは、高価な操作を実行し、キャッシュ内の結果を格納することによって、アプリケーションを最適化するのに役立ちます.次のコンポーネントの再レンダリング、それは操作を実行しません.代わりに、キャッシュから結果を返します.
これがusememoの仕組みです
この高価な操作とそれを使う反応コンポーネントを持っていると仮定しましょう.
function uselessExpensiveOperation(input) {
const someBigArray = [];
for (let i = 0; i < 5_000_000; i++) {
someBigArray.push(input * i);
}
return someBigArray;
}
function SomeReactComponent() {
const expensiveOperationResult = uselessExpensiveOperation(3);
const output = expensiveOperationResult
.slice(0, 5)
.map(number => <li key={ number }>{ number }</li>);
return <ul>{ output }</ul>;
}
この例の関数は、実行するのに数秒かかることがあります.これは、各数の値が引数として渡す数に依存して500万の数字の配列を返します.あなたが使うならばuselessExpensiveOperation
反応コンポーネントにおいて、直接反応が毎回、レンダリング・プロセスの間、そのコンポーネントを呼ぶときに、それは高価な操作を実行する.今、これはあなたが使用する場合に起こることです
useMemo
キャッシュに値を格納するフックfunction SomeReactComponent() {
const expensiveOperationResult = useMemo(
function() {
return uselessExpensiveOperation(3);
},
[]
);
const output = expensiveOperationResult
.slice(0, 5)
.map(number => <li key={ number }>{ number }</li>);
return <ul>{ output }</ul>;
}
最初の引数useMemo
は、高価な操作を含む関数で、2番目の引数は依存関係の配列です.依存関係のいずれかの値が変更された場合、Replyはキャッシュを削除し、高価なタスクを実行します.依存配列のアイデアは、高価なオペレーションが必要とする変数を含めるべきです.この例では、高価な操作に依存関係がないので、配列は空です.
usecallbackフックの使い方
このフックはとても似ている
useMemo
, しかし、キャッシュに関数を格納します.あなたはそれを使用できるuseMemo
, しかし、構文は少し簡単ですuseCallback
:function SomeReactComponent() {
const cachedFunction = useCallback(
function originalFunction() {
return "some value";
},
[]
);
return <div>{ cachedFunction() }</div>
}
さて、いつそれを使うべきですか.まず、特殊反応関数を説明します.React.memo
. この関数はuseMemo
, しかし、ストアは不必要なレンダリングを防ぐためにキャッシュにコンポーネントを反応させます.以下のようになります.const cachedComponent = React.memo(
function SomeReactComponent(props) {
return <div>Hello, { props.firstName }!</div>
}
);
いくつかの小道具が変わるまで、コンポーネントはキャッシュに格納されます.それが起こるならば、それは再レンダリングして、再びキャッシュにそれを保存します.しかし、プロップのうちの1つが親コンポーネントでつくられた関数であるなら、問題があります.親コンポーネントが再レンダリングされるたびに、内部関数が再び作成され、コードが変更されていない場合でも、異なる関数と見なされます.
したがって、キャッシュされたコンポーネントにプロップとして“異なる”関数を渡すと、不要な再レンダリングをトリガします.
を使用する場合
useCallback
フック、コンポーネントがレンダリングされる最初の関数を作成します.コンポーネントが再びレンダリングされると、それはちょうどキャッシュから機能を取得します、そして、今度は、それは同じ機能です、そして、それは子要素でre - renderingを誘発しません.最適化しない
いくつかの開発者が行う一般的な間違いは、これらのフック(および他の最適化手法)を使用することです.しかし、それがコードをより複雑にする(したがって、維持するのが難しい)ので、それは推薦されません、そして、場合によっては、より悪い実行さえします.
あなたがパフォーマンスの問題を見つけた後、これらのテクニックを適用する必要があります.何かがあなたが望むほど速く走らないとき、ボトルネックがどこにあるかについて調査して、その部分を最適化してください.
無料JavaScriptニュースレター!すべての他の月曜日、簡単に、あなたのJavaScriptスキルをレベルに対応できる手順.Click here to subscribe
Reference
この問題について(USEMMEOとUSECOLLACKを使用するときには?), 我々は、より多くの情報をここで見つけました https://dev.to/nicozerpa/when-to-use-usememo-and-usecallback-in-react-1d17テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol