Повторный рендеринг вложенных компонентов React и согласование React

Я изо всех сил пытаюсь понять, как работает согласование при работе с вложенными реагирующими компонентами. Ниже мой код для index.js

      import React from "react";
import { render } from "react-dom";
import { useState, useEffect } from "react";

const TodoList = ({ todos }) => {
  useEffect(() => {
    console.log("mounted List")

    return () => {
      console.log("unmounted List")
    }
  }, [])

  const Todo = ({ txt }) => {
    useEffect(() => {
      console.log("mounted Todo")

      return () => {
        console.log("unmounted Todo")
      }
    }, [])

    return (
      <li>
        {txt}
      </li>
    );
  };
  return todos.map(todo => <Todo {...todo} />);
};

const App = () => {
  const [todos, setIt] = useState([{ txt: "foo" }, { txt: "bar" }, { txt: "baz" }])
  return (
    <>
      <button onClick={() => setIt(todos.concat({ txt: 'new' }))}>Click</button>
      <TodoList todos={todos} />
    </>)
}

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

Ниже находится index.html

      <div id="root"></div>

Меня смущает то, почему все экземпляры реакции продолжают размонтироваться и повторно монтироваться каждый раз, когда я нажимаю кнопку. Насколько я понимаю, «тип» экземпляров реакции не одинаков, потому что мы определяем компонент Todo локальновнутри компонента TodoList. Из-за этого мы в основном создаем новый компонент Todo каждый раз во время повторного рендеринга. Тем не менее, я чувствую, что мое объяснение является ответом очень высокого уровня (Кроме того, я даже не уверен, прав ли я), и я не уверен в деталях реализации более низкого уровня о том, как реагирующий согласователь управляет различиями между «тип» экземпляров реакции, когда у нас есть вложенные и невложенные компоненты. (Я использую термин «вложенный» и «не вложенный» в значении определения компонента реакции внутри другого компонента реакции, как в примере, который я привел).

1 ответ

Компонент Todo размонтирован, потому что TodoList перерисовывается при изменении состояния. Если вы держите компонент Todo вне компонента TodoList, он не будет размонтирован при изменении состояния.

Другие вопросы по тегам