useStateとは
useStateとはReactの関数コンポーネントにおいて、ステート(状態)を保持したり、変更したりすることができる機能です。
ステート(状態)とは、アプリケーションにおいて追跡する必要のあるデータまたはプロパティのことを表します
SPA(シングルページアプリケーション)では、ステートの内容を変更することで、画面の描画を変えたりすることができます。
useStateをimportする
ReactのuseStateを使用するには、まずコンポーネントにuseStateをインポートする必要があります。
import { useState } from "react";
コンポーネントの上部に、このように記述することでuseStateがインポートできます。
useStateでステートを初期化する方法
関数コンポーネントでuseStateを呼び出すことで、ステートの初期化が可能です。構文は以下の通りです。
const [値1, 値2] = useState(初期値)
また、useStateでステートを初期化した際、以下の2つの戻り値が返ります。
- 1つ目の値:現在のステート
- 2つ目の値:ステートを更新するための関数
以下はuseStateを使用して、ステートを初期化するコード例です。
import { useState } from "react";
function App() {
const [name, setName] = useState("");
}
上記のコードだとuseStateの結果、nameにはステートの初期値である空文字(””)が返り、setNameにはnameの値を更新するための関数が返ります。
ちなみにこの場合、好きな定数名(変数名)を付けられますが、2番目の値は「set〇〇」とすることが通例となっています。
ステートの値を使用する方法
ReactのJSX内でステートの値を利用する方法は非常に簡単です。
JSXの中で波かっこ{} を記述し、その中でステートの変数を使用するだけです。
import { useState } from "react";
function App() {
const [name, setName] = useState("田中");
return (
<div>私は{name}と申します。</div> // => 私は田中と申します。
)
}
上記のように書くだけで、nameの箇所において”田中”という文字列を展開することができます。
ステートを更新する方法
ステートを更新するには、useStateの結果返ってきた2つ目のステート更新関数を使用します。逆に言えば、これを使わないとステートを更新することはできません。
例えば、以下のように変数に対して直接上書きしようとしてもステートを更新することはできません。
name = "高橋"
ステートを正常に更新するには、ちゃんと更新用の関数を使用しましょう。
import { useState } from "react";
function App() {
const [name, setName] = useState("田中");
return (
<>
<div>私の名前は{name}です。</div>
<button
onClick={() => setName("高橋")}
>名前変更</button>
</>
)
}
上記のコードだと、ボタンをクリックすることでsetName関数が実行され、nameステートの値が”田中”から”高橋”に更新されます。
プリミティブ型のステートを保持する
useStateは、
- 文字列
- 数値
- 真偽値
といったプリミティブ型の値をステートとして使用することができます。
import { useState } from "react";
function App() {
const [name, setName] = useState("田中");
const [age, setAge] = useState(20);
const [isMale, setIsMale] = useState(true);
return (
<>
<div>私の名前は{name}です。</div>
<div>私の名前は{age}歳です。</div>
{isMale ? (<div>私は男です。</div>) : (<div>私は女です。</div>)}
</>
)
}
オブジェクトをステートとして保持する
useStateでは、引数にオブジェクトを渡すことで、オブジェクト型のステートを作ることもできます。
import { useState } from "react";
function App() {
const [person, setPerson] = useState({
name: "田中",
age: 20,
isMale: true
});
return (
<>
<div>私の名前は{person.name}です。</div>
<div>私の名前は{person.age}歳です。</div>
{person.isMale ? (<div>私は男です。</div>) : (<div>私は女です。</div>)}
</>
)
}
オブジェクト型のステートの更新方法
オブジェクト型のステートを更新する際、オブジェクトの全てのプロパティを変更したい場合は、更新関数に新しいオブジェクトをセットすれば大丈夫です。
setPerson({
name: "高橋",
age: 22,
isMale: false
})
ですが、オブジェクトのプロパティを部分的に更新したい場合は、スプレッド構文を使用して更新します。
setPerson(prevState => {
return {...prevStage, 更新するプロパティ: 新しい値}
}
例えば、personオブジェクトのageプロパティだけ更新する場合は以下のようになります。
import { useState } from "react";
function App() {
const [person, setPerson] = useState({
name: "田中",
age: 20,
isMale: true
});
const updateAge = () => {
setPerson(prevState => {
return {...prevStage, age: 35}
}
}
return (
<>
<div>私の名前は{person.name}です。</div>
<div>私の名前は{person.age}歳です。</div>
{person.isMale ? (<div>私は男です。</div>) : (<div>私は女です。</div>)}
<button
onClick={updateAge}
>UpdateAge</button>
</>
)
}