Реагировать на компонент, маскирующийся под функцию

Может ли кто-нибудь помочь мне понять, что здесь происходит в каком-то коде, который мне нужно реорганизовать.

У меня есть компонент, который выглядит довольно обычным образом, например:

export default class MyContainer extends PureComponent {
  //props
  //state
  //render()
  //etc.
}

Затем это передается как реквизит другому компоненту, например:

export class ParentContainer
render() {
    return (
      <div>
        <Tabs
          home = {MyContainer}
        />
      </div>
    );
  }
}

но то, что меня смутило, находится внутри вкладок, для этого требуется функция.

export default class Tabs extends PureComponent {
   static propTypes = {
    home: func.isRequired,
  }
}

Это вызывает у меня много вопросов:

Что делает этот home = {MyContainer}? Может быть, просто создать экземпляр встроенного компонента со всеми реквизитами по умолчанию? Я раньше не видел такого синтаксиса. И почему этот компонент действует как функция. Что-то происходит за кулисами, например, реакция неявно преобразует компонент в функцию render ()?

Если я попытаюсь создать его «нормальным» способом, чтобы добавить новые реквизиты, то есть {<MyContainer />}, я получаю сообщение об ошибке выполнения, в котором говорится, что вкладки ожидают функцию? Должен ли я просто изменить вкладки, чтобы ожидать, что объект заработает?

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

Ответы 1

Ответ принят как подходящий

What does this home = {MyContainer} do?

Компонент MyContainer передается как опора компоненту Tabs. Tabs, в свою очередь, решит, когда визуализировать компонент MyContainer.

And why is this component acting as a function. Is there something going on behind the scenes like react is implicitly converting the component to the render() function perhaps?

Компоненты React - это классы ES6. Все классы в JavaScripts по своей природе являются functions. Синтаксис class - это просто синтаксический сахар для определения функции. Вот почему home: func.isRequired означает, что компонент должен быть передан в опору home.

If I try instantiate it in the 'normal' way so that I can add some new props i.e. {< MyContainer />} I get a runtime error saying that Tabs is expecting a function? Should I just change the Tabs to expect an object to get this working?

Нет. Когда вы передаете {< MyContainer />} в home, вы пытаетесь запустить компонент, устанавливая его в опоре home. Вы должны передавать только ссылку на опору home, например home = {MyContainer}.

Итак, есть ли способ передать ссылку на функцию обратного вызова в родительском компоненте? Мне действительно нужен этот дочерний компонент, чтобы иметь возможность изменять состояние родительского, например, псевдокод {MyContainer onSwitch = this.onSwitch}

orion_kid 06.12.2018 18:19

Можно попробовать home = {() => < MyContainer propName = {'value'} />}

Dinesh Pandiyan 07.12.2018 03:38

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