Vue.js Vue路由器:在路由器内使用组件方法
我的第一个Vue项目,我想在每个路由器调用上运行加载效果。 我制作了一个Vue.js Vue路由器:在路由器内使用组件方法,vue.js,vue-component,vue-router,Vue.js,Vue Component,Vue Router,我的第一个Vue项目,我想在每个路由器调用上运行加载效果。 我制作了一个加载组件: <template> <b-loading :is-full-page="isFullPage" :active.sync="isLoading" :can-cancel="true"></b-loading> </template> <script> export default { data() {
加载组件:
<template>
<b-loading :is-full-page="isFullPage" :active.sync="isLoading" :can-cancel="true"></b-loading>
</template>
<script>
export default {
data() {
return {
isLoading: false,
isFullPage: true
}
},
methods: {
openLoading() {
this.isLoading = true
setTimeout(() => {
this.isLoading = false
}, 10 * 1000)
}
}
}
</script>
但我有一个错误:
TypeError:“\u components\u包括\u Loading\u WEBPACK\u IMPORTED\u MODULE\u 9\u。default.openLoading不是一个函数”
我该怎么办?我认为您无法访问导航卫士中的组件方法(在每次导航之前)
),我建议使用vue插件进行数据管理,然后将isLoading
设置为全局变量,以便在每次路线导航之前都可以执行相同的操作。。。以下是您如何做到这一点:
当然,您需要首先使用npm i Vuex
安装Vuex
。。。之后:
在初始化Vue实例的主文件上:
从“Vue”导入Vue
从“vue”导入Vuex
Vue.use(Vuex)
const store=新的Vuex.store({
声明:{
孤岛加载:false,
},
突变:{
开放加载(状态){
state.isLoading=true
设置超时(()=>{
state.isLoading=false
}, 10000)
},
},
})
//如果您的路由器位于一个单独的文件上,只需导出存储并将其导入其中
常量路由器=新的VueRouter({
路线:[
{
// ...
},
],
})
路由器.beforeach((到、从、下一个)=>{
如果(收件人姓名){
store.commit('openload')
}
下一个()
})
新Vue({
/// ....
路由器,
商店,
})
在您的组件中:
我不认为您可以访问导航卫士中的组件方法(每次导航之前)
),我建议您使用vue插件进行数据管理,然后将isLoading
作为全局变量,以便在每次路线导航之前,您都可以执行相同的操作。。。以下是您如何做到这一点:
当然,您需要首先使用npm i Vuex
安装Vuex
。。。之后:
在初始化Vue实例的主文件上:
从“Vue”导入Vue
从“vue”导入Vuex
Vue.use(Vuex)
const store=新的Vuex.store({
声明:{
孤岛加载:false,
},
突变:{
开放加载(状态){
state.isLoading=true
设置超时(()=>{
state.isLoading=false
}, 10000)
},
},
})
//如果您的路由器位于一个单独的文件上,只需导出存储并将其导入其中
常量路由器=新的VueRouter({
路线:[
{
// ...
},
],
})
路由器.beforeach((到、从、下一个)=>{
如果(收件人姓名){
store.commit('openload')
}
下一个()
})
新Vue({
/// ....
路由器,
商店,
})
在您的组件中:
Vuex是一个很好的观点。但为了简单起见,您可以在组件中查看$route
,并在$route
更改时显示加载程序,如下所示:
router.beforeEach((to, from, next) => {
if (to.name) {
Loading.openLoading()
}
next()
}
。。。
观察:{
“$route”(){
这是openLoading()
},
},
...
我认为这是一个快速而简短的解决方案。Vuex是一个很好的观点。但为了简单起见,您可以在组件中查看$route
,并在$route
更改时显示加载程序,如下所示:
router.beforeEach((to, from, next) => {
if (to.name) {
Loading.openLoading()
}
next()
}
。。。
观察:{
“$route”(){
这是openLoading()
},
},
...
我认为这是一个快速而简短的解决方案。使用Vuex是一个很好的方法。但是您的答案在这一行中有一个错误:active.sync=“$store.state.isLoading”
。您将收到Vuex警告,因为您无法直接修改存储,建议您使用getter
和setter
重写它。您好,谢谢,但我没有修改那里的值,它只是被修改过(不是“v-model”),是的,使用getter更好。。。。您的解决方案要好得多,我想您只需要包括他正在实现的条件,他正在组件中直接修改它,因为他添加了.sync
修饰符,这允许更改道具。使用Vuex是一个很好的点。但是您的答案在这一行中有一个错误:active.sync=“$store.state.isLoading”
。您将收到Vuex警告,因为您无法直接修改存储,建议您使用getter
和setter
重写它。您好,谢谢,但我没有修改那里的值,它只是被修改过(不是“v-model”),是的,使用getter更好。。。。您的解决方案更好,我想您只需要包含他正在实现的条件,他正在组件中直接修改它,因为他添加了.sync
修饰符,允许更改道具。我在组件中放置了watch,但此watch方法调用没有任何结果?你能把console.log()
放进去吗?你的组件应该总是在DOM中呈现(不要在它上面应用v-if
)。我将组件替换为主组件,现在它可以无限工作。我怎样才能在后台看到所有的东西都被加载?你说的所有东西都被加载是什么意思?这个事件什么时候发生?我在组件中放置了watch,但是这个watch方法调用时什么都没有发生?你能把console.log()
放进去吗?你的组件应该总是在DOM中呈现(不要在它上面应用v-if
)。我将组件替换为主组件,现在它可以无限工作。我怎样才能在后台看到所有的东西都被加载?你说的所有东西都被加载是什么意思?这件事什么时候发生?