Я пытаюсь создать простой SPA с использованием Vue Router и инфраструктуры Vuetify. У меня есть несколько компонентов, подключенных к моему маршрутизатору. Когда я впервые перезагружаю вид, все работает нормально, но когда я перехожу из этого вида и возвращаюсь, я полностью теряю его содержимое.
Вот HTML-код:
<template>
<v-layout fill-height id="map" class="cadetblue" style="width: 100%">
<v-dialog v-model="dialog" width="500">
<v-card>
<v-img src="https://cdn.vuetifyjs.com/images/cards/sunshine.jpg" height="200px"></v-img>
<v-card-title primary-title>
<div>
<div class="headline">Select layers</div>
<span class="grey--text">Some layers are avaliable</span>
</div>
</v-card-title>
<v-card-actions>
<v-spacer></v-spacer>
<v-btn icon @click="layers = !layers">
<v-icon>{{ layers ? 'keyboard_arrow_down' : 'keyboard_arrow_up' }}</v-icon>
</v-btn>
</v-card-actions>
<v-slide-y-transition>
<v-card-text v-show="true">
<v-checkbox @change="clickMew()" id="dofLayer" label="DOF"></v-checkbox>
<v-checkbox name="tkLayer" id="tkLayer" label="TK25"></v-checkbox>
</v-card-text>
</v-slide-y-transition>
</v-card>
</v-dialog>
<v-flex>
<v-btn
absolute
id="zoomIn"
@click="zoomIn()"
dark
fab
top
left
small
color="pink"
class="mt-5"
>
<v-icon>add</v-icon>
</v-btn>
<v-btn
absolute
id="zoomOut"
@click="zoomOut()"
dark
fab
top
left
small
color="pink"
class="mt-6"
>
<v-icon>remove</v-icon>
</v-btn>
<v-btn absolute id="home" @click="home()" dark fab top left small color="green" class="mt-7">
<v-icon>home</v-icon>
</v-btn>
<v-speed-dial
class="mb-5"
fixed
bottom
right
direction="top"
transition="slide-y-reverse-transition"
>
<v-btn slot="activator" id="test" color="blue darken-2" dark fab>
<v-icon>account_circle</v-icon>
</v-btn>
<v-btn fab id="addLayer" dark small color="green">
<v-icon>edit</v-icon>
</v-btn>
<v-btn fab @click="dialog = true" dark small color="green">
<v-icon>layers</v-icon>
</v-btn>
</v-speed-dial>
</v-flex>
</v-layout>
</template>
А вот и часть скрипта:
import {
map,
initMap,
interactivity,
zoomIn,
zoomOut,
home,
addHok,
consoleMsg
} from "../../scripts/cro";
export default {
data: () => {
return {
links: [
{ icon: "account_circle", color: "blue darken-2" },
{ icon: "edit", color: "green" },
{ icon: "add", color: "indigo" }
],
neven: "TEsting Neven",
dialog: false,
layers: false
};
},
methods: {
zoomIn() {
zoomIn();
},
zoomOut() {
zoomOut();
},
home() {
home();
},
clickMew() {
addHok();
}
},
created() {
this.$nextTick(() => {
initMap();
});
},
mounted() {
this.$nextTick(() => {
initMap();
consoleMsg();
// interactivity();
});
}
};
Вот страница маршрутизатора (router.js):
import Vue from 'vue'
import Router from 'vue-router'
import Dashboard from './views/Dashboard.vue'
import Projects from './views/Projects.vue'
import Team from './views/Team.vue'
Vue.use(Router)
export default new Router({
mode: 'history',
base: process.env.BASE_URL,
routes: [
{
path: '/',
name: 'dashboard',
component: Dashboard
},
{
path: '/projects',
name: 'projects',
component: Projects
},
{
path: '/team',
name: 'team',
component: Team
}
]
})
UPDATE
Как отметил Любадр, есть обходной путь с keep-alive
. Я попытался обернуть router-view
так:
<template>
<v-app>
<Navbar></Navbar>
<Modal></Modal>
<v-content>
<keep-alive include="projects">
<router-view></router-view>
</keep-alive>
</v-content>
<Footer></Footer>
</v-app>
</template>
Вот App.vue
не помогло: (
<template>
<v-app>
<Navbar></Navbar>
<Modal></Modal>
<v-content>
<keep-alive include="projects">
<router-view></router-view>
</keep-alive>
</v-content>
<Footer></Footer>
</v-app>
</template>
<script>
import Navbar from "@/components/NavBar";
import Footer from "@/components/Footer";
import Modal from "@/components/Modal";
export default {
name: "App",
components: { Navbar, Footer, Modal }
};
</script>