React スキルのレベルアップ: フックの理解と使用

DDD
リリース: 2024-10-29 12:48:02
オリジナル
944 人が閲覧しました

Level Up Your React Skills: Understanding and Using Hooks

React フックは、状態メソッドやライフサイクル メソッドなどの React 機能を機能コンポーネントで使用できるようにする特別な関数です。これらは、コンポーネント モデルを簡素化し、コンポーネント間でステートフル ロジックを共有しやすくするために React 16.8 で導入されました。

React フックの主な特徴:

状態管理: useState のようなフックを使用すると、機能コンポーネントをクラス コンポーネントに変換することなく、機能コンポーネントの状態を追加および管理できます。

副作用: useEffect フックを使用すると、クラス コンポーネントのライフサイクル メソッドと同様に、データのフェッチ、サブスクリプション、DOM の手動変更などの副作用を実行できます。

再利用性: カスタム フックを使用すると、ステートフル ロジックをカプセル化し、さまざまなコンポーネント間で再利用できます。

よりクリーンなコード: フックはコンポーネントを保護するのに役立ちます

内蔵フック

1 useState

  • 説明: 機能コンポーネントに状態を追加できます。
  • 例:
   import React, { useState } from 'react';

   const Counter = () => {
     const [count, setCount] = useState(0);
     return (
       <div>
         <p>Count: {count}</p>
         <button onClick={() => setCount(count + 1)}>Increment</button>
       </div>
     );
   };
ログイン後にコピー
ログイン後にコピー

2 useEffect

  • 説明: 機能コンポーネントでのデータのフェッチやサブスクリプションなどの副作用を管理します。
  • 例:
   import React, { useEffect, useState } from 'react';

   const DataFetcher = () => {
     const [data, setData] = useState(null);
     useEffect(() => {
       fetch('https://api.example.com/data')
         .then(response => response.json())
         .then(setData);
     }, []);
     return <div>{data ? JSON.stringify(data) : 'Loading...'}</div>;
   };
ログイン後にコピー
ログイン後にコピー

3 useContext

  • 説明: コンシューマを必要とせずにコンテキスト値へのアクセスを提供します。
  • 例:
   import React, { useContext } from 'react';

   const ThemeContext = React.createContext('light');

   const ThemedComponent = () => {
     const theme = useContext(ThemeContext);
     return <div className={`theme-${theme}`}>Current theme: {theme}</div>;
   };
ログイン後にコピー
ログイン後にコピー

4 useReducer

  • 説明: Redux と同様に、コンポーネント内の複雑な状態ロジックを管理します。
  • 例:
   import React, { useReducer } from 'react';

   const initialState = { count: 0 };
   const reducer = (state, action) => {
     switch (action.type) {
       case 'increment':
         return { count: state.count + 1 };
       case 'decrement':
         return { count: state.count - 1 };
       default:
         return state;
     }
   };

   const Counter = () => {
     const [state, dispatch] = useReducer(reducer, initialState);
     return (
       <div>
         <p>Count: {state.count}</p>
         <button onClick={() => dispatch({ type: 'increment' })}>Increment</button>
         <button onClick={() => dispatch({ type: 'decrement' })}>Decrement</button>
       </div>
     );
   };

ログイン後にコピー
ログイン後にコピー

5 useMemo

  • 説明: 計算された値をメモ化してパフォーマンスを最適化し、不必要な再計算を回避します。
  • 例:
   import React, { useMemo, useState } from 'react';

   const ExpensiveComputation = ({ number }) => {
     const compute = (num) => {
       return num * 1000; // Simulate an expensive computation
     };
     const result = useMemo(() => compute(number), [number]);
     return <div>Computed Result: {result}</div>;
   };
ログイン後にコピー
ログイン後にコピー

6 コールバックを使用

  • 説明: 依存関係の 1 つが変更された場合にのみ変更されるコールバック関数のメモ化されたバージョンを返します。
  • 例:
   import React, { useCallback, useState } from 'react';

   const Button = React.memo(({ onClick, children }) => {
     console.log('Button rendered');
     return <button onClick={onClick}>{children}</button>;
   });

   const App = () => {
     const [count, setCount] = useState(0);
     const increment = useCallback(() => setCount(c => c + 1), []);
     return (
       <div>
         <p>Count: {count}</p>
         <Button onClick={increment}>Increment</Button>
       </div>
     );
   };
