@@ -40,13 +40,13 @@ export default function ProductPage({ productId, referrer, theme }) {
40
40
41
41
* ` fn` : キャッシュしたい関数の値。任意の引数を取り、任意の値を返すことができます。React は初回のレンダー時に、関数を返します(呼び出しません!)。次のレンダー時に、前回のレンダー時から ` dependencies` が変更されていない場合、React は再び同じ関数を提供します。それ以外の場合は、現在のレンダー時に渡された関数を提供し、後で再利用できる場合に備えて保存します。React は関数を呼び出しません。いつ、どのように呼び出すかをあなたが決定できるように、その関数が返されます。
42
42
43
- * ` dependencies` : ` fn` コード内で参照されるすべてのリアクティブ値のリスト。リアクティブ値には、props、state、およびコンポーネント本体内に直接宣言されたすべての変数と関数が含まれます。リンターが [React 用に設定されている場合](/learn/editor-setup#linting)、すべてのリアクティブ値が正しく依存関係として指定されていることを確認します。依存関係のリストには 、一定数の項目が含まれ、` [dep1, dep2, dep3]` のようにインラインで記述される必要があります。React は、[` Object .is ` ](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is) 比較アルゴリズムを使用して、各依存関係を前回の値と比較します 。
43
+ * ` dependencies` : ` fn` コード内で参照されるすべてのリアクティブ値のリスト。リアクティブ値には、props、state、およびコンポーネント本体内に直接宣言されたすべての変数と関数が含まれます。リンターが [React 用に設定されている場合](/learn/editor-setup#linting)、すべてのリアクティブ値が正しく依存値として指定されていることを確認します。依存値のリストには 、一定数の項目が含まれ、` [dep1, dep2, dep3]` のようにインラインで記述される必要があります。React は、[` Object .is ` ](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is) 比較アルゴリズムを使用して、各依存値を前回の値と比較します 。
44
44
45
45
#### 返り値 {/*returns*/}
46
46
47
47
初回のレンダー時、` useCallback` は渡された ` fn` 関数を返します。
48
48
49
- その後のレンダー時には、前回のレンダーからすでに保存されている ` fn` 関数を返すか(依存関係が変更されていない場合 )、このレンダー時に渡された ` fn` 関数を返します。
49
+ その後のレンダー時には、前回のレンダーからすでに保存されている ` fn` 関数を返すか(依存配列が変更されていない場合 )、このレンダー時に渡された ` fn` 関数を返します。
50
50
51
51
#### 注意事項 {/*caveats*/}
52
52
@@ -79,13 +79,13 @@ function ProductPage({ productId, referrer, theme }) {
79
79
` useCallback` には 2 つの要素を渡す必要があります。
80
80
81
81
1. 再レンダー間でキャッシュしたい関数定義。
82
- 2. 関数内で使用される、コンポーネント内のすべての値を含む<CodeStep step={2}>依存関係のリスト </CodeStep>。
82
+ 2. 関数内で使用される、コンポーネント内のすべての値を含む<CodeStep step={2}>依存値のリスト </CodeStep>。
83
83
84
84
初回のレンダー時に、` useCallback` から取得する<CodeStep step={3}>返される関数</CodeStep>は、あなたが渡した関数になります。
85
85
86
- 次のレンダーでは、React は前回のレンダー時に渡した <CodeStep step={2}>依存関係 </CodeStep>と比較します。依存関係が変更されていない場合 ([` Object .is ` ](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is) で比較)、` useCallback` は前回と同じ関数を返します。それ以外の場合、` useCallback` は*この*レンダーで渡された関数を返します。
86
+ 次のレンダーでは、React は依存配列を前回のレンダー時に渡した <CodeStep step={2}>依存配列 </CodeStep>と比較します。依存配列が変更されていない場合 ([` Object .is ` ](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is) で比較)、` useCallback` は前回と同じ関数を返します。それ以外の場合、` useCallback` は*この*レンダーで渡された関数を返します。
87
87
88
- 言い換えると、` useCallback` は依存関係が変更されるまでの再レンダー間で関数をキャッシュします 。
88
+ 言い換えると、` useCallback` は依存配列が変更されるまでの再レンダー間で関数をキャッシュします 。
89
89
90
90
**これが有用な場合を例を通じて見ていきましょう。**
91
91
@@ -155,7 +155,7 @@ function ProductPage({ productId, referrer, theme }) {
155
155
}
156
156
` ` `
157
157
158
- **` handleSubmit` を ` useCallback` でラップすることで、再レンダー間でそれが*同じ*関数であることを保証します**(依存関係が変更されるまで )。それをする特定の理由がない限り、関数を ` useCallback` でラップする*必要はありません*。この例では、その理由はそれを [` memo` でラップされた](/reference/react/memo)コンポーネントに渡すことで、再レンダーをスキップできるということです。このページの後半で説明されているように、` useCallback` が必要な他の理由もあります。
158
+ **` handleSubmit` を ` useCallback` でラップすることで、再レンダー間でそれが*同じ*関数であることを保証します**(依存配列が変更されるまで )。それをする特定の理由がない限り、関数を ` useCallback` でラップする*必要はありません*。この例では、その理由はそれを [` memo` でラップされた](/reference/react/memo)コンポーネントに渡すことで、再レンダーをスキップできるということです。このページの後半で説明されているように、` useCallback` が必要な他の理由もあります。
159
159
160
160
<Note>
161
161
@@ -221,8 +221,8 @@ function useCallback(fn, dependencies) {
221
221
222
222
` useCallback` で関数をキャッシュすることは、いくつかのケースで有用です。
223
223
224
- - それを [` memo` ](/reference/react/memo) でラップされたコンポーネントにプロパティとして渡すケース。値が変わらなければ、再レンダーをスキップしたいと考えます。メモ化により、依存関係が変更された場合にのみ 、コンポーネントが再レンダーされます。
225
- - あなたが渡している関数が、後で何らかのフックの依存関係として使用されるケース 。たとえば、他の ` useCallback` でラップされた関数がそれに依存している、または [` useEffect` ](/reference/react/useEffect) からこの関数に依存しているケースです。
224
+ - それを [` memo` ](/reference/react/memo) でラップされたコンポーネントにプロパティとして渡すケース。値が変わらなければ、再レンダーをスキップしたいと考えます。メモ化により、依存配列が変更された場合にのみ 、コンポーネントが再レンダーされます。
225
+ - あなたが渡している関数が、後で何らかのフックの依存値として使用されるケース 。たとえば、他の ` useCallback` でラップされた関数がそれに依存している、または [` useEffect` ](/reference/react/useEffect) からこの関数に依存しているケースです。
226
226
227
227
その他のケースで関数を ` useCallback` でラップする利点はありません。それを行っても重大な害はないため、一部のチームは個々のケースについて考えず、可能な限り多くをメモ化することを選択します。欠点は、コードが読みにくくなることです。また、すべてのメモ化が効果的なわけではありません。コンポーネント全体のメモ化を破壊するには「常に新しい」単一の値だけで十分です。
228
228
@@ -234,7 +234,7 @@ function useCallback(fn, dependencies) {
234
234
1. ローカル状態を優先し、必要以上に [state を引き上げないで](/learn/sharing-state-between-components)ください。フォームや、アイテムがホバーされているかどうかのような一時的な状態をツリーのトップやグローバル状態ライブラリに保持しないでください。
235
235
1. [レンダーロジックを純粋に](/learn/keeping-components-pure)保ちます。コンポーネントの再レンダーが問題を引き起こしたり、何らかの目に見える視覚的な結果を生じたりする場合、それはあなたのコンポーネントのバグです!メモ化を追加するのではなく、バグを修正します。
236
236
1. [状態を更新する不要な副作用を避けてください。](/learn/you-might-not-need-an-effect) React アプリケーションのパフォーマンス問題の大部分は、コンポーネントのレンダーを何度も繰り返させる副作用を起源とする、更新の連鎖によって引き起こされます。
237
- 1. [不要な依存関係を副作用から削除してみてください 。](/learn/removing-effect-dependencies) 例えば、メモ化の代わりに、あるオブジェクトや関数を副作用内部やコンポーネント外部に移動させる方が簡単です。
237
+ 1. [不要な依存値を副作用から削除してみてください 。](/learn/removing-effect-dependencies) 例えば、メモ化の代わりに、あるオブジェクトや関数を副作用内部やコンポーネント外部に移動させる方が簡単です。
238
238
239
239
特定のインタラクションの遅延をまだ感じる場合は、[React Developer Tools のプロファイラを使用して](https://legacy.reactjs.org/blog/2018/09/10/introducing-the-react-profiler.html)どのコンポーネントが最もメモ化から利益を得るかを確認し、必要な場所にメモ化を追加してください。これらの原則はコンポーネントのデバッグと理解を容易にするため、どの場合でもこれらに従うことは良いです。長期的には、[自動的にメモ化を行う](https://www.youtube.com/watch?v=lGEMwh32soc)ことを研究していて、これによってこの問題を一度にすべて解決することを目指しています。
240
240
@@ -248,7 +248,7 @@ function useCallback(fn, dependencies) {
248
248
249
249
カウンターの増加は遅く感じられるでしょう。なぜなら、それは遅延させられた ` ShippingForm` の再レンダーを強制するからです。これは、カウンターが変更され、ユーザーの新しい選択を画面上に反映する必要があるため、予想される動作です。
250
250
251
- 次に、テーマの切り替えを試してみてください。**人為的な遅延にも関わらず、` useCallback` と [` memo` ](/reference/react/memo) を組み合わせることで、これは速いです**!` ShippingForm` は、` handleSubmit` 関数が変更されていないため、再レンダーをスキップしました。` handleSubmit` 関数は変更されていません。なぜなら、` productId` と ` referrer` (あなたの ` useCallback` の依存関係 )の両方が最後のレンダー以降に変更されていないからです。
251
+ 次に、テーマの切り替えを試してみてください。**人為的な遅延にも関わらず、` useCallback` と [` memo` ](/reference/react/memo) を組み合わせることで、これは速いです**!` ShippingForm` は、` handleSubmit` 関数が変更されていないため、再レンダーをスキップしました。` handleSubmit` 関数は変更されていません。なぜなら、` productId` と ` referrer` (あなたの ` useCallback` の依存値 )の両方が最後のレンダー以降に変更されていないからです。
252
252
253
253
<Sandpack>
254
254
@@ -665,7 +665,7 @@ button[type="button"] {
665
665
666
666
場合によっては、メモ化されたコールバックから前の状態に基づいて状態を更新する必要があるかもしれません。
667
667
668
- この ` handleAddTodo` 関数は、次の todos を計算するために ` todos` を依存性として指定します 。
668
+ この ` handleAddTodo` 関数は、次の todos を計算するために ` todos` を依存値として指定します 。
669
669
670
670
` ` ` js {6 ,7 }
671
671
function TodoList () {
@@ -678,7 +678,7 @@ function TodoList() {
678
678
// ...
679
679
` ` `
680
680
681
- 通常、メモ化された関数は可能な限り依存性を少なくしたいと思うでしょう 。次の状態を計算するためだけにいくつかの状態を読み込む場合、代わりに[更新関数](/reference/react/useState#updating-state-based-on-the-previous-state)を渡すことでその依存関係を削除できます 。
681
+ 通常、メモ化された関数からは可能な限り依存値を少なくしたいと思うでしょう 。次の状態を計算するためだけにいくつかの状態を読み込む場合、代わりに[更新関数](/reference/react/useState#updating-state-based-on-the-previous-state)を渡すことでその依存値を削除できます 。
682
682
683
683
` ` ` js {6 ,7 }
684
684
function TodoList () {
@@ -691,7 +691,7 @@ function TodoList() {
691
691
// ...
692
692
` ` `
693
693
694
- ここでは、` todos` を依存関係として内部で読み込む代わりに 、*どのように*状態を更新するかについての指示(` todos => [... todos, newTodo]` )を React に渡します。[更新関数についての詳細はこちら。](/reference/react/useState#updating-state-based-on-the-previous-state)
694
+ ここでは、` todos` を依存値として内部で読み込む代わりに 、*どのように*状態を更新するかについての指示(` todos => [... todos, newTodo]` )を React に渡します。[更新関数についての詳細はこちら。](/reference/react/useState#updating-state-based-on-the-previous-state)
695
695
696
696
---
697
697
@@ -717,7 +717,7 @@ function ChatRoom({ roomId }) {
717
717
// ...
718
718
` ` `
719
719
720
- これには問題があります。[全てのリアクティブな値は副作用の依存関係として宣言されなければなりません 。](/learn/lifecycle-of-reactive-effects#react-verifies-that-you-specified-every-reactive-value-as-a-dependency) しかし、` createOptions` を依存関係として宣言すると、あなたの副作用がチャットルームに常に再接続することになります。
720
+ これには問題があります。[全てのリアクティブな値は副作用の依存値として宣言されなければなりません 。](/learn/lifecycle-of-reactive-effects#react-verifies-that-you-specified-every-reactive-value-as-a-dependency) しかし、` createOptions` を依存関係として宣言すると、あなたの副作用がチャットルームに常に再接続することになります。
721
721
722
722
` ` ` js {6 }
723
723
useEffect (() => {
@@ -751,7 +751,7 @@ function ChatRoom({ roomId }) {
751
751
// ...
752
752
` ` `
753
753
754
- これにより、` roomId` が同じ場合に再レンダー間で ` createOptions` 関数が同じであることが保証されます。**しかし、関数の依存性を必要としないようにすることがさらに良いです **。関数をエフェクトの*内部*に移動します。
754
+ これにより、` roomId` が同じ場合に再レンダー間で ` createOptions` 関数が同じであることが保証されます。**しかし、関数の依存値を必要としないようにすることがさらに良いです **。関数をエフェクトの*内部*に移動します。
755
755
756
756
` ` ` js {5 - 10 ,16 }
757
757
function ChatRoom ({ roomId }) {
@@ -773,7 +773,7 @@ function ChatRoom({ roomId }) {
773
773
// ...
774
774
` ` `
775
775
776
- これであなたのコードはよりシンプルになり、` useCallback` が不要になりました。[副作用の依存関係の削除についてさらに学びましょう 。](/learn/removing-effect-dependencies#move-dynamic-objects-and-functions-inside-your-effect)
776
+ これであなたのコードはよりシンプルになり、` useCallback` が不要になりました。[副作用の依存値の削除についてさらに学びましょう 。](/learn/removing-effect-dependencies#move-dynamic-objects-and-functions-inside-your-effect)
777
777
778
778
---
779
779
@@ -808,9 +808,9 @@ function useRouter() {
808
808
809
809
### コンポーネントがレンダーするたびに ` useCallback` が異なる関数を返す {/*every-time-my-component-renders-usecallback-returns-a-different-function*/}
810
810
811
- 第 2 引数として依存関係の配列を指定したかを確認してください !
811
+ 第 2 引数として依存配列を指定したかを確認してください !
812
812
813
- 依存関係の配列を忘れると 、 ` useCallback` は毎回新しい関数を返します。
813
+ 依存配列を忘れると 、 ` useCallback` は毎回新しい関数を返します。
814
814
815
815
` ` ` js {7 }
816
816
function ProductPage ({ productId, referrer }) {
@@ -823,7 +823,7 @@ function ProductPage({ productId, referrer }) {
823
823
// ...
824
824
` ` `
825
825
826
- 以下は、第 2 引数として依存関係の配列を渡す修正版です 。
826
+ 以下は、第 2 引数として依存配列を渡す修正版です 。
827
827
828
828
` ` ` js {7 }
829
829
function ProductPage ({ productId, referrer }) {
@@ -836,7 +836,7 @@ function ProductPage({ productId, referrer }) {
836
836
// ...
837
837
` ` `
838
838
839
- これが役に立たない場合、問題は、少なくとも 1 つの依存関係が前回のレンダーと異なることです。依存関係を手動でコンソールにログ出力することで 、この問題をデバッグできます。
839
+ これが役に立たない場合、問題は、少なくとも 1 つの依存値が前回のレンダーと異なることです。依存値を手動でコンソールにログ出力することで 、この問題をデバッグできます。
840
840
841
841
` ` ` js {5 }
842
842
const handleSubmit = useCallback ((orderDetails ) => {
@@ -846,15 +846,15 @@ function ProductPage({ productId, referrer }) {
846
846
console .log ([productId, referrer]);
847
847
` ` `
848
848
849
- その後、コンソール内の異なる再レンダーからの配列を右クリックし、それぞれに対して「グローバル変数として保存」を選択できます。最初のものが ` temp1` として、2 つ目が ` temp2` として保存されたと仮定すると、ブラウザのコンソールを使用して、両方の配列内の各依存関係が同一であるかどうかを確認できます 。
849
+ その後、コンソール内の異なる再レンダーからの配列を右クリックし、それぞれに対して「グローバル変数として保存」を選択できます。最初のものが ` temp1` として、2 つ目が ` temp2` として保存されたと仮定すると、ブラウザのコンソールを使用して、両方の配列内の各依存値が同一であるかどうかを確認できます 。
850
850
851
851
` ` ` js
852
- Object .is (temp1[0 ], temp2[0 ]); // 配列間で最初の依存関係は同じですか ?
853
- Object .is (temp1[1 ], temp2[1 ]); // 2 番目の依存関係は同じですか ?
854
- Object .is (temp1[2 ], temp2[2 ]); // 依存関係があるすべてのものについて続けます ...
852
+ Object .is (temp1[0 ], temp2[0 ]); // 配列間で最初の依存値は同じですか ?
853
+ Object .is (temp1[1 ], temp2[1 ]); // 2 番目の依存値は同じですか ?
854
+ Object .is (temp1[2 ], temp2[2 ]); // 各依存値があるすべてのものについて続けます ...
855
855
` ` `
856
856
857
- メモ化を壊している依存関係を見つけたら 、それを取り除く方法を見つけるか、または[それもメモ化します。](/reference/react/useMemo#memoizing-a-dependency-of-another-hook)
857
+ メモ化を壊している依存値を見つけたら 、それを取り除く方法を見つけるか、または[それもメモ化します。](/reference/react/useMemo#memoizing-a-dependency-of-another-hook)
858
858
859
859
---
860
860
0 commit comments