Может ли кто-нибудь помочь мне понять, что здесь происходит в каком-то коде, который мне нужно реорганизовать.
У меня есть компонент, который выглядит довольно обычным образом, например:
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 />}, я получаю сообщение об ошибке выполнения, в котором говорится, что вкладки ожидают функцию? Должен ли я просто изменить вкладки, чтобы ожидать, что объект заработает?





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}.
Можно попробовать home = {() => < MyContainer propName = {'value'} />}
Итак, есть ли способ передать ссылку на функцию обратного вызова в родительском компоненте? Мне действительно нужен этот дочерний компонент, чтобы иметь возможность изменять состояние родительского, например, псевдокод {MyContainer onSwitch = this.onSwitch}