Reactメモ


を使用memoすると、プロップが変更されていない場合、Reactはコンポーネントのレンダリングをスキップします。

これにより、パフォーマンスを向上させることができます。

このセクションでは、Reactフックを使用します。フックの詳細については、「Reactフック」セクションを参照してください。


問題

この例ではTodos、タスクが変更されていない場合でも、コンポーネントが再レンダリングされます。

例:

index.js

import { useState } from "react";
import ReactDOM from "react-dom";
import Todos from "./Todos";

const App = () => {
  const [count, setCount] = useState(0);
  const [todos, setTodos] = useState(["todo 1", "todo 2"]);

  const increment = () => {
    setCount((c) => c + 1);
  };

  return (
    <>
      <Todos todos={todos} />
      <hr />
      <div>
        Count: {count}
        <button onClick={increment}>+</button>
      </div>
    </>
  );
};

ReactDOM.render(<App />, document.getElementById('root'));

Todos.js

const Todos = ({ todos }) => {
  console.log("child render");
  return (
    <>
      <h2>My Todos</h2>
      {todos.map((todo, index) => {
        return <p key={index}>{todo}</p>;
      })}
    </>
  );
};

export default Todos;

インクリメントボタンをクリックすると、Todosコンポーネントが再レンダリングされます。

このコンポーネントが複雑な場合、パフォーマンスの問題が発生する可能性があります。


w3schools CERTIFIED . 2022

認定を受けましょう!

Reactモジュールを完了し、演習を行い、試験を受けて、w3schools認定を取得してください!!

95ドル登録

解決

これを修正するには、を使用できますmemo

コンポーネントが不必要に再レンダリングmemoされないようにするために使用します。Todos

Todosコンポーネントのエクスポートをmemoのようにラップします。

例:

index.js

import { useState } from "react";
import ReactDOM from "react-dom";
import Todos from "./Todos";

const App = () => {
  const [count, setCount] = useState(0);
  const [todos, setTodos] = useState(["todo 1", "todo 2"]);

  const increment = () => {
    setCount((c) => c + 1);
  };

  return (
    <>
      <Todos todos={todos} />
      <hr />
      <div>
        Count: {count}
        <button onClick={increment}>+</button>
      </div>
    </>
  );
};

ReactDOM.render(<App />, document.getElementById('root'));

Todos.js

import { memo } from "react";

const Todos = ({ todos }) => {
  console.log("child render");
  return (
    <>
      <h2>My Todos</h2>
      {todos.map((todo, index) => {
        return <p key={index}>{todo}</p>;
      })}
    </>
  );
};

export default memo(Todos);

これで、プロップを介してコンポーネントに渡されたコンポーネントが更新された場合にのみTodosコンポーネントが再レンダリングされます。todos