2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

useState, useEffect, memo, useCallbackがごっちゃになるからメモ

2
Posted at

useState

// 宣言方法
const [ count, setCount ] = useState(0);

画面上の値を動的に変えたい時に使う。
あとめっちゃ使う。

setXXXなどで値が変わったら、画面を再レンダリングする。

useEffect

useEffect(() => {
  // 処理を記載
  console.log("処理実行");
}, []);

画面表示時に1回だけ処理を行わせたい時に使う。
第二引数の依存配列[]に値変更を監視したいフィールドを入れると、その値に変化があった場合に処理が再実行される(副作用とかいう)。

memo

import { memo } from "react";

export const ChildApp = memo((props) => {
  // 処理を記載
  return ();
});

コンポーネント再レンダリング最適化をしたいときに使う。
コンポーネントのpropsからmemo()で囲ってあげる。

こうすることで、親コンポーネントが再レンダリングされてもmemoで囲ったコンポーネントのpropsの値が変わらない限り、再レンダリングの影響を受けなくなる(不要な再レンダリングがされなくなる)。

useCallback

import { useCallback } from "react";
import { ChildApp } from "./ChildApp";

export const App () => {
  const addTodo = useCallback(() => {// 処理});

  return (
    <div>
      <h1>Hello, World!</h1>
      <ChildApp addTodo={addTodo} />
    </div>
  );
};

memoの説明で、「memoで囲ったコンポーネントは、親から渡されるpropsが変更されない限り再レンダリングされない」と書いたけど、propsに関数を渡す場合、なぜか再レンダリングされてしまう。

理由は、子コンポーネントに渡す関数は、「毎回新しい関数」扱いで渡ってくるため、memoで囲っていてもpropsに渡ってきた関数は新しいやつ扱い(propsの変更扱い)されるからmemo の再レンダリング制御が効かなくなる。

そこで、親コンポーネントで記載した子コンポーネントに渡す関数をuseCallback()で囲ってあげると関数の再生成判断がされなくなり、子コンポーネントの再レンダリング制御が可能になる。

memouseCallback()はセットで覚えた方が良いと思う。

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?