こんにちは。
今回は、Reactの基本中の基本、useState
について詳しく解説していきます。この記事を読むことで、useState
の使い方から頻出の使用例まで、しっかりと理解できるでしょう。
目次
useStateの具体例4選
まず、useState
を利用した具体的なコードの例を示します。
カウンターの例
import React, { useState } from 'react'; function Counter() { const [count, setCount] = useState(0); return ( <div> <p>カウント: {count}</p> <button onClick={() => setCount(count + 1)}>増加</button> <button onClick={() => setCount(count - 1)}>減少</button> </div> ); }
テキスト入力の例
import React, { useState } from 'react'; function TextInput() { const [text, setText] = useState(''); return ( <div> <input type="text" value={text} onChange={(e) => setText(e.target.value)} /> <p>入力されたテキスト: {text}</p> </div> ); }
ToDoリストの例
import React, { useState } from 'react'; function TodoList() { const [todos, setTodos] = useState([]); const [newTodo, setNewTodo] = useState(''); const addTodo = () => { setTodos([...todos, newTodo]); setNewTodo(''); }; return ( <div> <input type="text" value={newTodo} onChange={(e) => setNewTodo(e.target.value)} /> <button onClick={addTodo}>追加</button> <ul> {todos.map((todo, index) => ( <li key={index}>{todo}</li> ))} </ul> </div> ); }
複数の状態を持つ例
import React, { useState } from 'react'; function MultiState() { const [name, setName] = useState('名無し'); const [age, setAge] = useState(0); return ( <div> <input type="text" value={name} onChange={(e) => setName(e.target.value)} /> <input type="number" value={age} onChange={(e) => setAge(e.target.value)} /> <p>名前: {name}, 年齢: {age}</p> </div> ); }
useStateとは?
useState
はReactのフック(Hooks)の一つで、コンポーネントの状態(state)を管理するためのものです。
基本的な使い方
状態の宣言: useState
を使って状態を宣言します。
const [state, setState] = useState(initialState); // const [現在の状態, 更新する関数] = useState(初期値);
ここでstate
は現在の状態、setState
は状態を更新する関数、initialState
は初期値です。
状態の更新: setState
関数を使って状態を更新します。
setState(newState); // 更新する関数(新しい値);
具体例
const [message, setMessage] = useState("Hello, John!"); const [likes, setLikes] = useState(0); const [isPublished, setIsPublished] = useState(false);
コンポーネントの再描画(レンダリング)
コンポーネントが再描画されるタイミングは主に2つです。
- propsの変更: 親コンポーネントから渡されたpropsが変更された場合。
- stateの変更: コンポーネント内部のstateが変更された場合。
stateとpropsの違い
- props: 親コンポーネントから子コンポーネントへ渡される値。引数のようなものです。
- state: コンポーネント内部で宣言・制御される値。
useStateの頻出3選
1. テキスト入力フォーム
const TextInput = () => { const [name, setName] = useState(""); const handleName = (event) => { setName(event.target.value); }; return ( <input type="text" value={name} onChange={(event) => handleName(event)} /> ); };
2. カウンター機能(prevStateの活用)
const Counter = () => { const [count, setCount] = useState(0); const countUP = () => { setCount(prevState => prevState + 1); } return ( <div> <div>現在のカウント: {count}</div> <button onClick={countUP}>up</button> </div> ); };
3. ON/OFFを切り替えるボタン
const ToggleButton = () => { const [open, setOpen] = useState(false); const toggle = () => setOpen((prevState) => !prevState); return <button onClick={toggle}>{open ? 'OPEN': 'CLOSE'}</button>; };
以上がuseState
の基本的な使い方と頻出の使用例です。
関数をpropsとして渡す際の注意点
Reactでよくあるパターンとして、関数をpropsとして子コンポーネントに渡す場合があります。しかし、その際にはいくつか注意が必要です。
正しい関数の渡し方
関数をそのまま渡す
<PublishButton isPublished={isPublished} onClick={publishArticle} />
関数をラップして渡す
<PublishButton isPublished={isPublished} onClick={() => publishArticle()} />
間違った関数の渡し方
- 関数の末尾に
()
をつける このような書き方は避けましょう。関数が実行されるたびに新しい関数が生成され、無限レンダリングが発生する可能性があります。
<PublishButton isPublished={isPublished} onClick={publishArticle()} />
prevStateの重要性
useState
の更新関数には特別なprevState
という引数があります。これは更新前のstateを指します。
const countUP = () => { setCount(prevState => prevState + 1); }
このprevState
を使う理由は、JavaScriptが非同期処理であるため、重い処理が前にかかれていると、状態が反映されない可能性があるからです。
まとめ
useState
はReactの基本的なフックで、コンポーネントの状態を管理します。- コンポーネントは
props
やstate
が変更されたときに再描画されます。 - 関数をpropsとして渡す際には注意が必要です。
prevState
は非同期処理に対応するために重要です。
以上がuseState
に関する詳細な解説です。この記事があなたのReact開発に役立つことを心より願っています。