LoginSignup
25
11

More than 1 year has passed since last update.

useStateの初期化ができなくて2時間潰した俺みたいになるな

Last updated at Posted at 2022-10-21

Reactを触ってかれこれ1年以上経つのに、useStateの初期化ができなくて2時間以上潰しました。
結果、原因はuseStateの初期化は最初の1度のみ行われるということがわかっていなかったことでした。

useStateの初期化は最初の1度のみ

App.jsx
import { useState } from "react";
import "./styles.css";

const InitValUI = (props) => {
  const { val } = props;
  const [initVal] = useState(val ? val : "");  valが初期値として設定されない
  return <h1>{initVal}</h1>;
};

export default function App() {
  const [val, setVal] = useState();

  const onClickBtn = (val) => {
    setVal(val);
  };
  return (
    <div className="App">
      <button onClick={() => onClickBtn("コーラ")}>
        押された時に初期値が設定されるよ
      </button>
      <InitValUI val={val} />
    </div>
  );
}

あまり実用的なコードではありませんが、上記のコードはボタンが押されたらvalが設定され、propsInitValUIに渡り、useStateの初期値に設定され画面に表示されるということを期待しています。しかしボタンを押してもvalは初期値として設定されません。

冒頭でも言いましたが、ずばり原因はuseStateの初期化は最初のレンダリング時に一度しか設定されないからです

上記のコードでは特に制御をしていないため、InitValUIも最初に画面を開いた時にレンダリングされます。
そして最初のレンダリング時にはvalには値が設定されていないため、useStateの初期値には空文字""が設定されます。以降はuseStateの初期化はされないためval設定されないということです。

そのため、初期化したい値が設定されない間はレンダリングしない処理を追加してあげれば正しく値が設定されます。
上記のコードの場合以下のように修正するとvalが設定されます。

- <InitValUI val={val} />
+ {val && <InitValUI val={val} />}
25
11
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
25
11