ログイン後にコピー
ログイン後にコピー

7 useRef

  • 説明: コンポーネントの有効期間全体にわたって存続する可変 ref オブジェクトを返します。これは、DOM 要素に直接アクセスする場合に便利です。
  • 例:
   import React, { useRef } from 'react';

   const FocusInput = () => {
     const inputRef = useRef(null);
     const focusInput = () => {
       inputRef.current.focus();
     };
     return (
       <div>
         <input ref={inputRef} type="text" />
         <button onClick={focusInput}>Focus Input</button>
       </div>
     );
   };
ログイン後にコピー
ログイン後にコピー

8 useLayoutEffect

  • 説明: useEffect に似ていますが、すべての DOM 変更後に同期的に実行され、DOM レイアウトの測定が可能になります。
  • 例:
   import React, { useLayoutEffect, useRef } from 'react';

   const LayoutEffectExample = () => {
     const divRef = useRef();
     useLayoutEffect(() => {
       console.log('Height:', divRef.current.clientHeight);
     }, []);
     return <div ref={divRef}>This is a div</div>;
   };
ログイン後にコピー
ログイン後にコピー

9 useImperativeHandle

  • 説明: 親コンポーネントで ref を使用するときに公開されるインスタンス値をカスタマイズします。
  • 例:
   import React, { useState } from 'react';

   const Counter = () => {
     const [count, setCount] = useState(0);
     return (
       <div>
         <p>Count: {count}</p>
         <button onClick={() => setCount(count + 1)}>Increment</button>
       </div>
     );
   };
ログイン後にコピー
ログイン後にコピー

10 useDebugValue
- 説明: デバッグを容易にするために、React DevTools のカスタム フックのラベルを表示します。
- 例:

   import React, { useEffect, useState } from 'react';

   const DataFetcher = () => {
     const [data, setData] = useState(null);
     useEffect(() => {
       fetch('https://api.example.com/data')
         .then(response => response.json())
         .then(setData);
     }, []);
     return <div>{data ? JSON.stringify(data) : 'Loading...'}</div>;
   };
ログイン後にコピー
ログイン後にコピー

カスタムフック

11 useFetch
- 説明: API からデータをフェッチするためのカスタム フック。
- 例:

   import React, { useContext } from 'react';

   const ThemeContext = React.createContext('light');

   const ThemedComponent = () => {
     const theme = useContext(ThemeContext);
     return <div className={`theme-${theme}`}>Current theme: {theme}</div>;
   };
ログイン後にコピー
ログイン後にコピー

12 ローカルストレージを使用する
- 説明: 状態をローカル ストレージと同期して、セッション間でデータを保持します。
- 例:

   import React, { useReducer } from 'react';

   const initialState = { count: 0 };
   const reducer = (state, action) => {
     switch (action.type) {
       case 'increment':
         return { count: state.count + 1 };
       case 'decrement':
         return { count: state.count - 1 };
       default:
         return state;
     }
   };

   const Counter = () => {
     const [state, dispatch] = useReducer(reducer, initialState);
     return (
       <div>
         <p>Count: {state.count}</p>
         <button onClick={() => dispatch({ type: 'increment' })}>Increment</button>
         <button onClick={() => dispatch({ type: 'decrement' })}>Decrement</button>
       </div>
     );
   };

ログイン後にコピー
ログイン後にコピー

13 前を使用
- 説明: 状態またはプロパティの前の値を返します。
- 例:

   import React, { useMemo, useState } from 'react';

   const ExpensiveComputation = ({ number }) => {
     const compute = (num) => {
       return num * 1000; // Simulate an expensive computation
     };
     const result = useMemo(() => compute(number), [number]);
     return <div>Computed Result: {result}</div>;
   };
ログイン後にコピー
ログイン後にコピー

