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

#css #styled-components

#css #стилизованные компоненты #styled-компоненты

Вопрос:

У меня есть несколько компонентов, используемых для создания макетов. Например, строка, столбец и компонент вертикального выравнивания:

 export const Row = styled.div`
  display: flex;
  align-items: flex-start;
  flex-wrap: wrap;
  width: 100%;

  > * {
    margin-left: 10px;
    amp;:last-child {
      margin-left: 0;
    }
  }
`

export const Column = styled.div`
  flex: 1;
`

export const VerticalAlign = styled.div`
  align-items: center;
  display: flex;
`
  

Их совместное использование приводит к созданию ненужных вложенных разделов:

 <Row>
  <Column>
    <VerticalAlign>
      <Icon />
      <input />
    </VerticalAlign>
  </Column>
  <Column>
    <VerticalAlign>
      // ...
    </VerticalAlign>
  </Column>
</Row>
  

Если бы это был просто css, я бы сделал это:

 <div class="row">
  <div class="column vertical-align">
    // ...
  </div>
</div>
  

Я мог бы расширить классы, но это создало бы взрыв одноразовых компонентов для каждой комбинации:

 const VerticalAlignColumn = styled(Column)`
  align-items: center;
  display: flex;
`;

const VerticalAlignRow = styled(Row)`
  //...
`;
  

Есть ли способ легко объединить стили нескольких компонентов в один компонент? Что-то вроде <Row VerticalAlign>...</Row VerticalAlign> ?

Ответ №1:

Я не мог найти способ сделать так, как ты хочешь.

И лучший подход здесь, как вы сказали (создание расширенных классов) или работа с реквизитами, например:

 export const Column = styled.div`
  flex: 1;

  ${({ verticalAlign }) =>
    verticalAlign amp;amp;
    `
    align-items: center;
    display: flex;
  `}
`;

<Column verticalAlign>
   <Icon />
   <input />
</Column>
<Column>
   <Icon />
   <input />
</Column>

  

Вы также можете работать с классами, но у этого есть некоторые особенности -> Стилизация обычных компонентов React