Para renderizar componentes/jsx más pequeños dentro de un componente más grande, existen varios enfoques que se pueden seguir. Por ejemplo, considera esto:
Método 1:
function BigComponent(props) { const renderSmallComponent1 = () => <div>{props.a}</div>; const renderSmallComponent2 = () => <div>{props.b}</div>; return ( <div> {renderSmallComponent1()} {renderSmallComponent2()} </div> ) }Método 2:
function BigComponent(props) { const smallComponent1 = <div>{props.a}</div>; const smallComponent2 = <div>{props.b}</div>; return ( <div> {smallComponent1} {smallComponent2} </div> ) }Método 3:
function SmallComponent1({ a }) { return <div>{a}</div>; } function SmallComponent2({ b }) { return <div>{b}</div>; } function BigComponent(props) { return ( <div> <SmallComponent1 a={props.a} /> <SmallComponent2 b={props.b} /> </div> ) }Solo estoy tratando de entender la diferencia en estos 3 en términos de
Estas son las cosas que entiendo:
SmallComponent son componentes React que se renderizan en otro componente, por lo que tendrían un ciclo de vida del componente, mientras que en el método 1 y 2, son jsx simples, que no tienen ciclo de vida, por lo que no se montarían/desmontarían como componentes ReactAlgunos otros artículos útiles:
ACTUALIZACIÓN : parece que la observación 1 es incorrecta, ya que los 3 aún se procesarían como componentes de reacción y, por lo tanto, tendrían un ciclo de vida del componente. Entonces reaccionar los montaría/desmontaría.
ACTUALIZACIÓN 2 : No, la observación 1 es correcta, los métodos 1 y 2 se tratan como jsx regulares como parte de BigComponent y no se tratan como componentes de reacción que tienen un ciclo de vida.
ACTUALIZACIÓN 3 : Hay otro método Método 4:
function BigComponent(props) { const SmallComponent1 = () => { return <div>{props.a}</div>; } const SmallComponent2 = () => { return <div>{props.b}</div>; } return ( <div> <SmallComponent1 /> <SmallComponent2 /> </div> ) }esto es similar al Método 3, pero el Método 3 frente al Método 4 es ligeramente diferente en la ejecución, cuando se depura a través de herramientas de desarrollo.
¿Has echado un vistazo al JS compilado en un proyecto de React?
Las etiquetas JSX se transforman esencialmente en declaraciones React.createElement . Puedes leer los documentos aquí . Esencialmente la sintaxis es:
React.createElement(FunctionOrClassComponent, { props }, ...children)
En los tres ejemplos, esto ocurriría. En los tres ejemplos, los componentes más pequeños son componentes funcionales en lugar de componentes de clase. Es decir, no tienen los métodos de ciclo de vida de React de un componente de clase, pero pueden usar ganchos de React equivalentes, si así lo desea.
Editado: la evaluación (instanciación y representación) depende de su lógica de representación. Si tiene declaraciones de representación condicional o sus funciones devuelven un valor nulo (o menos contenido) en función de ciertas condiciones, entonces, obviamente, está haciendo menos trabajo. Y como señaló correctamente en los comentarios a continuación, cuando asigna un JSX.Element a una variable, eso se evalúa en línea en lugar de como resultado de una función, por lo que eso sucede de inmediato.
Para mí, los tres son enfoques válidos. Para responder a sus preguntas:
Método 2:
function BigComponent(props) { const smallComponent1 = <div>{props.a}</div>; const smallComponent2 = <div>{props.b}</div>; return ( <div> {smallComponent1} {smallComponent2} </div> ) }useMemo() si el resultado de esos componentes pequeños proviene de un cálculo costoso.Método 3:
function SmallComponent1({ a }) { return <div>{a}</div>; } function SmallComponent2({ b }) { return <div>{b}</div>; } function BigComponent(props) { return ( <div> <SmallComponent1 a={props.a} /> <SmallComponent2 b={props.b} /> </div> ) }React necesita resolver la referencia y ejecutar la función después de resolver la referencia.
Es una composición de los componentes secundarios reales de reaccionar en un componente grande.
Los componentes secundarios pueden tener sus propios hooks .
Los componentes secundarios no se reinicializan, pero se vuelven a procesar si se cambia el estado de BigComponent.
Existe la posibilidad de que SmallComponent1 y SmallComponent2 se vuelvan a renderizar varias veces en el renderizado de BigComponents una vez si los componentes pequeños están actualizando su propio estado en función del cambio de accesorios en los padres.
si se supone que cada SmallComponents debe usar múltiples accesorios cuyo estado de BigComponents, Keeping SmallComponents fuera de BigComponent ofrece una buena experiencia de desarrollador.
Espero que el Método 1 y el Método 4 también se puedan entender utilizando estos puntos anteriores.
Nota: los componentes secundarios almacenados en variables y componentes secundarios como función se vuelven engañosos si la lógica de su aplicación usa ref o elemento DOM para mantener el enfoque o el punto de anclaje de la representación.