14 デバウンスを使用する
- 説明: 値または関数呼び出しをデバウンスし、指定された遅延が経過するまで実行を遅らせます。
- 例:

   import React, { useCallback, useState } from 'react';

   const Button = React.memo(({ onClick, children }) => {
     console.log('Button rendered');
     return <button onClick={onClick}>{children}</button>;
   });

   const App = () => {
     const [count, setCount] = useState(0);
     const increment = useCallback(() => setCount(c => c + 1), []);
     return (
       <div>
         <p>Count: {count}</p>
         <Button onClick={increment}>Increment</Button>
       </div>
     );
   };
ログイン後にコピー
ログイン後にコピー

15 useOnClickOutside
- 説明: 指定された要素の外側のクリックを検出します。ポップアップやドロップダウンを閉じるのに役立ちます。
- 例:

   import React, { useRef } from 'react';

   const FocusInput = () => {
     const inputRef = useRef(null);
     const focusInput = () => {
       inputRef.current.focus();
     };
     return (
       <div>
         <input ref={inputRef} type="text" />
         <button onClick={focusInput}>Focus Input</button>
       </div>
     );
   };
ログイン後にコピー
ログイン後にコピー

16 useInterval
- 説明: 指定した間隔で関数を繰り返し実行する間隔を設定します。
- 例:

   import React, { useLayoutEffect, useRef } from 'react';

   const LayoutEffectExample = () => {
     const divRef = useRef();
     useLayoutEffect(() => {
       console.log('Height:', divRef.current.clientHeight);
     }, []);
     return <div ref={divRef}>This is a div</div>;
   };
ログイン後にコピー
ログイン後にコピー

17 useTimeout
- 説明: 指定された遅延後に関数を実行するタイムアウトを設定します。
- 例:

   import React, { useImperativeHandle, forwardRef, useRef } from 'react';

   const CustomInput = forwardRef((props, ref) => {
     const inputRef = useRef();
     useImperativeHandle(ref, () => ({
       focus: () => {
         inputRef.current.focus();
       }
     }));
     return <input ref={inputRef} type="text" />;
   });

   const Parent = () => {
     const ref = useRef();
     return (
       <div>
         <CustomInput ref={ref} />
         <button onClick={() => ref.current.focus()}>Focus Input</button>
       </div>
     );
   };
ログイン後にコピー

18 useMediaQuery
- 説明: メディア クエリが一致するかどうかを確認し、レスポンシブ デザイン ロジックを可能にします。
- 例:

import { useDebugValue } from 'react';

    const useCustomHook = (value) => {
      useDebugValue(value ? 'Value is true' : 'Value is false');
      return value;
    };

    const DebugExample = () => {
      const isTrue = useCustomHook(true);
      return <div>Check the React DevTools</div>;
    };

ログイン後にコピー

19 useScrollPosition
- 説明: ウィンドウの現在のスクロール位置を追跡します。
- 例:

 import { useState, useEffect } from 'react';

    const useFetch = (url) => {
      const [data, setData] = useState(null);
      const [loading, setLoading] = useState(true);

      useEffect(() => {
        const fetchData = async () => {
          const response = await fetch(url);
          const result = await response.json();
          setData(result);
          setLoading(false);
        };
        fetchData();
      }, [url]);

      return { data, loading };
    };
ログイン後にコピー

20 useKeyPress
- 説明: 特定のキーが押されたかどうかを検出します。
- 例:

import { useState, useEffect } from 'react';

    const useLocalStorage = (key, initialValue) => {
      const [storedValue, setStoredValue] = useState(() => {
        try {
          const item = window.localStorage.getItem(key);
          return item ? JSON.parse(item) : initialValue;
        } catch (error) {
          console.error(error);
          return initialValue;
        }
      });

      useEffect(() => {
        try {
          window.localStorage.setItem(key, JSON.stringify(storedValue));
        } catch (error) {
          console.error(error);
        }
      }, [key, storedValue]);

      return [storedValue, setStoredValue];
    };

ログイン後にコピー

まとめ

このリストには各フックの説明が含まれており、その目的と使用例をより明確に理解できるようになりました。さらに詳細や例が必要な場合は、お気軽にお問い合わせください!

以上がReact スキルのレベルアップ: フックの理解と使用の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:dev.to
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート