Потеря реквизита компонента при использовании стилизованного компонента «как» для расширенного стилизованного компонента

#javascript #reactjs #architecture #styled-components #styling

#javascript #reactjs #архитектура #стилизованные компоненты #укладка

Вопрос:

Я написал компонент CallToAction следующим образом:

 const CallToAction = ({ text = "Default text" }) => (
  <S_CallToAction>{text}</S_CallToAction>
)
const S_CallToAction = styled.div`
  // Some styles...
`
export default CallToAction
 

Затем, когда я хочу использовать его в других компонентах и перегрузить его еще несколькими стилями, я теряю свой «текстовый» реквизит и предыдущие стили, которые я объявил в своем компоненте «CallToAction».
Это хорошо работает, когда я удаляю реквизит «as = {‘button’}».

Вот что я сделал, когда захотел использовать его в другом компоненте, перегрузив его:

 import CallToAction from "components/common/callToAction"
 

         <S_ProductButton
          as={'button'}
          text={`I want my text to display and my style being inherited`}
        />
 

 const S_ProductButton = styled(CallToAction)`
      width: 50%;
      margin: auto;
      min-width: 300px;
`
 

Может ли кто-нибудь объяснить мне, почему добавление реквизита «as» приводит к перегрузке моего стиля, а текстовый реквизит больше не работает?
Кроме того, как вы справляетесь с такой ситуацией?

Примечание: я новичок в стилизованных компонентах… Я мог бы экспортировать «S_CallToAction» (только стили) и использовать его в других моих компонентах, но хорошее ли это решение? Для меня это нарушило бы идею «один компонент = один стиль», которая является идеей, лежащей в основе стилизованных компонентов…

Ответ №1:

Хорошо, я наконец-то нашел решение своей проблемы! Есть еще одна опора для моего варианта использования, которая называется «forwardedAs«, используемая как опора «as», и это заставляет мой перегруженный стилизованный компонент работать по назначению.

Мне пришлось распространить весь реквизит через {…props} на мой компонент CallToAction (который изначально имеет стиль.a)

 const CallToAction = ({ text = "Text", href, ...props}) => (
  <S_CallToAction href={href ? href : null} {...props}>{text}</S_CallToAction>
)
 

А затем в моем расширенном компоненте мне пришлось использовать forwardedAs:

            <S_ProductButton
              forwardedAs={'button'}
              text={`I have my text and my styles inherited`}
            /> 
 

Вот подробности о проблеме, с которой я столкнулся, и почему styled-components действует так: https://github.com/styled-components/styled-components/issues/1981

Комментарии:

1. Вы мне очень помогли!! Спасибо!!