Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

154
Vistas
Child component's render still evaluated even though parent returns different component

I'm using swr in a react project and I'm trying to generify the loading/error messages in a parent component wrapping the components loading data.

The wrapping component is a very simple component returning different messages depending on the loadingstate.

const LoadingView = ({ loading, error, children }) => {
  if (error) {
    return <span>Error</span>
  }

  if (loading) {
    return <span>Loading...</span>
  }

  return <Container>{children}</Container>
}

And the child component:

const WipePeriodTeams = ({ wipePeriodId }) => {
  const params = useParams()
  const { data, error } = useSWR(
    `/some-endpoint`
  )

  return <LoadingView loading={!data}>{console.log(data.length)}</LoadingView> <--- ReferenceError
}

The issue being that the child component's render method is always evaluated, doesn't matter if loading is true/false which could end up in a ReferenceError due to data not loaded.

Is the return value always evaluated no matter what the parent returns? Is there a way around this?

Thanks! :)

over 4 years ago · Santiago Trujillo
1 Respuestas
Responde la pregunta

0

That is the correct behaviour - the evaluation of children occurs in the parent component. You are seeing an error because data is undefined, so data.length is trying to point to a property of something that doesn't exist.

One way to avoid the error is to use && separator to check if data exists before referring to its length:

<LoadingView loading={!data}>{data && console.log(data.length)}</LoadingView>

Another approach is to replace your JSX expression with a component. I understand your example has a contrived child console.log(), but in the real world you're likely to pass in another component(s). Components are functions, so not evaluated at parent level:

const ChildComponent = ({data}) => {
  return (<>{console.log(data.length)}</>)
}

const Parent = () => {
  const { data, error } = useSWR(
    `/some-endpoint`
  );
  return (
    <LoadingView loading={!data}>
      <ChildComponent data={data} />
    </LoadingView>
  );
}

Live example

There'a a few other approaches to delaying evaluation of children if you dig around online, but be cautious as some of them feel like messy workarounds.

over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda