【问题标题】:Vue: Not rendering the component for the second time on routingVue:在路由上第二次不渲染组件
【发布时间】:2020-01-18 15:23:05
【问题描述】:

我正面临着我不理解的 Vue 行为。我正在使用组件之间的路由。

   methods: {
        redirectToLogin() {
            this.$router.push("/login");
        },
        redirectToRegister() {
            this.$router.push("/register");
        }
    }

所以在加载应用程序时,路由登录组件,登录成功,然后使用上述方法注销组件。在此之后,当我尝试再次路由登录时,登录组件未呈现,但路由显示在地址行中

你可以在下面看到我的路线

    routes: [
    {path: '/', name: 'Hello', component: Hello},
    {path: "/login",name:'Login', component: Login},
    {path: "/register",name:'Register', component: Register},
    {path: "/user/:id",name:'User', component: User},
    {path: "/reset",name:'PasswordReset', component: PasswordReset},
  ]

我也在使用 Vuex,它会以某种方式影响这种行为吗?

更新:

当我注销时,我在控制台中看到以下错误

TypeError:“t._data 未定义” VueJS 14 $销毁 破坏 _ 吨 X $ 姬 _更新 r 得到 跑步 Yn 他 ue vue.runtime.esm.js:1888:12

UPD 2:组件

这是加载到应用程序的第一个组件。在此处注销路由线索后,所有路由器链接都不起作用

    export default {
        name: 'Hello',
        data() {
            return {
                msg: 'Work With your projects in agile manner'
            }
        }
    }

登录组件

export default {
    name: "Login",
    data() {
        return {
            errorOccurred: false,
            errorMessage: '',
            credentials: {
                login: '',
                password: ''
            },
            remember: false
        }
    },
    methods: {
        submit() {
            this.$store.dispatch('loginUser', this.credentials).then(() => {
                this.errorMessage = this.getError;
                if (this.errorMessage.length) {
                    this.errorOccurred = true;

                } else {
                    this.$router.push({path: '/user/' + this.getId});
                }
            });

            this.errorOccurred = false;
        },
        resetPassword() {
            this.$router.push("/reset");
        },
    },
    computed: {
        loginValidation() {
            return this.credentials.login.length > 0
        },
        passwordValidation() {
            return this.credentials.password.length > 0
        },
        getError() {
            return this.$store.getters.getErrorMsg;
        },
        getId() {
            return this.$store.getters.getUserId;
        }
    },
}

从登录路由的用户组件。

    import NavbarCommon from "./NavbarCommon";
    export default {
        name: "User",
        components: {NavbarCommon},
        data(){
        },
        methods: {
            loadAvatar(){
               let image = '../../assets/emptyAvatar.png';
                if ('avatar' in  this.getUser){
                    image = this.getUser.avatar;
                }

                return image;
            }
        },
        computed:{
            getUser() {
                    return this.$store.getters.getUser;
            }
        }
    }

还有两个两个组件。 NavbarComponent - 多个组件的通用导航栏

    import NavbarRight from "./NavbarRight";
    export default {
        name: "NavbarCommon",
        components: {NavbarRight},
        methods:{
            routeToUser(){
                this.$router.push({path: '/user/' + this.getUser});
            },
            routeToProject(){
                this.$router.push({path: '/project/' + this.getProject});
            }
        },
        computed:{
            getUser() {
                return this.$store.getters.getUserId;
            },
            getProject(){
                //TODO:
                return 'get project id'
            }
        }
    }

导航栏右侧带有注销按钮

export default {
    name: "NavbarRight",
    methods:{
        logOut(){
            this.$store.dispatch('logOutUser').then(()=>{
                this.$router.push('/');
            });

        },

    }
}

【问题讨论】:

  • 您发布的代码是有效的,应该可以工作。我怀疑你的组件在 Vue 尝试运行它时会引发错误 - 因此它不会呈现。您的控制台中是否出现任何错误?
  • @MarcRo ,我只看到来自 chunk.js 的错误,这对我来说毫无意义
  • Chunk.js 很可能是您不会渲染的组件。你能发布错误吗?
  • @MarcRo 检查更新
  • 请同时发布组件。您应该在生命周期挂钩中有一些无效代码

标签: vue.js vuex vue-router


【解决方案1】:

所以这个问题真的很愚蠢。

在用户组件中数据丢失返回。

添加后

data(){
        return {}
    },

一切都开始了

【讨论】:

  • Vue 递归地将返回的对象转换为 getter/setter 以使其“反应”。如果您不需要data,请将其完全删除。空的data 的简写是data: () => ({})。要点是:它必须是一个返回对象的函数。 Docs.
  • 稍后会用到,User组件远未准备好
猜你喜欢
  • 2018-12-25
  • 1970-01-01
  • 2020-10-22
  • 1970-01-01
  • 2023-04-04
  • 2019-06-23
  • 2018-04-18
  • 1970-01-01
  • 2021-11-14
相关资源
最近更新 更多