React Hooksまとめ　第一弾（useState useEffect useContext）

# はじめに
自分は新卒エンジニアです。今回は。現在学習しているReactの機能であるHooksについていつでも見返せるような記事を作成したいという目的で、書き始めました。参考にしていただければ幸いです。
# React Hooksまとめ 第一弾
まずReactについては、以下の通りです。
>ReactはWeb とネイティブユーザインターフェースのためのライブラリ
コンポーネントからユーザインターフェースを作成

https://ja.react.dev/

## 1. Hooksとは

>React Hooksとは、クラスを使うことなくReactのstateを扱ったり、ライフサイクルに応じた処理を実装したりできる機能です。 React Hooksを活用すると、簡潔で読みやすいコードを記述できます。

https://udemy.benesse.co.jp/development/react-hooks.html#:~:text=React%20Hooks%E3%81%A8%E3%81%AF%E3%80%81%E3%82%AF%E3%83%A9%E3%82%B9,%E9%96%8B%E7%99%BA%E3%81%AB%E5%BD%B9%E7%AB%8B%E3%81%A6%E3%81%BE%E3%81%97%E3%82%87%E3%81%86%E3%80%82

## 2. useStateフック

`useState`フックは、状態を関数コンポーネント内に導入するために使用されます。
>`useState`は独立した値を持つため、複数の状態を一つのコンポーネントで管理することができます。 また、配列やオブジェクトなどの複雑なデータを扱うことも可能です。 それぞれのuseStateは独立したステートを作りますので、異なる値を保持したい場合には`useState`を複数回呼び出すことが可能です。

https://musclecoding.com/react-usestate/#:~:text=useState%E3%81%AF%E7%8B%AC%E7%AB%8B%E3%81%97%E3%81%9F%E5%80%A4,%E5%91%BC%E3%81%B3%E5%87%BA%E3%81%99%E3%81%93%E3%81%A8%E3%81%8C%E5%8F%AF%E8%83%BD%E3%81%A7%E3%81%99%E3%80%82

以下は、基本的な`useState`の使用例です。

```jsx
import React, { useState } from 'react';

function ExampleComponent() {
  const [count, setCount] = useState(0);

  return (
    <div>
      <p>現在のカウント: {count}</p>
      <button onClick={() => setCount(count + 1)}>カウントを増やす</button>
    </div>
  );
}
```
上記のコードでは`useState`を用いることによってボタンクリックをするたびに1が加算されるようになります。

:::note info
実際の動作
:::
https://codesandbox.io/embed/throbbing-glitter-mlc8vz?fontsize=14&hidenavigation=1&theme=dark

## 3. useEffectフック
`useEffect`フックは、コンポーネントの副作用（API呼び出し、購読、データの変更など）を処理するために使用されます。
>useEffectを使用すると、関数を実行するタイミングをReactのレンダリング後まで遅らせることが可能です。 useEffectでは、マウント時に行った処理をアンマウント時に解除します。 副作用関数はレンダリング時に毎回実行される仕組みです。

https://udemy.benesse.co.jp/development/react-hooks.html#:~:text=useEffect%E3%81%AF%E3%80%81%E9%96%A2%E6%95%B0%E3%82%B3%E3%83%B3%E3%83%9D%E3%83%BC%E3%83%8D%E3%83%B3%E3%83%88%E3%81%A7%E5%89%AF%E4%BD%9C%E7%94%A8%E3%82%92%E5%88%B6%E5%BE%A1%E3%81%A7%E3%81%8D%E3%82%8B%E3%83%95%E3%83%83%E3%82%AF%E3%81%A7%E3%81%99%E3%80%82&text=useEffect%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%99%E3%82%8B%E3%81%A8%E3%80%81%E9%96%A2%E6%95%B0,%E5%AE%9F%E8%A1%8C%E3%81%95%E3%82%8C%E3%82%8B%E4%BB%95%E7%B5%84%E3%81%BF%E3%81%A7%E3%81%99%E3%80%82

以下は、`useEffect`の基本的な使用例です。

```jsx
import React, { useState, useEffect } from 'react';

function DataFetchingComponent() {
  const [data, setData] = useState(null);

  useEffect(() => {
    // データの取得ロジック
    const fetchData = async () => {
      try {
        const result = await fetch('https://jsonplaceholder.typicode.com/todos/1');
        const jsonData = await result.json();
        setData(jsonData);
      } catch (error) {
        console.error('データの取得に失敗しました:', error);
      }
    };
    
    fetchData();// 依存配列が空の場合、マウント時にのみ実行

  return (
    <div>
      <p>取得したデータ: {data ? JSON.stringify(data) : 'データなし'}</p>
    </div>
  );
}
```
上記のコードは以下のような構成になっています
### 関数コンポーネントの定義
```jsx
function DataFetchingComponent() {
  // ...
}
```
これは、`React`の関数コンポーネント DataFetchingComponent を定義しています。

### Stateの設定
```jsx
const [data, setData] = useState(null);
```
`useState`フックを使用して、コンポーネントの状態を管理しています。data は取得したデータを保持し、setData はそのデータを更新するための関数です。初期値として null が設定されています。

### useEffect フック
```jsx
useEffect(() => {
  // ...
}, []); // 依存配列が空の場合、マウント時にのみ実行
```
この場合、データの取得ロジックが含まれています。
`useEffect`フックは、React コンポーネントがレンダリングされた後に非同期または副作用のある操作を実行するために使用されます。第二引数には、この useEffect フックが依存する値の配列を指定します。この値が変化すると、再度 `useEffect`が実行されます。しかし、配列が空の場合、`useEffect`は初めて画面に表示されるときにのみ実行され、以後は再レンダー時には実行されなくなります。


