Лучший способ поделиться функциональностью, но иметь разные стили?

#javascript #css #reactjs #frontend #styled-components

#javascript #css #reactjs #интерфейс #styled-компоненты

Вопрос:

Я создаю Next.js веб-сайт, и я сталкиваюсь с этой проблемой:

У меня есть 3 формы, которые работают практически одинаково, но все они выглядят по-разному. Я хотел бы создать фактическую форму только один раз, но иметь возможность каким-то образом стилизовать ее по-разному, не дублируя слишком много кода и делая все «правильно».

Решение, которое я придумал, состоит в том, чтобы просто присвоить форме класс и оформить его дочерние элементы с помощью классического CSS. Это работает, но кажется «неправильным», учитывая, что остальная часть проекта использует Styled-components . Я хотел бы найти решение, которое следует принципам SC вместо добавления глобальных стилей в приложение.

Вот как выглядит код в настоящее время:

 // form.js
export default Form = () => {
  /* ... hooks and stuff ... */  

  return (
    <form>
      /* ... */
    </form>
  )
}

// styled-form-1.js
import Form from './Form.js'

export default Form = () => {
  return (
    <Form className="styled-1" />
  )
}
 
 // globalStyles.css
.styled-1 form { /* ... */ }
.styled-1 input { /* ... */ }
.styled-1 button { /* ... */ }

.styled-2 form { /* ... */ }
.styled-2 input { /* ... */ }
.styled-2 button { /* ... */ }
 

Как я уже сказал… Это работает нормально, но я хочу сделать это способом styled-components. Я просто не могу найти это решение.

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

1. Попробуйте функцию тематизации styled-components.

Ответ №1:

Вы можете передать функцию литералу шаблона styled-component, чтобы адаптировать его на основе реквизитов. Например:

 const Button = styled.button`
  background: ${props => props.primary ? "red" : "blue"};
  color: ${props => props.primary ? "blue" : "red"};

  font-size: 1em;
  padding: 1em;
`;

render(
  <div>
    <Button>Normal</Button>
    <Button primary>Primary</Button>
  </div>
);
 

Таким образом, вы можете создавать отдельные компоненты стиля для своей формы и изменять ее стили на основе реквизитов. Для получения дополнительной информации ознакомьтесь с официальным документом

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

1. Вы бы все равно сделали это, если стили сильно отличаются? Я говорю о цвете, размере, положении и т. Д.

2. Если у вас большое количество переменных стилей, вы можете использовать тематический подход, в противном случае подход, основанный на реквизите. С помощью themes вы можете создать три разные темы для своих трех форм и просто передать эти темы соответствующему стилизованному компоненту @Ackman