190 lines
8.2 KiB
HTML
190 lines
8.2 KiB
HTML
<h1>Цветовые схемы</h1>
|
|
<p>
|
|
Наша программа получилась такая светлая-красивая, но в темноте пользоваться ей неудобно, яркий свет от экрана слишком бьёт по глазам, предлагаю
|
|
<s>перейти на тёмную сторону</s> сделать тёмный вариант интерфейса.
|
|
</p>
|
|
<p>
|
|
Открывайте основной модуль нашего приложения App.vue. В блоке <code><script></code> найдите секцию <code>data ()</code> и добавьте в неё переменную dark
|
|
со значением по умолчанию равным false, это будет флаг использования тёмной версии интерфейса. После этого в блоке <code><template></code> измените
|
|
<code><v-app></code> на <code><v-app :dark="dark"></code>, этим мы свяжем наш флаг использования тёмной версии с назначением соответствующего
|
|
CSS-класса главному элементу программы.
|
|
</p>
|
|
<p>
|
|
Попробуйте изменить в <code>data ()</code> значение переменной dark на true, ваше приложение станет тёмным. Получилось? Теперь прикрутим меню с пунктом для
|
|
переключения вариантов интерфейса, для этого в конец блока <code><v-toolbar></code> добавим следующий код:
|
|
<div class="grey darken-3 white--text" style="overflow-x: auto; border-radius: 5px;">
|
|
<pre>
|
|
<v-menu bottom left>
|
|
<template v-slot:activator="{ on }">
|
|
<v-btn
|
|
flat
|
|
icon
|
|
v-on="on"
|
|
>
|
|
<v-icon>more_vert</v-icon>
|
|
</v-btn>
|
|
</template>
|
|
|
|
<v-list>
|
|
<v-list-tile>
|
|
<v-list-tile-action>
|
|
<v-switch v-model="dark" color="blue"></v-switch>
|
|
</v-list-tile-action>
|
|
<v-list-tile-title>Тёмная схема</v-list-tile-title>
|
|
</v-list-tile>
|
|
</v-list>
|
|
</v-menu>
|
|
</pre>
|
|
</div>
|
|
Теперь у нас есть переключатель темы, но при каждой повторной загрузке тема всегда включается светлая, реализуем сохранение значения флага в
|
|
cookies, для этого в блоке <code><script></code> добавим секцию <code>watch</code> с кодом, отслеживающим изменение флага dark и сохраняющим
|
|
его значение в localSorage:
|
|
<div class="grey darken-3 white--text" style="overflow-x: auto; border-radius: 5px;">
|
|
<pre>
|
|
watch: {
|
|
dark (val) { localStorage.dark = val; }
|
|
}
|
|
</pre>
|
|
</div>
|
|
</p>
|
|
<p>
|
|
Сохранение сделали, сделаем и чтение сохранённой информации, добавив в секцию <code>mounted</code> строку
|
|
<code>this.dark = localStorage.dark ? JSON.parse(localStorage.dark) : false;</code>. После чего наш App.vue должен выглядеть следующим образом:
|
|
<div class="grey darken-3 white--text" style="overflow-x: auto; border-radius: 5px;">
|
|
<pre>
|
|
<template>
|
|
<v-app :dark="dark">
|
|
<v-toolbar app>
|
|
<v-toolbar-title class="headline text-uppercase">
|
|
<span>Vue.js:</span>
|
|
<span class="font-weight-light">Самоучитель</span>
|
|
</v-toolbar-title>
|
|
<v-spacer></v-spacer>
|
|
<v-btn
|
|
flat
|
|
href="https://home.cainet.info:3000/cai/VueJS/"
|
|
target="_blank"
|
|
>
|
|
<span class="mr-2">Актуальная версия</span>
|
|
</v-btn>
|
|
<v-menu bottom left>
|
|
<template v-slot:activator="{ on }">
|
|
<v-btn
|
|
flat
|
|
icon
|
|
v-on="on"
|
|
>
|
|
<v-icon>more_vert</v-icon>
|
|
</v-btn>
|
|
</template>
|
|
|
|
<v-list>
|
|
<v-list-tile>
|
|
<v-list-tile-action>
|
|
<v-switch v-model="dark" color="blue"></v-switch>
|
|
</v-list-tile-action>
|
|
<v-list-tile-title>Тёмная схема</v-list-tile-title>
|
|
</v-list-tile>
|
|
</v-list>
|
|
</v-menu>
|
|
</v-toolbar>
|
|
|
|
<v-content>
|
|
<v-container fluid fill-height grid-list-md>
|
|
<v-layout row wrap full-height>
|
|
<v-flex sm4>
|
|
<TOC ref="TOC" />
|
|
</v-flex>
|
|
<v-flex sm8 v-html="text"></v-flex>
|
|
</v-layout>
|
|
</v-container>
|
|
</v-content>
|
|
<LoadingDialog ref="LoadingDialog" />
|
|
<MessageDialog ref="MessageDialog" />
|
|
</v-app>
|
|
</template>
|
|
|
|
<script>
|
|
import LoadingDialog from './components/LoadingDialog'
|
|
import MessageDialog from './components/MessageDialog'
|
|
import TOC from './components/TOC'
|
|
|
|
export default {
|
|
name: 'App',
|
|
|
|
components: {
|
|
LoadingDialog,
|
|
MessageDialog,
|
|
TOC
|
|
},
|
|
|
|
data () {
|
|
return {
|
|
dark: false,
|
|
docId: 0,
|
|
text: ""
|
|
}
|
|
},
|
|
|
|
mounted () {
|
|
this.$refs.LoadingDialog.dialog = true;
|
|
this.dark = localStorage.dark ? JSON.parse(localStorage.dark) : false;
|
|
|
|
this.axios.get("data/start.html")
|
|
.then(response => {
|
|
this.text = response.data;
|
|
this.$refs.LoadingDialog.dialog = false;
|
|
})
|
|
.catch(error => {
|
|
this.$refs.LoadingDialog.dialog = false;
|
|
console.log(error);
|
|
this.$refs.MessageDialog.title = "Ошибка";
|
|
this.$refs.MessageDialog.text = error;
|
|
this.$refs.MessageDialog.dialog = true;
|
|
});
|
|
|
|
this.$refs.LoadingDialog.dialog = true;
|
|
|
|
this.axios.get("data/toc.json")
|
|
.then(response => {
|
|
this.$refs.TOC.items = response.data;
|
|
this.$refs.LoadingDialog.dialog = false;
|
|
})
|
|
.catch(error => {
|
|
this.$refs.LoadingDialog.dialog = false;
|
|
console.log(error);
|
|
this.$refs.MessageDialog.title = "Ошибка";
|
|
this.$refs.MessageDialog.text = error;
|
|
this.$refs.MessageDialog.dialog = true;
|
|
});
|
|
|
|
this.$watch(
|
|
"$refs.TOC.active",
|
|
(newVal, oldVal) => {
|
|
if (newVal.length) {
|
|
this.$refs.LoadingDialog.dialog = true;
|
|
this.axios.get("data/id" + newVal + ".html")
|
|
.then(response => {
|
|
this.text = response.data;
|
|
this.$refs.LoadingDialog.dialog = false;
|
|
})
|
|
.catch(error => {
|
|
this.$refs.LoadingDialog.dialog = false;
|
|
console.log(error);
|
|
this.$refs.MessageDialog.title = "Ошибка";
|
|
this.$refs.MessageDialog.text = error;
|
|
this.$refs.MessageDialog.dialog = true;
|
|
});
|
|
}
|
|
}
|
|
);
|
|
},
|
|
|
|
watch: {
|
|
dark (val) { localStorage.dark = val; }
|
|
}
|
|
}
|
|
</script>
|
|
</pre>
|
|
</div>
|
|
</p> |