Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

何か1つを変更すると全ての要素が再レンダリングされている問題を解決する #59

Open
pss-aileen opened this issue Sep 8, 2024 · 1 comment

Comments

@pss-aileen
Copy link
Owner

  • FormItemが変更されている
    • ここはされなくて良いのでは?

パフォーマンスを測定しておいて、それが改善できているかを測りたいけどどうしたらいいんだろうか

とにかく、無駄なレンダリングを探して解消していきたい

@pss-aileen
Copy link
Owner Author

Reactでは、通常、親コンポーネント(あなたの例ではA)が再レンダリングされる条件として、親自身の状態やプロパティ(props)が変更された場合が考えられます。ただし、子コンポーネント(チャイルド)が変更されたときに親コンポーネントが再レンダリングされるかどうかは、その子コンポーネントがどのように組み込まれているかによります。

  1. 親コンポーネントの再レンダリングが「普通」かどうか

    • 子コンポーネントが変更されたとき、親コンポーネントが必ず再レンダリングされるわけではありません。ただし、Reactの再レンダリングの仕組みでは、親が再レンダリングされると、その子も通常は再レンダリングされます。

    • Aが再レンダリングされるのは、Astatepropsが更新された場合です。子コンポーネントが直接的にAに影響を与えるわけではない限り、子コンポーネントの変更だけで親が再レンダリングされることは「普通」ではありません。

  2. チャイルドの中身だけ再レンダリングする方法
    親コンポーネントを再レンダリングせず、子コンポーネントだけを再レンダリングする方法としては、いくつかの手法があります:

    • React.memo() を使う
      React.memo() は、子コンポーネントに対して「メモ化」を適用し、propsに変更がない限り、その子コンポーネントを再レンダリングしないようにできます。

      const ChildComponent = React.memo(({ prop1, prop2 }) => {
        // チャイルドのコンテンツ
      });
    • useCallbackuseMemo を使う
      親コンポーネントが再レンダリングされるたびに、関数や値が新しく生成されることがありますが、useCallbackuseMemoを使ってこれらをメモ化することで不要な再レンダリングを防げます。

      const handleClick = useCallback(() => {
        // ハンドラーのロジック
      }, []);
    • keyの使用
      子コンポーネントにkeyを適切に設定することで、特定の子コンポーネントのみが再レンダリングされるようにできます。

まとめると、Reactのデフォルト動作では、親コンポーネントが再レンダリングされるとその子も再レンダリングされるのが普通ですが、React.memo()useCallback などを使うことで、親を再レンダリングせずに子だけを再レンダリングすることが可能です。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant