开发者问题收集

TypeError:无法读取未定义的属性(读取'$router')vuejs

2021-10-21
52038

因此,如果 api 调用返回状态 422,我会尝试将用户重定向到不同的路由。但是我收到错误

TypeError: Cannot read properties of undefined (reading '$router')

我的 routes.js:

{
        path: '/dashboard',
        component: Dashboard,
        name: 'Dashboard',
        beforeEnter: (to, form, next) =>{
            axios.get('/api/authenticated')
                .then(()=>{
                    next();
                }).catch(()=>{
                    return next({ name: 'Login'})
            })
        },
        children: [
            {
                path: 'documentCollections',
                component: DocumentCollection,
                name: 'DocumentCollections'
            },
            {
                path: 'document',
                component: Document,
                name: 'Document'
            },
            {
                path: 'createDocument',
                component: CreateDocument,
                name: 'CreateDocument'
            },
            {
                path: 'suppliers',
                component: Suppliers,
                name: 'Suppliers'
            },
            {
                path: 'settings',
                component: Settings,
                name: 'Settings'
            },
        ]
}

我也有登录/注册组件,当我使用

this.$router.push({ name: "DocumentCollections"});

它会重定向用户而没有任何错误。问题是当我在仪表板组件的子组件中时。

在 documentCollections 组件中我有一个方法:

    loadCollections(){
        axios.get('/api/documentCollections')
            .then((response) => {
                this.Collections = response.data.data
                this.disableButtons(response.data.data);
            })
            .catch(function (error){
                if(error.response.status === 422){
                    //here is where the error happens
                    this.$router.push({ name: "Settings"});
                }
            });
    },

这会加载集合,但如果用户有一些数据集为空,api 返回状态 422。我希望他被重定向到设置组件。 (documentCollection 和 Settings 都是 Dashboard 的子组件)

为什么 this.$router.push 在这里不起作用,但在登录/注册组件中却起作用?

2个回答

在回调函数中调用 this 会创建一个新的绑定到 this 对象,而不是正则函数表达式中的 Vue 对象。

您可以使用箭头语法来定义函数,因此 this 不会被覆盖。

.catch((error) => {
    if(error.response.status === 422){
        this.$router.push({name: "Settings"});
    }
})

更多信息

另一种选择

在 axios 调用之前定义另一个 this 实例,并在收到响应后使用它。

let self = this
...
self.$router.push({name: "Settings"})

使用您的代码

loadCollections(){
    let self = this;
    axios.get('/api/documentCollections')
        .then((response) => {
            this.Collections = response.data.data
            this.disableButtons(response.data.data);
        })
        .catch(function (error){
            if(error.response.status === 422){
                self.$router.push({name: "Settings"});
            }
        });
},
Tamas Szoke
2021-10-21

如果使用 Composition API:

// Import
import router from "@/router";

//and use
router.push({name: "Settings"});
Jhon Ariel Luque Cusacani
2022-12-10