【发布时间】:2020-02-18 18:32:20
【问题描述】:
Vue 路由器在主 Vue 实例之前加载,但要加载该路由器,我应该准备好一些信息,然后将它们作为属性传递给该 Route。在这个例子中,它是从主 Vue 实例传递到主屏幕的 currentTime。
也许将所有内容保存在 $Store 上可以解决问题,但目前项目还没有实现 Vuex。我现在做不到。
有什么建议吗?
main.js
import Vue from 'vue'
import App from './App.vue'
import router from './router'
import './registerServiceWorker'
Vue.config.productionTip = false
new Vue({
data() {
return {
currentTime: 0
}
},
router,
created(){
console.log("Vue created")
},
mounted(){
console.log("Vue mounted")
this.currentTime = Date.now()
},
render: h => h(App)
}).$mount('#app')
/router/index.js
import Vue from 'vue'
import VueRouter from 'vue-router'
import Home from '../views/Home.vue'
Vue.use(VueRouter)
const routes = [
{
path: '/',
name: 'home',
component: Home,
props: {time: "I_WANT_MY_TIME_HERE"},
beforeEnter (to, from, next){
console.log("beforeRouteEnter on Home")
next()
}
},
{
path: '/about',
name: 'about',
component: () => import('../views/About.vue')
}
]
const router = new VueRouter({
routes
})
export default router
/components/Home.vue
<template>
<div class="home">
<img alt="Vue logo" src="../assets/logo.png">
<h1>{{displayTime}}</h1>
<HelloWorld msg="Welcome to Your Vue.js App"/>
</div>
</template>
<script>
// @ is an alias to /src
import HelloWorld from '@/components/HelloWorld.vue'
export default {
name: 'home',
props: ['time'],
data() {
return {
displayTime: 0
}
},
mounted(){
console.log("mounted Home")
this.displayTime = this.time
},
components: {
HelloWorld
}
}
</script>
【问题讨论】:
-
为什么不直接在组件中获取时间?
-
正如我所说,这是一个例子 =D
-
您可以使用
this.$root从任何组件访问根实例。不是真正的最佳实践,但作为一个例子应该足够了。 -
您可以尝试在 Home 组件中使用 beforeRouteEnter 保护。
-
@josef98,它奏效了。正如你所说,这看起来不是最佳做法。我会继续努力寻找更好的方法,但至少我现在有一个替代方案。
标签: vue.js vue-component vue-router