Inferno — это высокопроизводительный JavaScript-фреймворк, ориентированный на построение интерфейсов с реактивным обновлением DOM. Одной из ключевых возможностей современных веб-приложений является поддержка темизации и динамического изменения стилей. В Inferno это реализуется через сочетание CSS-переменных, inline-стилей и реактивных свойств компонентов.
CSS-переменные (custom properties) позволяют определить значения, которые могут использоваться в разных частях стилей и динамически изменяться через JavaScript. Основное преимущество — возможность легко реализовать смену тем без необходимости перезагружать компоненты.
:root {
--primary-color: #3498db;
--secondary-color: #2ecc71;
--font-size: 16px;
}
.dark-theme {
--primary-color: #1abc9c;
--secondary-color: #e74c3c;
}
В этом примере определены базовые переменные и отдельная тема
dark-theme. Применение темы заключается в добавлении
соответствующего класса к корневому элементу приложения.
В Inferno можно управлять CSS-переменными через inline-стили или
напрямую через style объекта в компонентах. Это особенно
полезно для реактивной смены темы.
import { render } from 'inferno';
import { Component } from 'inferno-component';
class App extends Component {
constructor(props) {
super(props);
this.state = {
darkMode: false
};
}
toggleTheme = () => {
this.setState({ darkMode: !this.state.darkMode });
const root = document.documentElement;
if (this.state.darkMode) {
root.style.setProperty('--primary-color', '#3498db');
root.style.setProperty('--secondary-color', '#2ecc71');
} else {
root.style.setProperty('--primary-color', '#1abc9c');
root.style.setProperty('--secondary-color', '#e74c3c');
}
}
render() {
return (
<div style={{ color: 'var(--primary-color)', backgroundColor: 'var(--secondary-color)' }}>
<h1>Inferno Theme Example</h1>
<button onCl ick={this.toggleTheme}>Toggle Theme</button>
</div>
);
}
}
render(<App />, document.getElementById('root'));
Ключевой момент здесь — динамическая установка CSS-переменных
через document.documentElement.style.setProperty.
Это позволяет менять тему без повторного рендера компонентов.
Часто удобнее использовать классы для темизации, особенно если темы меняются редко или требуется поддержка большого количества стилей.
.button {
padding: 10px 20px;
font-size: var(--font-size);
color: var(--primary-color);
background-color: var(--secondary-color);
border: none;
border-radius: 4px;
cursor: pointer;
}
.light-theme .button {
--primary-color: #3498db;
--secondary-color: #2ecc71;
}
.dark-theme .button {
--primary-color: #1abc9c;
--secondary-color: #e74c3c;
}
В компоненте достаточно переключать класс на корневом элементе:
<div className={this.state.darkMode ? 'dark-theme' : 'light-theme'}>
<button className="button">Click me</button>
</div>
Такой подход позволяет разделять логику компонентов и оформление, сохраняя производительность Inferno.
Для более сложных сценариев, например изменения размеров элементов или цветов на основе состояния, можно использовать inline-переменные и связывать их с состоянием компонента:
<div style={{
'--dynamic-color': this.state.active ? '#e74c3c' : '#2ecc71',
backgroundColor: 'var(--dynamic-color)'
}}>
Dynamic color box
</div>
Здесь --dynamic-color привязана к состоянию компонента,
что позволяет изменять оформление в реальном времени без пересоздания
DOM-элементов.
CSS-переменные хорошо комбинируются с библиотеками вроде Tailwind или
Bootstrap. Например, можно переопределять базовые переменные Tailwind
через :root и динамически менять тему через JavaScript,
сохраняя привычную структуру классов и утилит.
:root {
--tw-bg-opacity: 1;
--tw-bg-color: #3498db;
}
.dark-theme {
--tw-bg-color: #1abc9c;
}
Компоненты Inferno могут использовать эти переменные, сочетая декларативную работу с классовой системой фреймворка.
Тщательное использование этих подходов обеспечивает чистую архитектуру, быструю работу интерфейса и лёгкость поддержки тем в больших проектах.