Имя динамического тега стилизованного компонента

Я хочу сделать динамический компонент. (динамический ТЕГ будет стилизованным компонентом -> эмоция)

const Dynamic = ({ tag: Tag, children, ...rest }) =>
   <Tag {...rest}>
      { children }
   </Tag>

Компонент будет стилизованным, например:

const Column = styled(div)({ color: 'red' })
const Row = styled(span)({ color: 'yellow' })

Все выглядит красиво и работает правильно, БУУУУУТ:

Когда я пытаюсь использовать DynamicComponent внутри другого DynamicComponent:

<DynamicComponent tag = {Row}>
   {
      mapOver.map(item=>
         <DynamicComponent tag = {Column}/>
      )
   }
</DynamicComponent>

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

Что мне не хватает?

P.S .:

Если вместо использования динамических стилей я сделаю что-то вроде этого:

<Row>
   <Column/>
</Row>

затем правильно применяются стили, classNames, стилизованные теги.

Чтобы было немного понятнее:

Имя динамического тега стилизованного компонента

Как вы можете видеть, DynamicComponent будет использовать родительские стили, имена классов, стилизованные теги ... (НЕ ТАКОЕ ПОВЕДЕНИЕ, КОТОРОЕ Я БЫЛА ОЖИДАЕМ)

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
6
0
7 381
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

Существует неправильное понимание использования стилизованных компонентов, поскольку тег предназначен как тег HTML (input, div и т. д.). Лучше всего определить StyledRow и StyledColumn отдельно и использовать их с соответствующими именами. Это также поможет сделать ваш код более читабельным.

Имеет смысл, я просто хотел проверить, как другие видят такие вещи. Спасибо друг! :)

Istvan Orban 30.08.2018 12:00

Ниже пример создания имени динамического тега для стилизованный компонент:

// All headings use the same styled-component "Heading" function
const StyledHeading = styled.div`
    font-size: ${({level}) => 4/level }em; // <- dynamic font size
    font-weight: 300;
    margin: 0;
`

// the trick here is the "as = {...}" to create dynamic tag name
const Heading = ({level = 1, children}) => 
    <StyledHeading as = {`h${level}`} level = {level}>
        {children}
    </StyledHeading>


ReactDOM.render([
    <Heading>Hello, world!</Heading>,
    <Heading level = {2}>Title 2</Heading>,
    <Heading level = {3}>Title 3</Heading>
  ] ,document.body
)
<script src = "https://cdnjs.cloudflare.com/ajax/libs/react/16.6.3/umd/react.production.min.js"></script>
<script src = "https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.6.3/umd/react-dom.production.min.js"></script>
<script src = "https://unpkg.com/[email protected]/dist/styled-components.min.js"></script>

Справка:

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