ホームページ > ウェブフロントエンド > jsチュートリアル > 上級レベル: React のライフサイクル メソッドとフック

上級レベル: React のライフサイクル メソッドとフック

PHPz
リリース: 2024-07-18 00:37:38
オリジナル
803 人が閲覧しました

Senior level: Lifecycle Methods and Hooks in React

上級開発者として、高度な React の概念を理解するだけでなく、専門的に実装して、堅牢で保守可能、スケーラブルなアプリケーションを構築することが求められます。この記事では、必須のフック、カスタム フック、および useReducer による複雑な状態の管理や useMemo と useCallback によるパフォーマンスの最適化などの高度なフック パターンについて詳しく説明します。

React フックの概要

React Hooks は React 16.8 で導入され、クラスを作成せずに状態やその他の React 機能を使用できるようにします。フックは、コンポーネント ロジックを処理するための、より機能的でモジュール式のアプローチを提供します。

フックの主な利点

  1. よりクリーンなコード: フックにより、機能コンポーネントが状態およびライフサイクル メソッドを処理できるようになり、コードがより読みやすく保守しやすくなります。
  2. 再利用性: カスタム フックを使用すると、複数のコンポーネント間でステートフル ロジックを抽出して再利用できます。
  3. シンプルさ: フックは、コンポーネントの状態と副作用を管理するためのより簡単な API を提供します。

必須のフック

使用状態

useState は、機能コンポーネントに状態を追加できるようにするフックです。

例:

import React, { useState } from 'react';

const Counter = () => {
  const [count, setCount] = useState(0);

  return (
    <div>
      <p>You clicked {count} times</p>
      <button onClick={() => setCount(count + 1)}>Click me</button>
    </div>
  );
};

export default Counter;
ログイン後にコピー

この例では、useState はカウント状態変数を 0 に初期化します。setCount 関数は、ボタンがクリックされたときに状態を更新します。

useEffect

useEffect は、データの取得、DOM との直接対話、サブスクリプションの設定など、機能コンポーネントで副作用を実行できるようにするフックです。これは、クラス コンポーネント (componentDidMount、componentDidUpdate、componentWillUnmount) のいくつかのライフサイクル メソッドの機能を組み合わせたものです。

例:

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

const DataFetcher = () => {
  const [data, setData] = useState(null);

  useEffect(() => {
    fetch('https://api.example.com/data')
      .then(response => response.json())
      .then(data => setData(data));
  }, []);

  return (
    <div>
      {data ? <pre class="brush:php;toolbar:false">{JSON.stringify(data, null, 2)}
: 'Loading...'}
); }; export default DataFetcher;
ログイン後にコピー

この例では、useEffect はコンポーネントのマウント時に API からデータを取得します。

useContext

useContext は、特定のコンテキストのコンテキスト値にアクセスできるようにするフックです。

例:

import React, { useContext } from 'react';

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

const ThemedComponent = () => {
  const theme = useContext(ThemeContext);

  return <div>The current theme is {theme}</div>;
};

export default ThemedComponent;
ログイン後にコピー

この例では、useContext は ThemeContext の現在の値にアクセスします。

useReducer

useReducer は、機能コンポーネント内の複雑な状態ロジックを管理できるようにするフックです。これは useState の代替です。

例:

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>
  );
};

export default Counter;
ログイン後にコピー
ログイン後にコピー

この例では、useReducer はリデューサー関数を使用してカウント状態を管理します。

カスタムフック

カスタム フックを使用すると、複数のコンポーネント間でステートフル ロジックを再利用できます。カスタムフックは、組み込みフックを使用する機能です。

例:

import { useState, useEffect } from 'react';

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

  useEffect(() => {
    fetch(url)
      .then(response => response.json())
      .then(data => setData(data));
  }, [url]);

  return data;
};

const DataFetcher = ({ url }) => {
  const data = useFetch(url);

  return (
    <div>
      {data ? <pre class="brush:php;toolbar:false">{JSON.stringify(data, null, 2)}
: 'Loading...'}
); }; export default DataFetcher;
ログイン後にコピー

この例では、useFetch は指定された URL からデータをフェッチするカスタム フックです。

高度なフックパターン

useReducer を使用した複雑な状態の管理

複数のサブ値を含む複雑な状態ロジックを扱う場合、または次の状態が前の状態に依存する場合、useState より useReducer の方が適切な場合があります。

例:

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>
  );
};

export default Counter;
ログイン後にコピー
ログイン後にコピー

この例では、useReducer はリデューサー関数を使用してカウント状態を管理します。

useMemo と useCallback によるパフォーマンスの最適化

使用メモ

useMemo は計算された値をメモ化し、依存関係の 1 つが変更された場合にのみ再計算するフックです。レンダリングごとにコストのかかる計算を防止することで、パフォーマンスの最適化に役立ちます。

例:

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

const ExpensiveCalculation = ({ number }) => {
  const computeFactorial = (n) => {
    console.log('Computing factorial...');
    return n <= 1 ? 1 : n * computeFactorial(n - 1);
  };

  const factorial = useMemo(() => computeFactorial(number), [number]);

  return <div>Factorial of {number} is {factorial}</div>;
};

const App = () => {
  const [number, setNumber] = useState(5);

  return (
    <div>
      <input
        type="number"
        value={number}
        onChange={(e) => setNumber(parseInt(e.target.value, 10))}
      />
      <ExpensiveCalculation number={number} />
    </div>
  );
};

export default App;
ログイン後にコピー

この例では、useMemo により、数値が変更された場合にのみ階乗計算が再計算されることが保証されます。

useコールバック

useCallback は関数をメモ化するフックで、依存関係のいずれかが変更されない限り、レンダリングごとに関数が再作成されるのを防ぎます。これは、参照の等価性に依存する子コンポーネントに安定した関数を渡すのに役立ちます。

例:

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

const Button = React.memo(({ onClick, children }) => {
  console.log(`Rendering button - ${children}`);
  return <button onClick={onClick}>{children}</button>;
});

const App = () => {
  const [count, setCount] = useState(0);

  const increment = useCallback(() => setCount((c) => c + 1), []);

  return (
    <div>
      <Button onClick={increment}>Increment</Button>
      <p>Count: {count}</p>
    </div>
  );
};

export default App;
ログイン後にコピー

この例では、useCallback により、依存関係が変更された場合にのみインクリメント関数が再作成され、Button コンポーネントの不必要な再レンダリングが防止されます。

結論

React フックとライフサイクル手法をマスターすることは、堅牢で保守可能なアプリケーションを構築するために不可欠です。 useState、useEffect、useContext、useReducer などのフック、およびカスタム フックや useMemo や useCallback によるパフォーマンスの最適化などの高度なパターンを理解して利用することで、効率的でスケーラブルな React アプリケーションを作成できます。上級開発者として、これらのスキルを身につけることで、高品質な React アプリケーションを開発および保守する能力が大幅に向上し、チームにとって貴重な人材となります。

以上が上級レベル: React のライフサイクル メソッドとフックの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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