Есть ли способ создать эмоциональную тему без «стилизации»?

С emotion (https://github.com/emotion-js/emotion) я знаю, что могу создавать темы с css и styled вместе с чем-то вроде:

const carouselCss = ({ theme }) => css`
 .. css properties etc
`;

const CarouselDiv = styled('div')`
  ${carouselCss};
`;

Затем в JSX:

<ThemeProvider theme = {{ stuff: 'blah' }}>
  <CarouselDiv>
        ..
  </CarouselDiv>
</ThemeProvider>

Но есть ли какой-либо элегантный способ темы только с css - предпочитаю не использовать компонентный styles, потому что я хочу сохранить семантические элементы html в JSX (также иметь массивную базу кода, и его легче перейти от sass к эмоциям без использования styled )

Я знаю, что могу сделать что-то вроде:

const carouselCss = (theme) => css`
 .. css properties etc
`;

затем jsx:

<div className = {carouselCss(this.props.theme)}>
..
</div>

Но это означает постоянную передачу свойства темы из компонента, что немного громоздко.

Есть лучший способ это сделать ? Как-нибудь обернуть css чем-нибудь, чтобы в него были введены тематические вары?

Поведение ключевого слова "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) для оценки ваших знаний,...
1
0
1 280
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вы можете использовать тема HoC. Но если вас беспокоит передача поддержки на слайдер, этот HoC в основном делает то же самое, то есть вводит theme в this.props.theme. Лично я бы использовал ThemeProvider API, если это возможно, возможно, с темой функционального стиля, как указано в документации:

// function-style theme; note that if multiple <ThemeProvider> are used,
// the parent theme will be passed as a function argument

const adjustedTheme = ancestorTheme => ({ ...ancestorTheme, color: 'blue' });
withTheme требует, чтобы вы передали компонент реакции, мне нужно сделать буквальную тему css осведомленной. Метод adjustedTheme использует styled, чего я стараюсь избегать, если это возможно.
Marty 03.09.2018 15:06

Может быть, вы можете попробовать что-нибудь в этом роде: codeandbox.io/s/n93lxvq7m0 (разветвлено из живой демонстрации эмоций). Объект темы доступен внутри getBorderProps

Andy Theos 03.09.2018 16:09
Ответ принят как подходящий

ThemeProvider даст вам это. Вот пример с показанными вариантами styled и css:

/** @jsx jsx */
import { jsx } from '@emotion/core'
import styled from '@emotion/styled'
import { ThemeProvider } from 'emotion-theming'

const theme = {
  colors: {
    primary: 'hotpink'
  }
}

const SomeText = styled.div`
  color: ${props => props.theme.colors.primary};
`

render(
  <ThemeProvider theme = {theme}>
    <SomeText>some text</SomeText>
    <div css = {theme => ({ color: theme.colors.primary })}>
      some other text
    </div>
  </ThemeProvider>
)

У меня вопрос о том, как делать темы без @emotion/styled.

Marty 18.09.2019 11:18

@Marty В этом примере я предоставил вам 2 варианта: один использует стили, а другой использует css prop непосредственно в div: <div css = {theme => css`color: ${theme.colors.primary}`}>I am styled!</div>

Saša Šijak 18.09.2019 15:18

Ага, правильно - это поддерживалось, начиная с эмоции 10 (когда я размещал статью, была только эмоция 9)

Marty 01.10.2019 11:47

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