当サイトは、アフィリエイト広告を利用しています
フック(Hook) は、Reactの関数コンポーネントで状態管理や副作用処理を可能にする特別な関数のこと。
大きく分けると下記の2種類がある
Reactが標準で提供しているフックで、主に以下のような種類がある。
下記記事でそれぞれまとめている
開発者が独自に作成するフックのこと。
複数のコンポーネントで同じ状態管理やロジックを再利用したい場合に使う。
Reactのフックは特定の使い方を守らないと正しく動作しないため、2つのルールが定められてる。
これは上記の「組み込みフック」と「カスタムフック」の両方で守る必要がある。
具体的なには
ということ
基本的にhookは使う場合は、すぐ書くようにする!
import React, { useState } from 'react';export default function App() {const [count, setCount] = useState(0); // トップレベルで呼び出しreturn (<><div>{count}</div><button onClick={() => setCount(count + 1)}>+1</button>;</>);}
export default function App() {if (someCondition) {// 条件分岐の中でフックを呼び出してはいけないconst [count, setCount] = useState(0);}return (<><div>{count}</div><button onClick={() => setCount(count + 1)}>+1</button>;</>);}
フックは
の中でしか使うことができない。
React関数コンポーネントとは
ReactでUIを作るためのJavaScript関数で、引数としてpropsを受け取り、JSXを返す構造のコンポーネントのこと。
const MyComponent = ({ name }) => {return <h1>Hello, {name}!</h1>;};
関数コンポーネント内ではフックを使うことができる
import React, { useState } from 'react';// JSXを返しているのでこれは関数コンポーネントexport default function App() {const [count, setCount] = useState(0);return (<><div>{count}</div><button onClick={() => setCount(count + 1)}>+1</button>;</>);}
import React, { useState } from 'react';// ただの関数(コンポーネントでもカスタムフックでもない)function normalFunction() {const [count, setCount] = useState(0); // フックをここで使うのは違反return { count, setCount };}export default function App() {const { count, setCount } = normalFunction(); // 呼び出しreturn (<><div>{count}</div><button onClick={() => setCount(count + 1)}>+1</button></>);}
カスタムフック内でも使うことができる。
たとえば
import React, { useState } from 'react';// ただの関数(コンポーネントでもカスタムフックでもない)function normalFunction() {const [count, setCount] = useState(0); // フックをここで使うのは違反return { count, setCount };}export default function App() {const { count, setCount } = normalFunction(); // 呼び出しreturn (<><div>{count}</div><button onClick={() => setCount(count + 1)}>+1</button></>);}
は通常の関数のため違反だが、normalFunctionをカスタムフックにすれば問題ない
import React, { useState } from 'react';// カスタムフックfunction useCounter() {const [count, setCount] = useState(0);return { count, setCount };}export default function App() {const { count, setCount } = useCounter();return (<><div>{count}</div><button onClick={() => setCount(count + 1)}>+1</button></>);}
違反した場合は実行時エラーとなる。 ※ESLintなら事前にチェックできる
Reactのフックのルールを具体的なサンプルを使ってまとめてみた。
しばらくReact触ってないと、忘れるので忘備録として残す。