【发布时间】:2019-01-22 19:14:03
【问题描述】:
我正在尝试使用 Vue Router 和 Vuetify 框架创建一个简单的 SPA。我有几个组件连接到我的路由器。当我第一次重新加载视图时,一切正常,但当我从该视图移动并返回时,我完全失去了它的内容。
这是 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
}
]
})
更新
正如 ljubadr 指出的,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>
【问题讨论】:
-
您可以使用
<keep-alive include="foo">。您可以使用,在此处添加更多组件。检查this jfiddle。这种方法有一些disadvantages -
@ljubadr 我觉得我又近了一步。我添加了
<keep-alive include="projects">,但没有任何成功。也许生命周期钩子有问题? -
我认为您的组件中还需要
name: 'projects',才能使include工作 -
我已经添加,但到目前为止没有任何成功
-
我已经创建了基本的codepen example,如果您查看控制台,您会看到
component1created()方法仅在您在组件之间导航时触发一次。不知道为什么它在你的情况下不起作用......
标签: javascript vue.js reload vue-router