# useEffect

次に**useEffect**について説明します。useEffectはコンポーネントがhtmlを生成して画面に表示（**レンダリング**という）された後に処理を行える関数になります。

`components`配下に`PostList.tsx`を作成しましょう。その中に以下のように記述しましょう。`useEffect`は第1引数に実行したい関数を渡します。

<pre class="language-tsx" data-title="PostList.tsx◎"><code class="lang-tsx"><strong>import { useEffect } from "react";
</strong><strong>
</strong><strong>export const PostList = () => {
</strong><strong>  useEffect(() => {
</strong><strong>    console.log("PostsList");
</strong><strong>  }, []);
</strong><strong>
</strong><strong>  return &#x3C;h2>PostList&#x3C;/h2>;
</strong><strong>};
</strong></code></pre>

このコンポーネントを`App.tsx`で呼び出しましょう。

<pre class="language-tsx" data-title="App.tsx◎"><code class="lang-tsx">...
import { Like } from "./components/Likes";
<strong>import { PostList } from "./components/PostsList";
</strong>import { UserList } from "./components/UserList";
...
      &#x3C;Form />
<strong>      &#x3C;PostList />
</strong>    &#x3C;/div>
  );
};

export default App;

</code></pre>

以下のようにコンソールに出力されるかと思います。レンダリング後に`useEffect`内の処理が実行され、コンソールに出力されました。通常は1回のみの処理になるのですが、2回出力されています。

<figure><img src="https://1869761657-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FcUBbYqol4PMzZJggiMqV%2Fuploads%2FYcAuTlHK4SWsFd8K7neI%2F20231208811.png?alt=media&#x26;token=d908f354-4dff-4c40-91bf-679cb5adb52a" alt=""><figcaption></figcaption></figure>

理由として、現在Reactを**Strictモード**という状態で起動しているためです。**Strictモード**というのはアプリの潜在的な問題点を洗い出すためのツールで、`main.tsx`を見ると`React.StrictMode`というタグで括られているかと思いますが、デフォルトで使用されています。

{% code title="main.tsx" %}

```tsx
...
ReactDOM.createRoot(document.getElementById("root")!).render(
  <React.StrictMode>
    <App />
  </React.StrictMode>
);

```

{% endcode %}

`React.StrictMode`を削除することで、Strictモードをオフにすることができます。基本的にはオンのままが良いですし、開発環境のみ動作しますので、本番環境では上記のように`useEffect`が2回呼ばれることはありません。

`useEffect`の第2引数に関してですが、監視したいstateを配列で渡します。`userId`というstateを作り、そのstateを変更するためにinputタグにて変更できるようにします。そして、useEffectの第2引数に`userId`を渡してみましょう。

<pre class="language-tsx" data-title="PostList.tsx◎"><code class="lang-tsx"><strong>import { useEffect, useState } from "react";
</strong>
export const PostList = () => {
<strong>  const [userId, setUserId] = useState(1);
</strong>
  useEffect(() => {
    console.log("PostList");
<strong>  }, [userId]);
</strong>
  return (
<strong>    &#x3C;div>
</strong><strong>      &#x3C;h2>PostList&#x3C;/h2>
</strong><strong>      &#x3C;div>
</strong><strong>        &#x3C;p>userID: {userId}&#x3C;/p>
</strong><strong>        &#x3C;input
</strong><strong>          type="number"
</strong><strong>          value={userId}
</strong><strong>          onChange={(e) => setUserId(Number(e.target.value))}
</strong><strong>        />
</strong><strong>      &#x3C;/div>
</strong><strong>    &#x3C;/div>
</strong>  );
};

</code></pre>

ブラウザにて確認すると、`userId`を変更するたびに`useEffect`の処理が走るようになります。

<figure><img src="https://1869761657-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FcUBbYqol4PMzZJggiMqV%2Fuploads%2F4wsdlOUbk28Tc3GfOfh7%2F20231208833.png?alt=media&#x26;token=6ba3dafb-5ec6-4e49-b9bb-5b7ee8e9edab" alt=""><figcaption></figcaption></figure>
