React compara el árbol anterior con el nuevo para decidir qué conservar, actualizar o reemplazar. No realiza una comparación arbitraria de todo con todo: utiliza reglas de posición, tipo y keys.
Child es una función nueva en cada render. React puede tratarla como un tipo distinto y reiniciar su estado. Declara componentes en el nivel del módulo.
La identidad de una instancia no depende del lugar visual que ocupa en la pantalla, sino de cómo aparece dentro del árbol que devuelve su padre. React compara el árbol anterior y el nuevo y pregunta, para cada posición relevante, si sigue existiendo el mismo tipo y la misma key.
Texto
árbol anterior + árbol nuevo
↓
posición dentro del padre
↓
tipo del elemento
↓
key cuando pertenece a una colección
↓
preservar, mover, montar o desmontar
Si la identidad se conserva, también pueden conservarse state, refs y nodos DOM. Si cambia, React crea una instancia nueva.
Aunque el JSX está en ramas distintas, ambas producen ProfileForm en la misma posición. React puede conservar el state. Eso puede ser correcto si el formulario representa el mismo borrador con otra variante, o incorrecto si cada tipo de cuenta debe comenzar vacío.
La posición lógica de SearchBox cambia entre árboles. Para razonar sobre preservación, dibuja la estructura y no te guíes únicamente por el nombre del componente.
Cada ejecución de Parent crea una función Child nueva. Su referencia funciona como un tipo nuevo, por lo que React puede desmontar la instancia anterior y perder el input. Declara componentes en el nivel del módulo.
El cambio de contacto crea una conversación local nueva y evita que el borrador anterior aparezca en la siguiente persona.
No uses una key cambiante para forzar actualizaciones normales. Una key nueva no significa “renderiza otra vez”; significa “destruye esta instancia y crea otra”.