Стилизованные компоненты в Inferno позволяют объединить логику отображения и оформление в едином модуле, обеспечивая высокую читаемость и поддерживаемость кода. Подход основан на концепции CSS-in-JS, когда стили описываются непосредственно в JavaScript и привязываются к конкретным компонентам.
В Inferno для создания стилизованных компонентов обычно используют
библиотеки, совместимые с JSX, например styled-components
или собственные решения на основе функций. Простейший пример выглядит
так:
import { Component } from 'inferno';
import styled from 'styled-components';
const Button = styled.button`
background-color: #007bff;
color: white;
border: none;
padding: 0.5rem 1rem;
border-radius: 4px;
cursor: pointer;
font-size: 1rem;
&:hover {
background-color: #0056b3;
}
`;
class App extends Component {
render() {
return <Button>Нажми меня</Button>;
}
}
В этом примере создаётся компонент Button, который
содержит свои стили, полностью изолированные от
глобального CSS.
const PrimaryButton = styled(Button)`
background-color: #28a745;
&:hover {
background-color: #218838;
}
`;
Стилизованные компоненты в Inferno поддерживают динамические свойства, что делает возможным изменение стилей через пропсы:
const Alert = styled.div`
padding: 1rem;
border-radius: 4px;
color: white;
background-color: ${props => props.type === 'error' ? '#dc3545' : '#17a2b8'};
`;
<Alert type="error">Ошибка загрузки данных</Alert>
<Alert type="info">Информация успешно обновлена</Alert>
Для сложных сценариев можно определять функции, возвращающие стили на основе пропсов или состояния компонента:
const Card = styled.div(props => ({
padding: '1rem',
borderRadius: '8px',
backgroundColor: props.highlight ? '#ffc107' : '#f8f9fa',
boxShadow: props.highlight ? '0 4px 8px rgba(0,0,0,0.2)' : 'none'
}));
<Card highlight={true}>Важная карточка</Card>
<Card highlight={false}>Обычная карточка</Card>
Этот подход обеспечивает полную динамичность стилей, без необходимости изменения глобальных классов.
Стилизованные компоненты позволяют создавать тематические обёртки, где стили зависят от текущей темы:
import { ThemeProvider } from 'styled-components';
const theme = {
colors: {
primary: '#007bff',
secondary: '#6c757d'
}
};
const ThemedButton = styled.button`
background-color: ${props => props.theme.colors.primary};
color: white;
padding: 0.5rem 1rem;
`;
<ThemeProvider theme={theme}>
<ThemedButton>Тематическая кнопка</ThemedButton>
</ThemeProvider>
Такой подход обеспечивает централизованное управление стилями всего приложения, что особенно полезно для крупных проектов.
Стилизованные компоненты можно комбинировать с обычными классами и функциональными компонентами:
const Wrapper = styled.div`
display: flex;
gap: 1rem;
`;
const Item = ({ children }) => <Wrapper>{children}</Wrapper>;
<Item>
<Button>Кнопка 1</Button>
<PrimaryButton>Кнопка 2</PrimaryButton>
</Item>
Это позволяет постепенно внедрять CSS-in-JS, не переписывая полностью существующие компоненты.
ThemeProvider для единообразного оформления
больших приложений.Стилизованные компоненты в Inferno объединяют гибкость JSX и мощь CSS, создавая чистый и модульный подход к разработке пользовательского интерфейса.