Tengo un componente principal que representa una colección de hijos basada en una matriz recibida a través de accesorios.
import React from 'react';
import PropTypes from 'prop-types';
import shortid from 'shortid';
import { Content } from 'components-lib';
import Child from '../Child';
const Parent = props => {
const { items } = props;
return (
<Content layout='vflex' padding='s'>
{items.map(parameter => (
<Child parameter={parameter} key={shortid.generate()} />
))}
</Content>
);
};
Parent.propTypes = {
items: PropTypes.array
};
export default Parent;
Cada vez que item
se agrega un nuevo , todos los niños se vuelven a procesar y estoy tratando de evitarlo, no quiero que se vuelvan a procesar otros niños, solo quiero renderizar el último que se agregó.
Así que probé React.memo en el niño donde probablemente compararé por la code
propiedad o algo así. El problema es que la función de igualdad nunca se llama.
import React from 'react';
import PropTypes from 'prop-types';
import { Content } from 'components-lib';
const areEqual = (prevProps, nextProps) => {
console.log('passed here') // THIS IS NEVER LOGGED!!
}
const Child = props => {
const { parameter } = props;
return <Content>{parameter.code}</Content>;
};
Child.propTypes = {
parameter: PropTypes.object
};
export default React.memo(Child, areEqual);
Alguna idea de por qué?
Respuestas:
En resumen, la razón de este comportamiento se debe a la forma en que funciona React.
React espera una clave única para cada uno de los componentes para poder realizar un seguimiento y saber cuál es cuál. Al
shortid.generate()
crear un nuevo valor de la clave, se crea la referencia al componente y React piensa que es un componente completamente nuevo, que necesita ser reenviado.En su caso, en cualquier cambio de accesorios en el padre, React representará a todos los hijos porque las claves serán diferentes para todos los hijos en comparación con el renderizado anterior.
Por favor, haga referencia a esta maravillosa respuesta a este tema
¡Espero que esto ayude!
fuente
No conozco el resto de su biblioteca, pero hice algunos cambios y su código y (principalmente) parece funcionar. Entonces, tal vez, puede ayudarlo a reducir la causa.
https://codesandbox.io/s/cocky-sun-rid8o
fuente