### データの取得ロジック
```jsx
const fetchData = async () => {
  try {
    const result = await fetch('https://jsonplaceholder.typicode.com/todos/1');
    const jsonData = await result.json();
    setData(jsonData);
  } catch (error) {
    console.error('データの取得に失敗しました:', error);
  }
};

fetchData();
```

・`const fetchData = async () => { ... }`: `fetchData`関数は非同期関数として宣言されています。データの取得ロジックが含まれています。
`async`を使用することで`await`によってPromiseが解決されるまで次の行のコードの実行を一時停止することができます。上記の例では、`fetch関数`がPromiseを返すため、その結果が解決されるまで処理が待機し、その後に次の行のコードが実行されます。

・`try { ... } catch (error) { ... }`: `try-catch`ブロックを使用してエラーハンドリングを行っています。データの取得が成功した場合は、取得したデータを`setData`を介してコンポーネントの状態に設定します。エラーが発生した場合は、エラーメッセージをコンソールに出力します。

・`fetchData();`: `fetchData`関数がコンポーネントがマウントされた際に実行されます。
### コンポーネントのレンダリング
```jsx
Copy code
return (
  <div>
    <p>取得したデータ: {data ? JSON.stringify(data) : 'データなし'}</p>
  </div>
);
```
最後に、取得したデータを表示するためにコンポーネントが JSX を返します。data が存在すれば、その内容をJSON文字列に変換して表示し、存在しない場合は "データなし" と表示されます。

:::note info
実際の動作
:::
https://codesandbox.io/embed/unruffled-mclaren-nyq2q7?fontsize=14&hidenavigation=1&theme=dark

## 4. useContextフック
`useContextフック`は、Reactのコンテキストを使用してコンポーネントツリーを介して値を渡すために使用されます。

>Reactコンポーネントのツリーに対して「グローバル」とみなすデータについて利用するように設計されています。
コンポーネントの再利用をより難しくする為、慎重に利用しなくてはなりません。
Contextによってコンポーネントツリー間におけるデータの橋渡しについて、すべての階層ごとに渡す必要性がなくなり、propsバケツリレーをしなくても下の階層で Contextに収容されているデータにアクセスできるようになりました。

https://qiita.com/seira/items/fccdf4e73c59c491558d

以下は、`useContext`の基本的な使用例です。

```jsx
import React, { useContext } from 'react';

const ThemeContext = React.createContext();

function ThemedComponent() {
  const theme = useContext(ThemeContext);

  return (
    <div style={{ background: theme.background, color: theme.color}}>
      テーマに基づくコンポーネント
    </div>
  );
}
```
### コンテキストの作成

```jsx
const ThemeContext = createContext();
```
`createContext`メソッドを使用して、新しいコンテキストオブジェクトを作成しています。このコンテキストオブジェクトは、`ThemedComponent`内で使用されるテーマ情報を提供します。

### ThemedComponentコンポーネント

```jsx
function ThemedComponent() {
  const theme = useContext(ThemeContext);

  return (
    <div style={{ background: theme.background, color: theme.text }}>
      テーマに基づくコンポーネント
    </div>
  );
}
```
`ThemedComponent`は、`useContext`フックを使用して`ThemeContext`からテーマ情報を取得しています。`useContext`は、Reactコンポーネント内でコンテキストの値にアクセスするためのフックです。

`useContext`は引数として対象のコンテキストオブジェクトを取り、そのコンテキストが提供する値を返します。この場合、`ThemeContext`が提供するテーマ情報をtheme変数に格納しています。

最後に、`ThemedComponent`はdiv要素をレンダリングし、そのスタイルを`theme.background`と`theme.color`に基づいて設定しています。これにより、テーマに基づくスタイルが適用されたコンポーネントが表示されます。

### コンテキストの使用
`ThemedComponent`は、親コンポーネントでThemeContext.Providerを使用してコンテキストの値を設定する必要があります。例えば、次のように行います。

```jsx
function App() {
  const themeValue = { background: 'lightblue', text: 'darkblue' };

  return (
    <ThemeContext.Provider value={themeValue}>
      <ThemedComponent />
    </ThemeContext.Provider>
  );
}
```
このように親コンポーネントで`ThemeContext.Provider`でコンテキストの値を提供することで、`ThemedComponent`内で`useContext`を使用してその値にアクセスできます。

:::note info
実際の動作
:::

https://codesandbox.io/embed/relaxed-sanderson-mlgdsg?fontsize=14&hidenavigation=1&theme=dark

## 5. その他のHooks
Reactには他にも多くのHooksが存在します。以下は一部の例です。以下のHooksに関しては第二弾でまとめていきます。

・`useReducer`: 複雑な状態ロジックを処理するためのフック。
・`useCallback`および`useMemo`: パフォーマンス最適化のためのコールバックとメモ化。
・`useRef`: Refオブジェクトの作成および値の保持。
・その他多数...

## ６．まとめ
今回は３種類のHooksのみでしたが逐一そのほかのHooksについてもまとめていきます。
自分自身作成しながらも実用性の部分やデメリット等、完璧に理解できていない部分もあるため、記事を見直しながら改めて学習を進めていきます。

https://qiita.com/advent-calendar/2023/activecore