useTheme — это Composition API функция, предоставляемая
библиотекой Vuetify, которая позволяет управлять темами
приложения на уровне компонентов и глобально. Она обеспечивает
динамическое переключение между светлой и тёмной темами, настройку
пользовательских цветов и доступ к объекту темы для использования в
стилях и логике компонентов.
Для работы с useTheme необходимо, чтобы проект
использовал Vuetify 3 и Composition API. Основное
подключение выглядит следующим образом:
import { useTheme } from 'vuetify'
Внутри компонента Composition API создаёт реактивный объект
theme:
export default {
setup() {
const theme = useTheme()
return { theme }
}
}
После этого объект theme позволяет:
theme.global.name)theme.global.current.value.dark)theme.global.current.value.colors)Объект theme разделён на несколько ключевых частей:
global — глобальные настройки
темы.
name — имя текущей темы (например,
'light' или 'dark').
current — реактивный объект, содержащий свойства
темы.
dark — булевое значение, указывающее на тёмную или
светлую тему.colors — объект цветов, используемых в теме.variables — CSS-переменные, привязанные к цветам
темы.defaults — настройки по умолчанию
для компонентов, которые могут наследовать цвета из темы.
themes — определённые темы
приложения (например, пользовательские light и
dark).
Пример структуры colors:
{
primary: '#1976D2',
secondary: '#424242',
accent: '#82B1FF',
error: '#FF5252',
info: '#2196F3',
success: '#4CAF50',
warning: '#FB8C00'
}
Для динамического изменения темы используется реактивное свойство
dark:
const theme = useTheme()
function toggleDarkMode() {
theme.global.current.value.dark = !theme.global.current.value.dark
}
При этом все компоненты, использующие цвета из темы, автоматически обновят свои стили.
Можно добавлять или изменять цвета темы в реальном времени:
theme.global.current.value.colors.customBlue = '#1E88E5'
После этого новые цвета доступны в компонентах Vuetify через класс
color="customBlue" или через CSS переменные:
.my-element {
background-color: var(--v-theme-customBlue);
}
Использование темы в компонентах Vuetify осуществляется через атрибут
color:
<template>
<v-btn color="primary">Primary Button</v-btn>
<v-card color="customBlue">
<v-card-text>Пользовательский цвет</v-card-text>
</v-card>
</template>
Также можно динамически изменять цвет через реактивные свойства:
<template>
<v-btn :color="theme.global.current.value.dark ? 'accent' : 'primary'">
Кнопка с динамическим цветом
</v-btn>
</template>
При инициализации Vuetify можно задать собственные темы через объект
themes:
import { createVuetify } from 'vuetify'
const vuetify = createVuetify({
theme: {
defaultTheme: 'light',
themes: {
light: {
colors: {
primary: '#1976D2',
secondary: '#424242',
}
},
dark: {
colors: {
primary: '#BB86FC',
secondary: '#03DAC6',
}
}
}
}
})
После этого useTheme позволяет переключаться между этими
темами без перезагрузки приложения.
useTheme автоматически генерирует CSS-переменные для
всех цветов темы. Их можно использовать для стилизации любых
элементов:
.my-text {
color: var(--v-theme-primary);
}
.my-bg {
background-color: var(--v-theme-secondary);
}
Это обеспечивает интеграцию темы с нестандартными компонентами и кастомными стилями.
Можно добавлять новые цвета в тему без перезагрузки:
theme.global.current.value.colors.warning = '#FFA000'
Для удаления цвета:
delete theme.global.current.value.colors.warning
Все изменения сразу отражаются в компонентах, использующих эти цвета.
light и
dark темы с собственными палитрами.theme.global.current.value.dark для
управления режимом через переключатели.useTheme идеально сочетается с Vue 3 Composition
API, позволяя реактивно управлять темами и цветами прямо внутри
setup():
import { computed } from 'vue'
import { useTheme } from 'vuetify'
export default {
setup() {
const theme = useTheme()
const isDark = computed(() => theme.global.current.value.dark)
function toggleTheme() {
theme.global.current.value.dark = !theme.global.current.value.dark
}
return { isDark, toggleTheme, theme }
}
}
Это обеспечивает полную динамичность и гибкость при работе с цветами и стилями.
Можно получать доступ к CSS-переменным напрямую для сложной логики:
const primaryColor = getComputedStyle(document.documentElement)
.getPropertyValue('--v-theme-primary')
Использование этого метода полезно, если необходимо применить тему к сторонним библиотекам или нестандартным элементам DOM.
useTheme в Vuetify — мощный инструмент для управления
визуальным стилем приложения. Он объединяет глобальную и локальную
настройку цветов, поддержку светлого/тёмного режима, динамическое
добавление пользовательских цветов и интеграцию с Composition API. Этот
подход обеспечивает единообразие и гибкость при создании современных
интерфейсов.