Theme 変更点(Vuetify 2 〜 Vuetify 3 アップデート)
Vuetify 3 Theme の変更点
この記事では、Vuetify 3.5.16
での theme の変更点をまとめています。
また、記事の内容は Composition API を利用して検証しています。
Vuetify 2 Theme Configuration
Vuetify 3 Theme Configuration
Theme の変更点
Vuetify 2 では、this.$vuetify.theme.dark
の 真偽値で dark
と light
のクラスを付与することでテーマを切り替えていました。
<template>
<v-app>
<v-btn @click="toggleTheme">テーマ切り替え</v-btn>
</v-app>
</template>
<script>
export default {
methods: {
toggleTheme() {
this.$vuetify.theme.dark = !this.$vuetify.theme.dark;
}
}
}
</script>
Vuetify 3 では useTheme
を利用してテーマを切り替えることができます。
<script setup lang="ts">
import { useTheme } from 'vuetify'
const theme = useTheme()
const toggleTheme = () => {
theme.global.name.value = theme.global.current.value.dark ? 'light' : 'dark'
}
</script>
<template>
<v-app>
<v-btn @click="toggleTheme">テーマ切り替え</v-btn>
</v-app>
</template>
テンプレート内での利用
Vuetify 2では、new Vuetify にtheme -> themes -> light のプロパティに定義していました。
new Vuetify({
theme: {
dark: false,
themes: {
light: {
primary: "#3f51b5",
secondary: "#b0bec5",
accent: "#8c9eff",
error: "#b71c1c",
},
},
},
})
これらの値を利用する際は、 $vuetify
もしくは this.$vuefiy
でアクセスします。
テンプレート内で利用する場合は、 $vuetifyでアクセスできます。
<template>
<v-app id="app">
<v-container>
{{ $vuetify.theme.themes.light.primary }} // #3f51b5
</v-container>
</v-app>
</template>
coumputedなどのスクリプト内で利用する場合は、thisでアクセスします。
<template>
<v-app id="app">
<v-container>
{{ themesColorPrimary }} // #3f51b5
</v-container>
</v-app>
</template>
<script>
export default {
computed: {
themesColorPrimary() {
return this.$vuetify.theme.themes.light.primary;
},
}
};
</script>
Vuetify 3 では useThemeを利用して、 createVuetify にtheme -> themes -> light のプロパティに定義します。
createVuetify({
components,
directives,
theme: {
themes: {
light: {
colors: {
primary: '#1976D2',
}
}
}
}
})
テンプレート内で利用する場合は、script で useTheme() を呼び出して変数に格納して、テンプレートで呼び出します。
Vuetify 2との違いとしては、 useThemeを読み込む必要がある。
composable を利用している場合は themes 配下は、 .value
が必要になります。
<template>
<div>
{{ theme.themes.value.light.colors.primary}} // #1976D2
{{ light.colors.primary }} // 分割代入 #1976D2
</div>
</template>
<script setup lang="ts">
import { useTheme } from 'vuetify'
const theme = useTheme()
// 分割代入でも可能
const { themes: {value: { light }}} = useTheme()
</script>
defaultTheme の設定
Vuetify 3 でも同様に light と dark の theme がプリインストールされています。
Vuetify 2 では dark: true
でダークテーマをONにして切り替えを実現していました。
Vuetify 3からはカスタマイズしたテーマも挿入することができるようになったため、defalutTheme
が提供されるようになりました。
import { createApp } from 'vue'
import { createVuetify } from 'vuetify'
export default createVuetify({
theme: {
defaultTheme: 'dark'
}
})
カスタムテーマの設定
Vuetify 3 ではカスタマイズしたテーマを設定することが可能になりました。
theme.themes
にカスタマイズした値を設定することで利用することができるようになりました。
const myCustomLightTheme = {
dark: false,
colors: {
background: '#FFFFFF',
surface: '#FFFFFF',
primary: '#1867C0',
secondary: '#48A9A6',
error: '#B00020',
info: '#2196F3',
success: '#4CAF50',
warning: '#FB8C00',
}
}
export default createVuetify({
theme: {
defaultTheme: 'myCustomLightTheme',
themes: {
myCustomLightTheme,
},
},
})
Vuetify 2 では、オリジナルのテーマをインストールして利用していましたが、Vuetify 3 では設定ファイルのみで定義することができます。
import Vue from 'vue'
import Vuetify from 'vuetify/lib'
import minifyTheme from 'minify-css-string' // minifyTheme をインポート
Vue.use(Vuetify)
export default new Vuetify({
theme: {
options: { minifyTheme },
},
})
useTheme の情報
useTheme
で提供される値は以下になります。
提供されるオブジェクトは ref が定義されていることから Composition API の利用で取得する場合には、末尾に .value
(※ global以外) を付与する必要があります。
- computedThemes.value
- 定義したテーマ情報を含むオブジェクトを返します
- current.value
- 現在のテーマ情報
- global
- グローバルのテーマ情報のインスタンスを参照
- isDisabled
- テーマ無効(3.6.8 のバージョンでは、プロパティが存在しないエラーになる)
- name.value
- 現在のテーマ名
- styles.value
- テーマのスタイル情報
- themeClasses.value
- テーマのクラス名
- themes.value
- テーマ情報
これらの情報を uesTheme
から取得することができます。
themeの値をCSSで利用する場合の変更点
Vuetify 2 では、customProperties に true
を渡すことで スタイルに変数を渡すことができました。
Vuetify 3 では、customPropertiesは不要でスタイルに変数を渡すことができます。
変更点は、スタイルの記述方法が変わりました。
- varの前に
rgb / rgba
を追加する - 末尾の
base
を削除して、--v-
のあとにtheme
を追加
<style>
.my-class {
- background-color: var(--v-primary-base);
+ background-color: rgb(var(--v-theme-primary));
}
</style>
v-theme-provider の変更点
Vuetify 2 でもあった v-theme-provider
は Vuetify 3でも同様になりますが、propsの情報が変わりました。
Vuetify 2 では 以下の propsのみを提供していました。
- light:
boolean
- dark:
boolean
- root:
boolean
Vuetify 3 では以下の propsを提供しています。
- tag:
string
- theme:
string
- with-background:
boolean
デフォルトのテーマを設定できるようになったことで変更になったようです。
アップデートの際に特定の画面でテーマを設定している場合は、変更が必要になります。
with-backgroundは、背景色を設定するかどうかを設定するプロパティです。
このとき v-theme-provider は v-app の中に配置する必要があります。
<v-app>
- <v-theme-provider dark>
+ <v-theme-provider theme="dark" with-background>
<v-card>
<v-card-title>Theme Dark</v-card-title>
<v-card-text>
<v-btn>ダークテーマ</v-btn>
</v-card-text>
</v-card>
</v-theme-provider>
</v-app>
まとめ
Vuetify 3 での theme の変更点についてまとめました。
アップデートに伴っていくつかの変更点があり、そのまま移行はできないため適宜修正が必要になります。
Composition API に書き換えしている場合にも扱いに注意が必要そうです。
Vuetify 3からはカスタムなテーマを定義できるため、従来のようにライトやダークの値を上書きするような対応でなく新設できる点が個人的に良いかなと思いました。
だれかの参考になれば幸いです。
参考記事
Discussion