Додаток на Angular з перемикачем теми (світла/темна) за допомогою бібліотеки PrimeNG v18/19
Оточення:
ng version
_ _ ____ _ ___
/ \ _ __ __ _ _ _| | __ _ _ __ / ___| | |_ _|
/ △ \ | '_ \ / _` | | | | |/ _` | '__| | | | | | |
/ ___ \| | | | (_| | |_| | | (_| | | | |___| |___ | |
/_/ __| |_|__, |__,_|_|__,_|_| ____|_____|___|
|___/
Angular CLI: 19.0.7
Node: 22.13.0
Package Manager: npm 11.0.0
OS: win32 x64
Налаштування додатка Angular з PrimeNG
Розпочнемо з ініціалізації нового додатка Angular за допомогою CLI та встановлення PrimeNG:
npm install -g @angular/cli
ng new dark-theme-switch-primeng
cd dark-theme-switch-primeng
npm install primeng @primeng/themes
Інтеграція PrimeNG з версії v18 стала набагато простішою. Використовуючи опцію теми, ми повідомляємо PrimeNG, що будемо перемикати темну тему, застосовуючи CSS клас в DOM.
app.config.ts
import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';
import { provideRouter } from '@angular/router';
import { routes } from './app.routes';
import { providePrimeNG } from 'primeng/config'; // Імпортуємо функцію providePrimeNG
import Aura from '@primeng/themes/aura'; // Імпортуємо тему Aura
export const appConfig: ApplicationConfig = {
providers: [provideZoneChangeDetection({ eventCoalescing: true }),
provideRouter(routes),
providePrimeNG({
theme: {
preset: Aura,
options: {
darkModeSelector: '.my-app-dark'
}
},
}),
]
};
Ця конфігурація дозволяє використовувати тему Aura від PrimeNG та підтримує темну тему, яку можна активувати, використовуючи селектор .my-app-dark
. Ви можете використовувати будь-яку тему за вашим вибором, просто ознайомтесь з темами, наданими бібліотекою PrimeNG.
Перемикач темної теми
Тепер додамо сервіс для керування та збереження обраної теми.
ng g s services/theme
import { Injectable } from '@angular/core';
@Injectable({
providedIn: 'root',
})
export class ThemeService {
private darkThemeClass = 'my-app-dark';
private themeKey = 'app-theme';
constructor() {
this.loadTheme();
}
toggleDarkMode(): boolean {
const element = document.querySelector('html');
if (element) {
element.classList.toggle(this.darkThemeClass);
const isDarkMode = element.classList.contains(this.darkThemeClass);
localStorage.setItem(this.themeKey, isDarkMode ? 'dark' : 'light');
return isDarkMode;
}
return false;
}
private loadTheme() {
const savedTheme = localStorage.getItem(this.themeKey);
if (savedTheme === 'dark') {
const element = document.querySelector('html');
if (element) {
element.classList.add(this.darkThemeClass);
}
}
}
}
Пояснення коду
Метод loadTheme
є приватним методом класу.
Він відповідає за завантаження збереженої теми з локального сховища (localStorage) та застосування темної теми до елемента документа, якщо збережена тема — «dark». ThemeService
Отримання збереженої теми:
Метод намагається отримати значення збереженої теми з localStorage, використовуючи ключ .this.themeKey
const savedTheme = localStorage.getItem(this.themeKey);
Перевірка теми:
Перевіряється, чи є збережена тема «dark».
if (savedTheme === 'dark') {
Вибір елемента HTML:
Вибирається елемент документа
const element = document.querySelector('html');
Застосування класу теми:
Якщо елемент знайдено, додається відповідний CSS клас для темної теми (.this.darkThemeClass
) до елемента.
if (element) {
element.classList.add(this.darkThemeClass);
}
Перемикач темної теми
Тепер додамо перемикач для управління темою.
ng g c components/switch-theme
switch-theme.component.ts
import { Component, OnInit } from '@angular/core';
import { InputSwitchModule } from 'primeng/inputswitch'; // Імпортуємо InputSwitchModule
import { FormsModule } from '@angular/forms'; // Імпортуємо FormsModule
import { ThemeService } from '../../services/theme.service'; // Імпортуємо ThemeService
@Component({
selector: 'app-switch-theme',
imports: [InputSwitchModule, FormsModule], // Додаємо InputSwitchModule та FormsModule до масиву imports
templateUrl: './switch-theme.component.html',
styleUrl: './switch-theme.component.scss'
})
export class SwitchThemeComponent implements OnInit {
isDarkMode: boolean = false;
constructor(private themeService: ThemeService) { }
ngOnInit() {
// Ініціалізація стану перемикача на основі поточної теми
const currentTheme = localStorage.getItem('app-theme');
this.isDarkMode = currentTheme === 'dark';
}
toggleDarkMode() {
this.isDarkMode = this.themeService.toggleDarkMode();
}
}
SwitchThemeComponent
керує перемиканням між світлою та темною темами, ініціалізуючи стан перемикача на основі поточної теми та змінюючи тему через виклик сервісу ThemeService
.
Тепер достатньо додати компонент для перемикання між режимами.
switch-theme.component.html
Шаблон використовує компонент PrimeNG для перемикання між світлою та темною темами, зв'язуючи його стан із властивістю isDarkMode
і викликаючи метод toggleDarkMode
при зміні стану.
Кінцевий результат:
Повний код для цього прикладу доступний на GitHub:
CiceroBrunelli/dark-theme-switch-primeng
Перекладено з: Switch dark mode com Angular Standalone e PrimeNG