添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

useState は、コンポーネントに state 変数 を追加するための React フックです。

const [state, setState] = useState(initialState)

リファレンス

useState(initialState)

コンポーネントのトップレベルで useState を呼び出して、 state 変数 を宣言します。

import { useState } from 'react';

function MyComponent() {
const [age, setAge] = useState(28);
const [name, setName] = useState('Taylor');
const [todos, setTodos] = useState(() => createTodos());
// ...

state 変数は慣習として、 分割代入 を利用して [something, setSomething] のように命名します。

さらに例を見る

  • initialState : state の初期値です。どんな型の値でも渡すことができますが、関数を渡した場合は特別な振る舞いをします。この引数は初回レンダー後は無視されます。
  • initialState に関数を渡した場合、その関数は 初期化関数 (initializer function) として扱われます。初期化関数は、純粋で、引数を取らず、何らかの型の値を返す必要があります。React はコンポーネントを初期化するときに初期化関数を呼び出し、その返り値を初期 state として保存します。 例を見る
  • useState は以下の 2 つの値を持つ配列を返します。

  • 現在の state。初回レンダー中では、 initialState と同じ値になります。
  • state を別の値に更新し、再レンダーをトリガする set 関数
  • useState はフックであるため、 コンポーネントのトップレベル またはカスタムフック内でのみ呼び出すことができます。ループや条件文の中で呼び出すことはできません。これが必要な場合は、新しいコンポーネントを抽出し、state を移動させてください。
  • Strict Mode では、 純粋でない関数を見つけやすくするために 初期化関数が 2 回呼び出されます 。これは開発時のみの振る舞いであり、本番には影響しません。初期化関数が純粋であれば(そうであるべきです)、2 回呼び出されてもコードに影響はありません。2 回の呼び出しのうち 1 回の呼び出し結果は無視されます。
  • setSomething(nextState) のように利用する set 関数

    useState が返す set 関数を利用して、state を別の値に更新し、再レンダーをトリガすることができます。直接次の state を渡すか、前の state から次の state を導出する関数を渡します。

    const [name, setName] = useState('Edward');

    function handleClick() {
    setName('Taylor');
    setAge(a => a + 1);
    // ...
  • nextState : 次に state にセットしたい値です。どんな型の値でも渡すことができますが、関数を渡した場合は特別な振る舞いをします。
  • nextState に関数を渡した場合、その関数は 更新用関数 (updater function) として扱われます。更新用関数は、純粋で、処理中の state の値を唯一の引数として受け取り、次の state を返す必要があります。React は更新用関数をキューに入れ、コンポーネントを再レンダーします。次のレンダーで、React はキューに入れられたすべての更新用関数を前の state に対して適用し、次の state を導出します。 例を見る
  • set 関数は返り値を持ちません。

    set 関数は 次の レンダーのための state 変数のみを更新 します。 set 関数を呼び出した後に state 変数を読み取っても、呼び出し前の画面に表示されていた 古い値が返されます

    新しい値が現在の state と同一の場合、React は最適化のために、 コンポーネントとその子コンポーネントの再レンダーをスキップ します。state の同一性の比較は、 Object.is によって行われます。一部のケースでは、React は子コンポーネントをスキップする前にコンポーネントを呼び出す必要がありますが、あなたのコードに影響を与えることはないはずです。

    React は state の更新をまとめて行います(バッチ処理) すべてのイベントハンドラを実行し終え set 関数が呼び出された後に、画面を更新します。これにより、1 つのイベント中に複数回の再レンダーが発生することはありません。まれに、早期に画面を更新する必要がある場合(例えば DOM にアクセスする場合など)がありますが、その場合は flushSync を利用できます。

    レンダー中に set 関数を呼び出すことは、 現在レンダー中の コンポーネント内からのみ許されています。その場合、React はその出力を破棄し、新しい state で再レンダーを試みます。このパターンが必要になることはほとんどありませんが、 前回のレンダーからの情報を保存 するために使用できます。 例を見る

    Strict Mode では、 純粋でない関数を見つけやすくするために 更新用関数が 2 回呼び出されます 。これは開発時のみの振る舞いであり、本番には影響しません。更新用関数が純粋であれば(そうであるべきです)、2 回呼び出されてもコードに影響はありません。2 回の呼び出しのうち 1 回の呼び出し結果は無視されます。

    state をコンポーネントに追加する

    コンポーネントのトップレベルで useState を呼び出し、1 つ以上の state 変数 を宣言します。

    import { useState } from 'react';

    function MyComponent() {
    const [age, setAge] = useState(42);
    const [name, setName] = useState('Taylor');
    // ...

    state 変数は慣習として、 分割代入 を利用して [something, setSomething] のように命名します。

    useState は、以下の 2 つの値を持つ配列を返します。

  • この state 変数の 現在の値 。最初は、 初期 state に設定されます。
  • インタラクションに応じて、state を他の値に変更するための set 関数
  • スクリーン上の表示を更新するには、次の state を引数として set 関数を呼び出します。

    function handleClick() {
    setName('Robin');
    }

    React は次の state を保存したあと、新しい値でコンポーネントを再レンダーし、UI を更新します。

    落とし穴

    set 関数の呼び出しは、 既に実行中のコードの現在の state を変更するわけでは ありません

    function handleClick() {
    setName('Robin');
    console.log(name); // Still "Taylor"!
    }

    この呼び出しは、 次の レンダー以降に useState が返す値にのみ影響を与えます。

    useState の基本的な使用例

    1 / 4 :
    カウンタ (number)

    この例では、 count state 変数が数値 (number) を保持しています。ボタンをクリックすることで、数値が増加します。

    import { useState } from 'react';
    export default function Counter() {
      const [count, setCount] = useState(0);
      function handleClick() {
        setCount(count + 1);
      return (
        <button onClick={handleClick}>
          You pressed me {count} times
        </button>