useStateの使い方
useState
は、コンポーネントの状態を管理するためのフックです。フックとは、React.jsの機能をクラスを書かずに使えるようにする機能です。
フックを使わなくても良いのですが「使ったほうが楽できる」と覚えておきましょう。
useStateの使い方
useStateを使う準備
useState
を使うときは、まず下記を書きます。フックを使うならそのフックを必ずimport
すると覚えておきましょう。
import { useState } from "react";
useStateの基本構文
useState
の基本構文がこちら。
const [state, setState] = useState(initialState);
見慣れない記述かもしれませんが、これはJavaScriptの分割代入という記法に沿ったものです。useState
関数には、初期値と状態を変更する関数を渡します。
state | 状態の値 |
---|---|
setState | 状態の値を変更する関数 |
initialState | 状態の初期値 |
setState
関数に何か値を渡すと、state
変数にその値が反映されます。数値、文字列、オブジェクト、配列など、さまざまなデータ型を扱うことができます。
state
変数や、setState
関数の部分は、その都度わかりやすい名前にすると良いです。
const [name, setName] = useState("");
const [score, setScore] = useState(0);
useStateを使った例
setState
を使った例をいくつか見てみましょう。
- ボタンを押すと数値がカウントアップする例
- チェックボックスの状態を管理する例
- テキスト入力の状態を管理する例
- ドロップダウンの状態を管理する例
①ボタンを押すと数値がカウントアップする例
import React from "react";
import ReactDOM from "react-dom";
import { useState } from "react";
const App = () => {
const [count, setCount] = useState(0);
const increment = () => {
setCount(count + 1);
};
return (
<div>
<button onClick={increment}>カウントアップ</button>
<p>カウント:{count}</p>
</div>
);
};
ReactDOM.render(
<App />,
document.getElementById("root")
);
useState(0)
で、count
変数の初期値が0になります。また、この例では状態を変更する関数でsetCount
関数が指定されているので、この関数に値を渡してcount
変数の値を更新します。
increment
ボタンを押すと、setCount
関数が呼び出され、count
の値が1増加します。count
の値が変更されると、コンポーネントが再レンダリングされます。
②チェックボックスの状態を管理する例
import React from "react";
import ReactDOM from "react-dom";
import { useState } from "react";
const App = () => {
const [isChecked, setIsChecked] = useState(false);
return (
<div>
<input type="checkbox" onChange={() =>; setIsChecked(!isChecked)} />
{isChecked ? "チェックされています" : "チェックされていません"}
</div>
);
};
ReactDOM.render(
<App />,
document.getElementById('root')
);
③テキスト入力の状態を管理する例
import React from "react";
import ReactDOM from "react-dom";
import { useState } from "react";
const App = () => {
const [text, setText] = useState("");
return (
<div>
<input type="text" value={text} onChange={(e) =>; setText(e.target.value)} />
<p>{text}</p>
</div>
);
};
ReactDOM.render(
<App />,
document.getElementById('root')
);
④ドロップダウンの状態を管理する例
import React from "react";
import ReactDOM from "react-dom";
import { useState } from "react";
const App = () => {
const [value, setValue] = useState("");
const options = [
{ value: "1", label: "1" },
{ value: "2", label: "2" },
{ value: "3", label: "3" },
];
return (
<div>
<select onChange={(e) => setValue(e.target.value)}>
{options.map((option) => (
<option key={option.value} value={option.value}>{option.label}</option>
))}
</select>
<p>{value}</p>
</div>
);
};
ReactDOM.render(
<App />,
document.getElementById('root')
);
他にもある活用例
こんな用途での活用もできます。
- ドロップダウンの選択状態を保存する
- ラジオボタンの選択状態を保存する
- カレンダーの選択日を保存する
- スライダーの値を保存する
- 画像の表示状態を保存する
- 動画の再生状態を保存する
- 音声の再生状態を保存する
- フォームの送信状態を保存する
- ボタンの有効/無効状態を保存する
- モーダルの表示状態を保存する
- ナビゲーションバーの表示状態を保存する
- チャットウィンドウの表示状態を保存する
フックを使うと楽できる
冒頭でも書いたように、フックを使うと、React.jsの機能をクラスを書かずに使えるので、コードが簡潔になります。
ボタンを押すと数値がカウントアップされるコードの書き方を比較して、フックを使うと簡潔に書けることを実感してもらいましょう。
フックを使う場合の書き方の例
import React from "react";
import ReactDOM from "react-dom";
import { useState } from "react";
const App = () => {
const [count, setCount] = useState(0);
return (
<div>
<button onClick={() => setCount(count + 1)}>カウントアップ</button>
<p>{count}</p>
</div>
);
};
ReactDOM.render(
<App />,
document.getElementById('root')
);
フックを使わない場合の書き方の例
import React from "react";
import ReactDOM from "react-dom";
class App extends React.Component {
constructor(props) {
super(props);
this.state = {
count : 0
};
};
handleClick = () => {
this.setState({
count: this.state.count + 1,
});
};
render() {
return (
<div>
<button onClick={this.handleClick}>カウントアップ</button>
<p>{this.state.count}</p>
</div>
);
}
}
ReactDOM.render(
<App />,
document.getElementById('root')
);