React コンポーネントの状態管理

2022/05/25に公開

Reactを使うのに欠かせない状態管理について
アウトプット

なぜStateを使うのか

Reactコンポーネント内の値を書き換えやすい

コンポーネント内の要素をDOMで直接書き換えるのではなく、新しい値を用いて再描画することができる
Reactコンポーネントが再描画されるきっかけは、

  • stateが変更された時
  • propsが変更された時

useStateの使い方

1.useStateによるstateの宣言

const [state, setState] = useState(initialState)

2.stateの更新

setState(newState)

3.具体例

const [isPublished, setIsPublished] = useState(false)
setIsPublished(true)

propsとstateの違い

両者ともに再描画のきっかけになるが

  • propsは引数のようにコンポーネントに渡される値 (親コンポーネントから子コンポーネントに渡す)
  • stateはコンポーネントの内部で宣言、制御される値

という違いがある

stateをpropsに渡す

const Article = (props) => {
	const [isPublished, setIsPublished] = useState(false)
	const publishArticle = () => {
		setIsPublished(true)
	}
	return (
		<div>
			<PublishButton
			isPublished={isPublished}
			onClick={publishArticle}
			/>
		</div>
	);
};
const PublishButton = (props) => {
	return (
		<button onClick={() => props.onClick()}>
		公開状態:{props.isPublished.toString()}
		</button>
	)
} 

*  props.onClick()はpublishArticle()
*  HTMLのbuttonが持つonClickイベントに渡す

ここで注意すること

  • 更新関数はそのままpropsとして渡さず、関数化する
  • 関数をpropsに渡すときは注意する(後述)

propsへ関数を渡す際の注意点

OKな関数の渡し方

コールバック関数か関数自体を渡す

<PublishButton isPublished={isPublished} onClick={publishArticle} />
<PublishButton isPublished={isPublished} onClick={() => publishArticle()} />

NGな関数の渡し方

<PublishButton isPublished={isPublished} onClick={publishArticle()} />

propsを渡すときに関数を実行すると、無限レンダリングが起きる

最後に

脱初心者として、記事を書いてアウトプットしています。
間違った内容がありましたら、ぜひコメントでご指摘いただけると幸いです。

Discussion