Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

153
Views
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 answers
Answer question

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 Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!