Ленивый рендеринг детей

Взгляните на этот простой пример:

 const List = function({ loading, entity }) {
    return (
        <Layout loading = {loading}>
            <span>Name: {entity.name}</span>
        </Layout>
    );
};

Компонент Layout отображает свой children только тогда, когда loading - это false. Но проблема здесь в том, что React решает детей Layout немедленно. Поскольку entity - это null (в то время как loading=true), я получаю сообщение об ошибке, что он не может читать name из null. Есть ли простой способ избежать этой ошибки, поскольку этот span всегда будет отображаться, если entity не является null?

На данный момент я знаю около 3-х вариантов:

  1. Переместите этот span в stateless function, который принимает entity как prop
  2. Оберните весь children из Layout в function, а затем поддержите function children в Layout
  3. Просто используйте {entity && <span>Name: {entity.name}</span>}

Почему я должен использовать одну из этих опций и могу ли я заставить React рассматривать эти children как функцию и разрешать блок внутри позже перед рендерингом?

какая цель? ленивая загрузка? запрашивать файл фрагмента только тогда, когда пользователь достигает компонента? Или запрашивать чанк, только если включена загрузка var?

Leo Lima 16.09.2020 15:54
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
9
1
1 176
1

Ответы 1

Я просто наткнулся на ту же проблему.

Что сработало для меня, так это передача детей как функции:

  ready: boolean;
  children?: () => ReactNode,
}> = ({ ready, children }) => {
  return (
      <div>{
        ready ?
            children() :
            (
                <div>not ready</div>
            )
      }</div>
  );
};


<Layout loading = {loading}>
    {() => 
        <span>Name: {entity.name}</span>
    } 
</Layout>

Хотя все еще не идеально.

Другие вопросы по теме