VueJS/public/data/id306.html

230 lines
7.7 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<h1>Кнопка возвращения</h1>
<p>
Всё у нас вроде бы красиво, но вот проматывать каждый раз страницу вверх после прочтения урока неудобно, добавим кнопку возвращения к началу страницы.
Для этого нам потребуется в блок <code>&lt;v-app>&lt;/v-app></code> добавить код отображения самой кнопки:
<div class="grey darken-3 white--text" style="overflow-x: auto; border-radius: 5px;">
<pre>
&lt;v-fab-transition>
&lt;v-btn
v-show="scrolled"
color="blue"
@click="scrollToTop"
dark
fixed
bottom
right
fab
>
&lt;v-icon>keyboard_arrow_up&lt;/v-icon>
&lt;/v-btn>
&lt;/v-fab-transition>
</pre>
</div>
</p>
<p>
Как вы уже наверное заметили, кнопка у нас привязана к флагу отображения scrolled, это сделано для того чтобы она отображалась только когда требуется,
соответственно вам надо добавить данный флаг в блок data скрипта и назначить ему значение false. Сделали? Теперь добавим отслеживание прокрутки и
обработчик нажатия на кнопку - scrollToTop:
<div class="grey darken-3 white--text" style="overflow-x: auto; border-radius: 5px;">
<pre>
created () {
window.addEventListener('scroll', this.onScroll);
},
destroyed () {
window.removeEventListener('scroll', this.onScroll);
},
methods: {
onScroll () {
this.scrolled = window.scrollY > 0;
},
scrollToTop () {
window.scrollTo({
top: 0,
left: 0,
behavior: 'smooth'
});
}
}
</pre>
</div>
</p>
<p>
App.vue должен выглядеть следующим образом:
<div class="grey darken-3 white--text" style="overflow-x: auto; border-radius: 5px;">
<pre>
&lt;template>
&lt;v-app :dark="dark">
&lt;v-toolbar app>
&lt;v-toolbar-title class="headline text-uppercase">
&lt;span>Vue.js:&lt;/span>
&lt;span class="font-weight-light">Самоучитель&lt;/span>
&lt;/v-toolbar-title>
&lt;v-spacer>&lt;/v-spacer>
&lt;v-btn
flat
href="https://home.cainet.info:3000/cai/VueJS/"
target="_blank"
>
&lt;span class="mr-2">Актуальная версия&lt;/span>
&lt;/v-btn>
&lt;v-menu bottom left>
&lt;template v-slot:activator="{ on }">
&lt;v-btn
flat
icon
v-on="on"
>
&lt;v-icon>more_vert&lt;/v-icon>
&lt;/v-btn>
&lt;/template>
&lt;v-list>
&lt;v-list-tile>
&lt;v-list-tile-action>
&lt;v-switch v-model="dark" color="blue">&lt;/v-switch>
&lt;/v-list-tile-action>
&lt;v-list-tile-title>Тёмная схема&lt;/v-list-tile-title>
&lt;/v-list-tile>
&lt;/v-list>
&lt;/v-menu>
&lt;/v-toolbar>
&lt;v-content>
&lt;v-container fluid fill-height grid-list-md>
&lt;v-layout row wrap full-height>
&lt;v-flex sm4>
&lt;TOC ref="TOC" />
&lt;/v-flex>
&lt;v-flex sm8 v-html="text">&lt;/v-flex>
&lt;/v-layout>
&lt;/v-container>
&lt;/v-content>
&lt;v-fab-transition>
&lt;v-btn
v-show="scrolled"
color="blue"
@click="scrollToTop"
dark
fixed
bottom
right
fab
>
&lt;v-icon>keyboard_arrow_up&lt;/v-icon>
&lt;/v-btn>
&lt;/v-fab-transition>
&lt;LoadingDialog ref="LoadingDialog" />
&lt;MessageDialog ref="MessageDialog" />
&lt;/v-app>
&lt;/template>
&lt;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,
scrolled: false,
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; }
},
created () {
window.addEventListener('scroll', this.onScroll);
},
destroyed () {
window.removeEventListener('scroll', this.onScroll);
},
methods: {
onScroll () {
this.scrolled = window.scrollY > 0;
},
scrollToTop () {
window.scrollTo({
top: 0,
left: 0,
behavior: 'smooth'
});
}
}
}
&lt;/script>
</pre>
</div>
</p>