Vue.js 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() {

我的第一个Vue项目,我想在每个路由器调用上运行加载效果。 我制作了一个
加载
组件:

<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
)。我将组件替换为主组件,现在它可以无限工作。我怎样才能在后台看到所有的东西都被加载?你说的所有东西都被加载是什么意思?这件事什么时候发生?