Компонент высшего порядка принимает массив?

Я новичок, чтобы реагировать и Hocs шаблон. Я хотел объединить компоненты с <hr/> тег, чтобы каждый компонент был разделен линией. Так что я:

import React, { Fragment } from 'react';

const withSeparator = (ComponentList) => () => (
  <Fragment>
    { ComponentList.reduce((prev, curr) =>
      <Fragment>{prev} <hr/> {curr}</Fragment>
    ) }
  </Fragment>
)

export default withSeparator;

И мне интересно, если это withSeparator является HOCs, потому что он не принимает Компонент, но он принимает массив Компонентов. И мне интересно, где я должен положить это withSeparator функция, с обычными служебными функциями или с другой папкой hocs.

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

const Achievement = withSeparator(
  achievements.map((event, i) =>
    <React.Fragment key={i}>
      .
      .
      .
    </React.Fragment>
  )
)

export default <Achievement class="container" />

1 ответ

Я не уверен, зачем тебе HOC в этом случае. Это может быть сделано с помощью простого компонента React, как показано ниже:

const Foo = () => <div>Foo</div>;
const Baz = () => <div>Baz</div>;

const ComponentListWithSeparator = ({list}) => (
  <div>
    {list.map((component, i) =>
      <React.Fragment key={i}>
        {React.createElement(component)}
        <hr/>
      </React.Fragment>
    )}
  </div>
)

Использование: <ComponentListWithSeparator list={[Foo, Baz]}/>

ИЛИ вы можете использовать children в этом случае:

const ComponentChildrentWithSeparator = ({children}) => {
  const childrenWithSeparator = React.Children.map(children, (child, i) => (
    <React.Fragment key={i}>
      {child}
      <hr/>
    </React.Fragment>
   ))
   return (
     <div>
       {childrenWithSeparator}
     </div>
   )
}

И затем используйте это как:

 <ComponentChildrentWithSeparator>
    <Foo/>
    <Baz/>
  </ComponentChildrentWithSeparator>,

Оба примера вы можете проверить here

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