神戸学院大学 経営学部 林坂ゼミ

React 入門トップページ

« 戻る 次へ »

React 入門

JavaScript コメント掲示板アプリの開発

State と useState

State(ステート)はコンポーネントの内部状態を管理する仕組みです.ここでは,CreateForm コンポーネントにおいてタイトルと本文のテキストボックスに入力されている値を State で管理することにします.この State を利用することでテキストボックスの表示内容を更新したり取得したりできるようになります.

State を利用するには,useState() 関数で初期化します.この関数の構文は次の通りです.

const [state, setState] = useState(初期値);

State として管理したい変数 abc があったとすると,その値を更新するための関数は setAbc のように命名するのが一般的です.タイトルについては title という変数を管理したいので,その値を更新するための関数を setTitle にします.同様に本文にも body という変数と更新するための関数 setBody を使用します.なお,どちらも初期値は空の文字列とします.

const [title, setTitle] = useState('');
const [body, setBody] = useState('');

この useState によってコンポーネントの内部状態を管理するので,それぞれのテキストボックスに value 属性を追加します.また,useState をプログラムの先頭でインポートします.

src/components/CreateForm.jsimport React from 'react'
import { useState } from 'react';

const CreateForm = () => {
  const [title, setTitle] = useState('');
  const [body, setBody] = useState('');

  return (
    <>
      <hr />
      <article>
        <h2>コメントの新規投稿</h2>
        <form>
          <div>
            <label>
              タイトル:
              <input
                type="text"
                className="textInput"
                value={title}
              />
            </label>
          </div>
          <div>
            <label>
              本文:
              <input
                type="text"
                className="textInput"
                value={body}
              />
            </label>
          </div>
          <div>
            <button>コメントの追加</button>
          </div>
        </form>
      </article>
    </>
  )
}

export default CreateForm

この時点でテキストボックスへの入力が受け付けられないようになりました.テキストボックスへの入力できるようにするためにはそのためのコードを追加することが必要です.このために,タイトルのテキストボックスに onChange 属性を追加し,テキストボックスに変化があったときに実行される関数名 (handleTitleChange) を指定します.

<div>
  <label>
    タイトル:
    <input
      type="text"
      className="textInput"
      value={title}
      onChange={handleTitleChange}
    />
  </label>
</div>

次に,handleTitleChange 関数を定義します.定義する場所は return 文の上で良いでしょう.とりあえずは handleTitleChange が実行されたときにコンソールへログが出力されるようにしておきます.

src/components/CreateForm.js(抜粋)const CreateForm = () => {
  const [title, setTitle] = useState('');
  const [body, setBody] = useState('');

  const handleTitleChange = () => {
    console.log("handleTitleChange");
  };

  return ( ...

ブラウザで確認すると,タイトルのテキストボックスでキー入力を行うと,コンソールに handleTitleChange という文字列が出力されることがわかります.

react-2024-32

引数 event を受け取り次のようにすると,入力された文字列を取得することができます.

src/components/CreateForm.js(抜粋)const handleTitleChange = (event) => {
  console.log(event.currentTarget.value);
};
react-2024-33

setTitle 関数を使って入力された文字列で title の値を更新すると,テキストボックスにもその結果が反映されるようになります.同時にコンポーネントの内部状態として title にも文字列が保持されていることに注意してください.

src/components/CreateForm.js(抜粋)const handleTitleChange = (event) => {
  setTitle(event.currentTarget.value);
};
react-2024-34

同様に本文のテキストボックスにも入力ができるようにすると,コードの全体は次のようになります.

src/components/CreateForm.jsimport React from 'react'
import { useState } from 'react';

const CreateForm = () => {
  const [title, setTitle] = useState('');
  const [body, setBody] = useState('');

  const handleTitleChange = (event) => {
    setTitle(event.currentTarget.value);
  };

  const handleBodyChange = (event) => {
    setBody(event.currentTarget.value);
  };

  return (
    <>
      <hr />
      <article>
        <h2>コメントの新規投稿</h2>
        <form>
          <div>
            <label>
              タイトル:
              <input
                type="text"
                className="textInput"
                value={title}
                onChange={handleTitleChange}
              />
            </label>
          </div>
          <div>
            <label>
              本文:
              <input
                type="text"
                className="textInput"
                value={body}
                onChange={handleBodyChange}
              />
            </label>
          </div>
          <div>
            <button>コメントの追加</button>
          </div>
        </form>
      </article>
    </>
  )
}

export default CreateForm

タイトルと本文に文字列が入力でき,その内部状態を保持できるようになりました.次のページでは新たなコメントを追加できるようにします.

react-2024-35

目次に戻る