Vue.js路由器未显示正确的子路由

时间:2019-11-22 10:45:40

标签: javascript vue.js routing vue-router

我在Vue.js路由器上遇到问题。顾名思义,此问题与仅显示父路径页面的子路径有关。例如,您的帐户详细信息www.example.com/account有一条路径。然后,在您的帐户中,您可以看到不同的项目,这些项目将与路线www.example.com/account/project/foobar一起使用,其中project/foobar/account的子路线,而foobar是动态参数。现在,当您转到一个项目时,希望看到该项目,但仍然看到帐户页面。

这是我遇到的问题。我觉得一切都已正确设置,但无论如何代码仍显示在下面。

router.js

const routes = [
    ..., // other routes
    {
        path: '/account',
        component: AccountPage,
        meta: {
            title: 'Your account'
        },
        children: [
            {
                path: 'project/:id',
                component: ProjectPage,
                props: true,
                meta: {
                    title: 'Project'
                }
            }
        ]
    }
];

const router = new VueRouter({
    routes,
    mode: 'history'
});

// Sets meta tags in the HEAD tag to, for example, change the title.
router.beforeEach((to, from, next) => {
    const nearestWithTitle = to.matched.slice().reverse().find(r => r.meta && r.meta.title);

    const nearestWithMeta = to.matched.slice().reverse().find(r => r.meta && r.meta.metaTags);
    const previousNearestWithMeta = from.matched.slice().reverse().find(r => r.meta && r.meta.metaTags);

    if(nearestWithTitle) document.title = nearestWithTitle.meta.title;

    Array.from(document.querySelectorAll('[data-vue-router-controlled]')).map(el => el.parentNode.removeChild(el));

    if(!nearestWithMeta) return next();

    nearestWithMeta.meta.metaTags.map(tagDef => {
        const tag = document.createElement('meta');

        Object.keys(tagDef).forEach(key => {
            tag.setAttribute(key, tagDef[key]);
        });

        tag.setAttribute('data-vue-router-controlled', '');

        return tag;
    })
    .forEach(tag => document.head.appendChild(tag));

    next();
});

我四次检查是否使用了正确的组件,并且100%确信可以。不过,它只会继续显示帐户页面而不是项目页面。我确实注意到标题是由于更改元标记的代码而更改的,所以这意味着它知道下一页是项目页。我还检查了功能参数to所包含的内容,并迅速弄清楚这是它要去的项目路线,这完全有道理。

ProjectPage.vue

<template>
    <transition name="project-anim">
        <div>
            Foo BAR
        </div>
<    /transition>
</template>

<script>
    import MeineProject from '../../components/meine/project';

    export default {
        components: {
            MeineProject
        }
    }
</script>

直接转到URL(不通过链接或任何内容进行路线导航),也仅显示帐户页面,因此,我很确定这不是由于某种原因而无效的过渡。控制台中没有错误或警告。

我完全没有选择。我希望你能帮助我。谢谢你的时间! :)

2 个答案:

答案 0 :(得分:2)

帐户页面需要<router-view>才能呈现子路由。如果您不希望将项目页面呈现在帐户页面内,则不应将其作为帐户页面的子路径。

您可能想要这样的路由配置:

{
    path: '/account',
    component: AccountPage,
    meta: {
        title: 'Your account'
    },
},
{
    path: 'project/:id',
    component: ProjectPage,
    props: true,
    meta: {
        title: 'Project'
    }
}

您可以将项目路线设置为/account/project/:id,但即使以/account为前缀,也不会是帐户路线的子路线。

答案 1 :(得分:0)

由于在父组件中必须使用router-view,因此您可以通过这种方式保留子级,每个子级将在完全不同的页面上呈现:

{
    path: '/account',
    component: {
        // render router-view into parent
        render(c) { 
            return c('router-view'); 
        }
    },
    children: [
        {
            path: '',
            component: AccountPage,
            meta: {
            title: 'Your account'
        },
        {
            path: 'project/:id',
            component: ProjectPage,
            props: true,
            meta: {
            title: 'Project'
        },
    ]
}