useState()フック vs クラスコンポーネント:Reactにおける状態管理のベストプラクティス

2024-04-02

ReactにおけるuseState()フックとは?

従来のクラスコンポーネントでは、this.state オブジェクトを使って状態を管理していました。一方、関数コンポーネントには this キーワードが存在しないため、useState() フックを使って状態を管理する必要があります。

useState() フックは、以下の2つの引数を受け取ります。

  1. 初期値: 最初の状態の値
  2. 状態更新関数: 状態を更新するための関数

useState() フックは、現在の状態状態更新関数ペアを返します。

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

// 状態の読み込み
console.log(count); // 0

// 状態の更新
setCount(count + 1);

// 状態の読み込み
console.log(count); // 1

上記の例では、useState() フックを使って count という状態変数を初期値 0 で作成しています。setCount 関数は、count の値を更新するために使用されます。

useState() フックを使うことで、以下の利点があります。

  • コードが簡潔になる
  • 状態の管理が容易になる
  • テストが容易になる
  • 状態更新関数は常に最新の状態に基づいて呼び出す必要がある

useState() フックは、Reactの関数コンポーネントで状態を管理するための最も重要なフックの一つです。使い方を理解すれば、コードを簡潔に、状態管理を容易に、テストを容易にすることができます。




カウントアップボタン

import React, { useState } from "react";

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

  const handleClick = () => {
    setCount(count + 1);
  };

  return (
    <div>
      <p>カウント: {count}</p>
      <button onClick={handleClick}>カウントアップ</button>
    </div>
  );
};

export default App;

入力フォーム

以下のコードは、useState() フックを使って入力フォームを作成する例です。

import React, { useState } from "react";

function App() {
  const [name, setName] = useState("");

  const handleChange = (event) => {
    setName(event.target.value);
  };

  return (
    <div>
      <p>名前: {name}</p>
      <input type="text" value={name} onChange={handleChange} />
    </div>
  );
};

export default App;

Todoリスト

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

function App() {
  const [todos, setTodos] = useState([]);

  useEffect(() => {
    const savedTodos = localStorage.getItem("todos");
    if (savedTodos) {
      setTodos(JSON.parse(savedTodos));
    }
  }, []);

  const handleAddTodo = () => {
    const newTodo = {
      text: "",
      completed: false,
    };
    setTodos([...todos, newTodo]);
  };

  const handleToggleTodo = (index) => {
    const newTodos = [...todos];
    newTodos[index].completed = !newTodos[index].completed;
    setTodos(newTodos);
  };

  return (
    <div>
      <h1>Todoリスト</h1>
      <ul>
        {todos.map((todo, index) => (
          <li key={index}>
            <input
              type="checkbox"
              checked={todo.completed}
              onChange={() => handleToggleTodo(index)}
            />
            {todo.text}
          </li>
        ))}
      </ul>
      <button onClick={handleAddTodo}>Todoを追加</button>
    </div>
  );
};

export default App;

このコードでは、useState() フックを使って todos という状態変数を初期値 [] (空の配列) で作成しています。useEffect フックは、コンポーネントがマウントされたときに一度だけ実行され、localStorage から保存されたTodoリストを読み込みます。

handleAddTodo 関数は、新しいTodoアイテムを todos 配列に追加します。handleToggleTodo 関数は、指定されたインデックスのTodoアイテムの完了状態を切り替えます。

これらのサンプルコードは、useState() フックの使い方を理解するのに役立ちます。




useState() フックの代替方法

状態管理ライブラリを使う

ReduxやRecoilなどの状態管理ライブラリを使うと、複雑なアプリケーションの state を管理しやすくなります。

クラスコンポーネントを使う

従来のクラスコンポーネントを使うと、this.state オブジェクトを使って状態を管理することができます。

useContext() フックを使うと、コンポーネントツリー全体で状態を共有することができます。

useRef() フックは、状態を保持する必要のない値をレンダリング間で保持するために使用されます。

どの方法を使うべきかは、アプリケーションの複雑性や要件によって異なります。

  • シンプルなアプリケーションであれば、useState() フックで十分です。
  • 複雑なアプリケーションであれば、状態管理ライブラリを使うと良いでしょう。
  • クラスコンポーネントに慣れている場合は、クラスコンポーネントを使って状態を管理することもできます。

以下は、それぞれの方法の利点と欠点です。

useState() フック

利点:

  • シンプルで使いやすい
  • 複雑なアプリケーションには不向き

状態管理ライブラリ

  • 複雑なアプリケーションの state を管理しやすい
  • スケーラブル
  • 学習コストが高い

クラスコンポーネント

  • 慣れ親しんだ方法
  • 状態管理がしやすい
  • 関数コンポーネントよりもコードが冗長になる
  • コンポーネントツリー全体で状態を共有しやすい
  • 状態を保持する必要のない値をレンダリング間で保持できる
  • 状態管理には不向き

useState() フックは、Reactの関数コンポーネントで状態を管理するための最も一般的な方法ですが、他にもいくつかの方法があります。どの方法を使うべきかは、アプリケーションの複雑性や要件によって異なります。


javascript reactjs react-native


サンプルコード:MutationObserver を使って子要素の追加・削除を監視する

JavaScript や jQuery を使用して、DOM (Document Object Model) の変更を監視するには、いくつかの方法があります。 それぞれ異なる利点と欠点があり、状況に応じて最適な方法を選択する必要があります。主な方法...


JavaScript <script>タグ:なぜ</body>タグの後に配置してはいけないのか?

本記事では、なぜ </body> タグの後に <script> タグを配置することが問題なのか、そして適切な配置方法について詳しく解説します。以下の2つの理由から、</body> タグ後に <script> タグを配置することは問題となります。...


Reactコンポーネントの初期化をマスターしよう!getInitialState、constructor、defaultProps、useState徹底比較

この解説では、React と ES6 における getInitialState メソッドの使用方法について説明します。getInitialState は、React コンポーネントの初期状態を設定するために使用されますが、ES6 ではクラスコンポーネントを使用する際に注意が必要です。...


JavaScript、React、Babelを使ってReactで子コンポーネントを動的に追加する

map 関数は、配列の各要素に対して関数を適用し、その結果を新しい配列として返す関数です。React では、map 関数を使って、配列の各要素を子コンポーネントに変換することができます。この例では、items 配列の各要素に対して ChildComponent コンポーネントをレンダリングしています。key プロパティは、React に対して各要素をどのように識別するかを伝えるために使用されます。...


React useEffectフックと配列:データフェッチとレンダリングの高度なテクニック

Reactの useEffect フックは、副作用処理を実行するために使用されます。副作用処理とは、コンポーネントのレンダリング以外の処理を指します。例えば、データのフェッチ、ローカルストレージへの保存、サブスクリプションの作成などが含まれます。...