Как вложить дочерние компоненты в родительские и экспортировать их?

#javascript #reactjs #export

#javascript #reactjs #экспорт

Вопрос:

Цель состоит в том, чтобы вложить компоненты и экспортировать тему, сохраняя базовый компонент в качестве компонента по умолчанию.

Вот результат, который я хочу получить.

 import Panel from './Panel';
...

<Panel&&t; // important as it contains its own CSS.
    <Panel.Head&&t;
        <h2&&t;Some Header Text</h2&&t;
    </Panel.Head&&t;

    <Panel.Body&&t;
        <p&&t;Some Content...</p&&t;
    </Panel.Body&&t;

    <Panel.Footer&&t;
        <button&&t;Confirm action...</button&&t;
    </Panel.Footer&&t;
</Panel&&t;
  

Я не могу найти способ вложить Head, Body, Footer в родительскую панель с помощью JS exports.

Это то, что у меня есть на данный момент.

 const Head = (props) =&&t; (
    <div className="panel--head"&&t;{props.children}</div&&t;
);

const Body = (props) =&&t; (
    <div className="panel--body"&&t;{props.children}</div&&t;
);

const Footer = (props) =&&t; (
    <div className="panel--footer"&&t;{props.children}</div&&t;
);

const Panel = (props) =&&t; (
    <div className="panel"&&t;{props.children}</div&&t;
);

export default Panel;
export { Head, Body, Footer };
  

То, что я пробовал, будет импортировано в import Panel, { Head, Body, Footer } from './Panel'; , чего я пытаюсь избежать.

Возможно ли это вообще? Будем признательны за любой совет.

Ответ №1:

То, что вы хотите сделать, невозможно, поскольку мы не можем визуализировать, Component который мог бы иметь такие подкомпоненты, как Component.SubComponentA , обходным путем здесь является использование render props API, который позволит экспортировать каждый компонент отдельно и Panel компонент для обслуживания необходимых подкомпонентов, поэтому вот подход:

 const PanelRP = (props) =&&t; (
  <div className="panel"&&t;{props.children({ Head, Body, Footer })}</div&&t;
);
  

И мы визуализируем это следующим образом:

 <PanelRP&&t;
  {({ Head, Body, Footer }) =&&t; (
    <&&t;
      <Head&&t;head</Head&&t;
      <Body&&t;body</Body&&t;
      <Footer&&t;footer</Footer&&t;
    </&&t;
  )}
</PanelRP&&t;
  

может ли этот API решить вашу проблему?