CSS-in-JS представляет собой подход к стилевому оформлению компонентов, при котором CSS определяется непосредственно в JavaScript. В контексте Preact это позволяет создавать изолированные и легко масштабируемые компоненты, управлять динамическими стилями и минимизировать конфликт имен классов.
Ключевые особенности подхода:
styled-components с PreactХотя styled-components чаще применяют с React,
библиотека полностью совместима с Preact благодаря совместимым API. Она
позволяет создавать компоненты с встроенными стилями.
Пример использования:
import { h } from 'preact';
import styled from 'styled-components';
const Button = styled.button`
background-color: ${props => props.primary ? 'blue' : 'gray'};
color: white;
padding: 8px 16px;
border: none;
border-radius: 4px;
cursor: pointer;
&:hover {
background-color: ${props => props.primary ? 'darkblue' : 'darkgray'};
}
`;
export const App = () => (
<div>
<Button primary>Primary Button</Button>
<Button>Default Button</Button>
</div>
);
В этом примере:
primary).preact-emotionpreact-emotion — облегчённая версия библиотеки
emotion, оптимизированная под Preact. Она позволяет
создавать стилизованные компоненты и работать с динамическими
свойствами.
Пример:
import { h } from 'preact';
import { css } from 'preact-emotion';
const cardStyle = css`
padding: 16px;
border-radius: 8px;
box-shadow: 0 2px 8px rgba(0,0,0,0.1);
background-color: white;
`;
export const Card = ({ children }) => (
<div className={cardStyle}>
{children}
</div>
);
Особенности:
css, которая возвращает
уникальный класс.CSS-in-JS позволяет применять стили условно и реагировать на состояние компонента. В Preact это делается с помощью обычных JavaScript-выражений.
Пример с состоянием:
import { h } from 'preact';
import { useState } from 'preact/hooks';
import styled from 'styled-components';
const ToggleButton = styled.button`
background-color: ${props => props.active ? 'green' : 'red'};
color: white;
border: none;
padding: 10px 20px;
border-radius: 5px;
cursor: pointer;
`;
export const Toggle = () => {
const [active, setActive] = useState(false);
return (
<ToggleButton active={active} onCl ick={() => setActive(!active)}>
{active ? 'Active' : 'Inactive'}
</ToggleButton>
);
};
Принцип работы:
Даже при использовании CSS-in-JS иногда требуется глобальный CSS. В
styled-components для этого существует
createGlobalStyle.
Пример:
import { createGlobalStyle } from 'styled-components';
const GlobalStyle = createGlobalStyle`
body {
margin: 0;
font-family: Arial, sans-serif;
background-color: #f5f5f5;
}
`;
export const App = () => (
<>
<GlobalStyle />
<div>Контент приложения</div>
</>
);
Особенности:
CSS-in-JS в Preact обеспечивает удобную и мощную систему для работы со стилями компонентов, сочетая возможности динамического JavaScript с привычными методами CSS. Этот подход делает код более модульным, поддерживаемым и гибким для построения современных интерфейсов.