Memo

 Su uso memohará que React omita la representación de un componente si sus propiedades no han cambiado.

Esto puede mejorar el rendimiento.

Esta sección utiliza React Hooks. Consulta la sección React Hooks para obtener más información sobre Hooks.

Problema

En este ejemplo, el Todos componente se vuelve a renderizar incluso cuando las tareas pendientes no han cambiado.

import { useState } from "react";
import ReactDOM from "react-dom/client";
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>
    </>
  );
};

const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(<App />);

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;

Al hacer clic en el botón de incremento, el Todoscomponente se vuelve a renderizar.


Si este componente fuera complejo, podría causar problemas de rendimiento.

Solución

Para solucionar esto, podemos utilizar memo.

Úselo memopara evitar que el Todos componente se vuelva a renderizar innecesariamente.

Envuelva la Todos exportación del componente en memo:

index.js:

import { useState } from "react";
import ReactDOM from "react-dom/client";
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>
    </>
  );
};

const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(<App />);


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);

Ahora el Todoscomponente solo se vuelve a renderizar cuando todosse actualizan los valores que se le pasan a través de propiedades.

huggh

Comentarios

Entradas populares de este blog

1-react-intro

condicional

useState