Использование переменных Javascript с styleled-компонентами
Я использую styled-компоненты для сборки своих компонентов. Все свойства стиля, которые принимают пользовательские значения, повторно используются во всех моих компонентах (как и должно быть). Имея это в виду, я бы хотел использовать какие-то глобальные переменные, чтобы обновления распространялись на все компоненты без необходимости индивидуального обновления каждого стиля.
Что-то вроде этого:
// Variables.js
var fontSizeMedium = 16px;
// Section.js
const Section = styled.section`
font-size: ${fontSizeMedium};
`;
// Button.js
const Button = styled.button`
font-size: ${fontSizeMedium};
`;
// Label.js
const Label = styled.span`
font-size: ${fontSizeMedium};
`;
Я полагаю, что я неправильно понимаю синтаксис? Кроме того, я знаю, что глобальные переменные не рекомендуются в Javascript, но при разработке дизайна повторное использование стилей в компонентах является абсолютной необходимостью. Каковы компромиссы здесь?
2 ответа
В конце концов я понял это, так что вот как вы можете это сделать, по крайней мере, если использовать React.
Вам нужно определить переменные в одном файле и экспортировать их.
// Variables.js
export const FONTSIZE_5 = '20px';
Затем вам нужно импортировать эти переменные в каждый файл компонента.
// Button.js
import * as palette from './Variables.js';
Затем вы можете использовать переменные в ваших стилевых компонентах следующим образом:
const Button = styled.button`
font-size: ${palette.FONTSIZE_5};
`;
Упаковка <ThemeProvider>
Вокруг вашего приложения могут помочь:
https://www.styled-components.com/docs/advanced
const theme = {
fontColour: 'purple'
}
render() {
return (
<ThemeProvider theme={theme}>
<MyApplication />
</ThemeProvider>
)
}
Это даст всем дочерним стилевым компонентам доступ к теме следующим образом:
const MyApplication = styled.section`
color: ${props => props.theme.fontColour}
`
Или же
const MyFancyButton = styled.button`
background: ${props => props.theme.fontColour}
`
Или получить доступ к теме через https://www.styled-components.com/docs/advanced
Ваше окончательное решение работает по 2 двум причинам:
- Простое объявление переменной в файле не привязывает ее к глобальной области видимости для всего приложения, поэтому другие файлы не знают об этом, если не импортированы в.
16px
не является допустимым значением. Его нужно было заключить в кавычки, чтобы сделать его строкой (как вы это сделали с'20px'
), илиpx
нужно было удалить.
Я столкнулся с аналогичной ситуацией, за исключением того, что мне нужно, чтобы мои переменные были числами, а не строками, и это тоже работает:
const CELL_SIZE = 12;
const ROWS = 7;
const CELL_GAP = 3;
const BannerGrid = styled.div`
display: grid;
grid-template-columns: repeat(auto-fit, ${CELL_SIZE}px);
grid-template-rows: repeat(${ROWS}, ${CELL_SIZE}px);
grid-column-gap: ${CELL_GAP}px;
grid-row-gap: ${CELL_GAP}px;
grid-auto-flow: column;
`;