カテゴリ: React 更新日: 2026/02/07

Reactの非制御コンポーネントの使い方を完全ガイド!初心者でもわかるUncontrolled Components

非制御コンポーネント(Uncontrolled Components)の使い方
非制御コンポーネント(Uncontrolled Components)の使い方

先生と生徒の会話形式で理解しよう

生徒

「Reactのフォームって、全部Stateで管理しないとダメなんですか?」

先生

「いいえ、Stateを使わずに扱う方法もあります。それが非制御コンポーネントです。」

生徒

「えっ、管理しなくて大丈夫なんですか?」

先生

「HTMLの仕組みをそのまま使う方法なので、初心者には分かりやすいですよ。」

1. 非制御コンポーネントとは何か

1. 非制御コンポーネントとは何か
1. 非制御コンポーネントとは何か

非制御コンポーネントとは、入力フォームの値をReactのStateで管理せず、 HTMLがもともと持っている仕組みに任せる方法です。 Reactが細かく管理しないため「非制御」と呼ばれます。

例えるなら、先生が全員のノートを回収せず、 生徒が各自でノートを持っている状態です。 必要なときだけ中身を見せてもらいます。

2. 制御コンポーネントとの違い

2. 制御コンポーネントとの違い
2. 制御コンポーネントとの違い

制御コンポーネントは、入力内容を常にStateに保存します。 一方、非制御コンポーネントは、入力中はReactが関与しません。 必要になった瞬間だけ値を取り出します。

紙に書いたメモをその場で読むのが非制御、 ノートに清書してから読むのが制御、と考えると分かりやすいです。

3. refを使った基本的な非制御コンポーネント

3. refを使った基本的な非制御コンポーネント
3. refを使った基本的な非制御コンポーネント

非制御コンポーネントでは、refという仕組みを使います。 refは「その場所を直接指し示す目印」です。 入力欄そのものに直接アクセスできます。


import React, { useRef } from "react";

function App() {
  const inputRef = useRef(null);

  const handleClick = () => {
    alert(inputRef.current.value);
  };

  return (
    <div>
      <input type="text" ref={inputRef} />
      <button onClick={handleClick}>表示</button>
    </div>
  );
}

export default App;
(入力した文字が、ボタンを押したときに表示されます)

4. defaultValueを使った初期値の設定

4. defaultValueを使った初期値の設定
4. defaultValueを使った初期値の設定

非制御コンポーネントでは、初期値を設定したい場合にdefaultValueを使います。 これは最初に表示する値だけを決めるものです。 途中でReactが値を変更することはありません。


import React, { useRef } from "react";

function App() {
  const inputRef = useRef(null);

  return (
    <div>
      <input type="text" defaultValue="はじめから入っている文字" ref={inputRef} />
      <button onClick={() => alert(inputRef.current.value)}>
        確認
      </button>
    </div>
  );
}

export default App;
(最初から文字が入力された状態で表示されます)

5. フォーム送信で非制御コンポーネントを使う

5. フォーム送信で非制御コンポーネントを使う
5. フォーム送信で非制御コンポーネントを使う

非制御コンポーネントは、フォーム送信との相性が良いです。 入力中の処理が不要で、送信時だけ値を使いたい場合に向いています。


import React, { useRef } from "react";

function App() {
  const nameRef = useRef(null);

  const handleSubmit = (e) => {
    e.preventDefault();
    alert("名前:" + nameRef.current.value);
  };

  return (
    <form onSubmit={handleSubmit}>
      <input ref={nameRef} />
      <button type="submit">送信</button>
    </form>
  );
}

export default App;
(フォーム送信時に入力内容が表示されます)

6. 複数の入力欄を扱う場合

6. 複数の入力欄を扱う場合
6. 複数の入力欄を扱う場合

入力欄が複数ある場合でも、それぞれにrefを用意すれば対応できます。 ReactのStateを増やさなくて済むため、コードがシンプルになります。


import React, { useRef } from "react";

function App() {
  const emailRef = useRef(null);
  const ageRef = useRef(null);

  const handleClick = () => {
    alert(emailRef.current.value + " / " + ageRef.current.value);
  };

  return (
    <div>
      <input placeholder="メール" ref={emailRef} />
      <input placeholder="年齢" ref={ageRef} />
      <button onClick={handleClick}>確認</button>
    </div>
  );
}

export default App;
(それぞれの入力内容がまとめて表示されます)

7. 非制御コンポーネントが向いている場面

7. 非制御コンポーネントが向いている場面
7. 非制御コンポーネントが向いている場面

非制御コンポーネントは、入力途中のチェックが不要な場合に向いています。 例えば、簡単な問い合わせフォームや検索欄などです。

Reactの管理を減らせるため、初心者でも理解しやすく、 HTMLに近い感覚でフォームを作れます。 状況に応じて制御と非制御を使い分けることが大切です。

カテゴリの一覧へ
新着記事
New1
React
スマホ対応!Reactでレスポンシブデザイン対応のコンポーネント設計を初心者向けに解説
New2
React
Reactのライフサイクルとパフォーマンス最適化!初心者でもわかるReact活用法
New3
React
Reactの非制御コンポーネントの使い方を完全ガイド!初心者でもわかるUncontrolled Components
New4
React
TypeScriptでPropsを型定義する方法を徹底解説!初心者でもわかるReactとTypeScript入門
人気記事
No.1
Java&Spring記事人気No1
React
ViteでReact開発環境を構築する手順を完全ガイド!初心者でもできるReactの環境構築
No.2
Java&Spring記事人気No2
React
ReactとTypeScriptの環境構築をやさしく解説!Viteとtsconfigの設定も丁寧に紹介
No.3
Java&Spring記事人気No3
React
ReactのPropsを使ってコンポーネントの表示を動的に切り替える方法を解説!初心者でもわかるReact入門
No.4
Java&Spring記事人気No4
React
ReactでonChangeイベントを使ってフォーム入力値を管理する方法を初心者向けに解説
No.5
Java&Spring記事人気No5
Next.js
Next.jsのappディレクトリの役割を完全解説!初心者でもわかるApp Router入門
No.6
Java&Spring記事人気No6
React
Reactの環境構築とは?初心者でもできるセットアップ手順まとめ
No.7
Java&Spring記事人気No7
React
ReactのuseStateとuseEffectでよくあるエラーと解決方法ガイド!初心者でもわかるReactフック
No.8
Java&Spring記事人気No8
React
useEffectでクリーンアップ関数を使う方法をやさしく解説