207 lines
7.7 KiB
HTML
207 lines
7.7 KiB
HTML
<h1>Добавление диалогов</h1>
|
||
<h2>Диалог с сообщением</h2>
|
||
<p>
|
||
Некоторые ссылки в нашем приложении пока ведут в никуда и единственная реакция на щелчок по ним - это сообщение
|
||
в консоли, что не особо информативно, исправим этот недочёт. Создадим новый компонент MessageDialog.vue и, не
|
||
изобретая велосипедов, возьмём готовое решение для модального диалога из документации к Vuetify:
|
||
<a href="https://vuetifyjs.com/ru/components/dialogs" target="_blank">https://vuetifyjs.com/ru/components/dialogs</a>,
|
||
немного его модифицировав:
|
||
|
||
<div class="grey lighten-2" style="overflow-x: auto; border-radius: 5px;">
|
||
<pre>
|
||
<template>
|
||
<v-layout row justify-center>
|
||
<v-dialog
|
||
v-model="dialog"
|
||
persistent
|
||
max-width="290"
|
||
>
|
||
<v-card>
|
||
<v-card-title class="headline">{{ title }}</v-card-title>
|
||
<v-card-text>{{ text }}</v-card-text>
|
||
<v-card-actions>
|
||
<v-spacer></v-spacer>
|
||
<v-btn color="green darken-1" flat @click="dialog = false">Ok</v-btn>
|
||
</v-card-actions>
|
||
</v-card>
|
||
</v-dialog>
|
||
</v-layout>
|
||
</template>
|
||
|
||
<script>
|
||
export default {
|
||
data () {
|
||
return {
|
||
dialog: false,
|
||
title: "",
|
||
text: ""
|
||
}
|
||
}
|
||
}
|
||
</script>
|
||
</pre>
|
||
</div>
|
||
</p>
|
||
<p>
|
||
Подключите диалог, добавив в блок <code><script></script></code> файла App.vue строку
|
||
<code>import MessageDialog from './components/MessageDialog'</code> и ниже в <code>components: {}</code>
|
||
строку <code>MessageDialog</code>. Начало блока <code><sctipt></script></code> должно выглядеть следующим
|
||
образом:
|
||
|
||
<div class="grey lighten-2" style="overflow-x: auto; border-radius: 5px;">
|
||
<pre>
|
||
<script>
|
||
import MessageDialog from './components/MessageDialog'
|
||
import TOC from './components/TOC'
|
||
|
||
export default {
|
||
name: 'App',
|
||
components: {
|
||
MessageDialog,
|
||
TOC
|
||
},
|
||
</pre>
|
||
</div>
|
||
</p>
|
||
<p>
|
||
В конец блока <code><v-app></v-app></code> добавьте строку
|
||
<code><MessageDialog ref="MessageDialog" /></code>, после чего останется только в коде скрипта добавить
|
||
в секции .catch каждого обращения к Axios строки вызова нашего диалога с сообщением об ошибке:
|
||
|
||
<div class="grey lighten-2" style="overflow-x: auto; border-radius: 5px;">
|
||
<pre>
|
||
.catch(error => {
|
||
console.log(error);
|
||
this.$refs.MessageDialog.title = "Ошибка";
|
||
this.$refs.MessageDialog.text = error;
|
||
this.$refs.MessageDialog.dialog = true;
|
||
});
|
||
</pre>
|
||
</div>
|
||
Теперь все ошибки при загрузке файлов будут показаны пользователю.
|
||
</p>
|
||
|
||
<h2>Диалог с индикатором загрузки</h2>
|
||
<p>
|
||
При медленном соединении наше приложение будет загружать данные молча, ни коим образом не оповещая пользователя о
|
||
том, что оно работает, это нехорошо, давайте выводить при загрузке индикатор. Создадим компонент LoadingDialog.vue
|
||
как всегда воспользовавшись шаблоном vuetify:
|
||
|
||
<div class="grey lighten-2" style="overflow-x: auto; border-radius: 5px;">
|
||
<pre>
|
||
<template>
|
||
<div class="text-xs-center">
|
||
<v-dialog
|
||
v-model="dialog"
|
||
hide-overlay
|
||
persistent
|
||
width="300"
|
||
>
|
||
<v-card
|
||
color="primary"
|
||
dark
|
||
>
|
||
<v-card-text>
|
||
Загружаю данные, ожидайте...
|
||
<v-progress-linear
|
||
indeterminate
|
||
color="white"
|
||
class="mb-0"
|
||
>
|
||
</v-progress-linear>
|
||
</v-card-text>
|
||
</v-card>
|
||
</v-dialog>
|
||
</div>
|
||
</template>
|
||
|
||
<script>
|
||
export default {
|
||
data () {
|
||
return {
|
||
dialog: false
|
||
}
|
||
},
|
||
|
||
watch: {
|
||
dialog (val) {
|
||
if (!val) return
|
||
}
|
||
}
|
||
}
|
||
</script>
|
||
</pre>
|
||
</div>
|
||
</p>
|
||
<p>
|
||
Предлагаю вам самостоятельно подключить его в App.vue, добавив нужные строки в блоки шаблона и скрипта. В шаблоне
|
||
значение ref установите равным "LoadingDialog".
|
||
</p>
|
||
<p>
|
||
Справились? Теперь добавим код для отображения и скрытия диалога при загрузке файла в секцию mounted:
|
||
<div class="grey lighten-2" style="overflow-x: auto; border-radius: 5px;">
|
||
<pre>
|
||
mounted () {
|
||
this.$refs.LoadingDialog.dialog = true;
|
||
|
||
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;
|
||
});
|
||
}
|
||
}
|
||
);
|
||
}
|
||
</pre>
|
||
</div>
|
||
</p>
|
||
<p>
|
||
Всё, теперь во время загрузки данных мы будем видеть сообщение с бегунком.
|
||
</p>
|
||
<p>
|
||
P.S. Текст данной части можно взять тут: <a href="../data/id304.html" target="_blank">/data/id304.html</a>
|
||
</p>
|
||
<p>
|
||
P.P.S. Финальную версию можно скомпилировать командой <code>yarn build</code>.
|
||
</p> |