【问题标题】:Imported vue instance is undefined in created/mounted hooks after page reload页面重新加载后,在创建/挂载的钩子中未定义导入的 vue 实例
【发布时间】:2019-12-21 04:27:33
【问题描述】:

我正在尝试在 Vue 中构建一个功能,该功能将在用户重新加载页面后执行自动登录。我正在将 vue 实例导入发送 HTTP 请求的模块。我正在将该模块导入到应用程序的主要组件中,我试图从创建/安装的钩子中调用它。但是登录模块在导入的 vue 实例“TypeError: Cannot read property '$http' of undefined”方面抛出了一个错误,实际上 vue 似乎在这一点上是未定义的。我做错了什么?

登录功能在被调用时完美运行,例如从一个按钮。如果在将任何更改保存到代码后由开发服务器刷新页面,则安装/创建的自动登录也有效(!)。它只是在浏览器触发的重新加载后不起作用。

// main.js - entry point
export const vue = new Vue({ 
    el: '#app',
    router,
    store,
    render: h => h(App)
});

// App.vue - main app component
<script>
    import { login } from './controllers/loginController';
    export default {
        created: function () { //tried mounted as well
        login('dummy@dummy.com', 'dummy', 2);
        }
    };
</script>

// loginController.js
import { vue } from '../main';
export const login = function (email, password, reportID = null) {
    vue.$http
        .post('login/', { email: email, password: password, reportID: reportID })
        .then(...)
};

【问题讨论】:

    标签: vue.js


    【解决方案1】:

    怎么了?

    您在loginController.js 上导入Vue,因此现在引擎将转到特定路径并编译该文件,然后才移至下一条指令...因此在编译文件main.js 时,它将到达您的创建函数并在其中找到login函数调用...登录功能已定义,但其中的vue仍在编译中...所以它仍然是undefined

    我该如何解决这个问题?

    我建议在你的 vue 实例中使用login,因为它是正确的方法:

    //App.vue
    
    created() {
    function login(email, password, reportID = null) {
        this.$http
            .post('login/', { email: email, password: password, reportID: reportID })
            .then(() =>{...})
        login('dummy@dummy.com', 'dummy', 2);
    }
    

    【讨论】:

    • 谢谢!您的解决方案确实有效。我希望在其他地方提取代码,因为登录过程显然也会在其他地方使用。有一件事仍然困扰着我 - created(尤其是 mounted!)钩子不应该在所有内容都已编译时出现吗?
    • 附言。为了避免锅炉代码,我得出的结论是,我可以将this.$http 作为参数传递给登录函数并在内部使用它,同时避免导入 vue 实例。它似乎工作正常。您认为此类解决方案有任何禁忌症吗?
    • @Eggon 回答您的第一个问题“创建的(尤其是已安装的!)挂钩不应该在所有内容都已编译后吗?” : asnwer : 不......这些是App.vue 的组件挂钩,一旦组件被创建/安装,它们就会被触发,每个组件都有自己的挂钩,所以它们与它自己的组件相关,他们不知道你的实例已编译或尚未编译...
    • @Eggon "你看到这种解决方案有什么禁忌吗?" 不,这比旧设置好,因为它工作正常,没有错误,你应该没问题
    • 谢谢!我知道钩子与组件有关,但我们在这里谈论的是主/父组件。如果 vue 实例没有,主要组件如何准备好(或实际上?但尤其是主要)?
    猜你喜欢
    • 1970-01-01
    • 2019-03-15
    • 1970-01-01
    • 2020-07-19
    • 2019-10-25
    • 1970-01-01
    • 2021-03-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多