Vue.js 带有默认子项的嵌套路由
Vue.js nested routing with default child
我在 Vue.js 2.
中的默认子路由有问题
当我最初访问 localhost/listings 时,它会正确加载 index.vue 和 map.vue 作为子项。
当我使用 router-link 导航到 localhost/listings/1,然后使用 router-link 返回到 localhost/listings 时,它仍然加载 show.vue 模板。 这不应该发生?
我没有导航守卫或任何应该干扰的东西。有没有办法纠正这个问题?
我的路线:
window.router = new VueRouter({
routes: [
...
{
path: '/listings',
name: 'listing.index',
component: require('./components/listing/index.vue'),
children: [
{
path: '',
component: require('./components/listing/map.vue')
},
{
path: ':id',
name: 'listing.show',
component: require('./components/listing/show.vue')
}
]
},
...
]
});
也许尝试重新安排子项,路由按照它们从上到下匹配的顺序触发,所以这应该有望解决它:
window.router = new VueRouter({
routes: [
...
{
path: '/listings',
name: 'listing.index',
component: require('./components/listing/index.vue'),
children: [
{
path: ':id',
name: 'listing.show',
component: require('./components/listing/show.vue')
}
{
path: '',
component: require('./components/listing/map.vue')
},
]
},
...
]
});
澄清一下,您的 path: ''
本质上是一个 "catch all",这可能就是为什么当它位于顶部时会立即被发现,因此路由器永远不会向下传播到 :id
路线。
如果您想要默认子路由,则不应命名 "father" 路由器,因此请改用 :to="{name: 'listing.index'}"
,使用默认子路由的名称(例如 :to="{name: 'listing.map'}"
)。
代码应如下所示:
window.router = new VueRouter({
routes: [
...
{
path: '/listings',
component: require('./components/listing/index.vue'),
children: [
{
path: '',
name: 'listing.map'
component: require('./components/listing/map.vue')
},
{
path: ':id',
name: 'listing.show',
component: require('./components/listing/show.vue')
}
]
},
...
]
});
当你使用 named routes
并且你想用你的 child 加载组件时,你必须使用 child 的名称路由。
在您的导航菜单链接中,如果您为 parent
使用名称路由,则 child 将不会自动加载,即使 child 路径什么也没有。
比方说,我们有一个 User 路由,我们希望默认显示组件内的用户列表,所以每当我们转到“/user”路径时,我们都想在其中加载一个用户列表作为 child :
routes: [
{
path: '/user',
name: 'User',
component: User,
children: [
{path: '', name: 'UserList', component: UserList}, // <== child path is = '';
]
}
]
如果您考虑代码,您可能会假设如果您转到名称为 'User' 的路由,您也可能会在其中获得 UserList,因为 parent 和 [=21= 的路径]ren 两者相同。但事实并非如此,您必须选择 'UserList' 作为名称。
为什么会这样?
因为 Vuejs 加载了您所指的确切组件,而不是 url。
你可以实际测试这个,而不是在你的链接中使用命名路由,你可以只引用 url,这次 vuejs 将加载 parent 和 child 没有问题,但是当您使用命名路由,它不会查看 url 并加载您所指的组件。
在 Vue 2.6.11 中,如果命中父路由,您可以自动重定向到子路由:
const routes = [
{
name: 'parent',
path: '/',
component: Parent,
children: [
{
name: 'parent.child',
path: 'child',
component: Child,
}
],
/**
* @type {{name: string} | string} Target component to redirect to
*/
redirect: {
name: 'parent.child'
}
}
];
我在 Vue.js 2.
中的默认子路由有问题当我最初访问 localhost/listings 时,它会正确加载 index.vue 和 map.vue 作为子项。
当我使用 router-link 导航到 localhost/listings/1,然后使用 router-link 返回到 localhost/listings 时,它仍然加载 show.vue 模板。 这不应该发生?
我没有导航守卫或任何应该干扰的东西。有没有办法纠正这个问题?
我的路线:
window.router = new VueRouter({
routes: [
...
{
path: '/listings',
name: 'listing.index',
component: require('./components/listing/index.vue'),
children: [
{
path: '',
component: require('./components/listing/map.vue')
},
{
path: ':id',
name: 'listing.show',
component: require('./components/listing/show.vue')
}
]
},
...
]
});
也许尝试重新安排子项,路由按照它们从上到下匹配的顺序触发,所以这应该有望解决它:
window.router = new VueRouter({
routes: [
...
{
path: '/listings',
name: 'listing.index',
component: require('./components/listing/index.vue'),
children: [
{
path: ':id',
name: 'listing.show',
component: require('./components/listing/show.vue')
}
{
path: '',
component: require('./components/listing/map.vue')
},
]
},
...
]
});
澄清一下,您的 path: ''
本质上是一个 "catch all",这可能就是为什么当它位于顶部时会立即被发现,因此路由器永远不会向下传播到 :id
路线。
如果您想要默认子路由,则不应命名 "father" 路由器,因此请改用 :to="{name: 'listing.index'}"
,使用默认子路由的名称(例如 :to="{name: 'listing.map'}"
)。
代码应如下所示:
window.router = new VueRouter({
routes: [
...
{
path: '/listings',
component: require('./components/listing/index.vue'),
children: [
{
path: '',
name: 'listing.map'
component: require('./components/listing/map.vue')
},
{
path: ':id',
name: 'listing.show',
component: require('./components/listing/show.vue')
}
]
},
...
]
});
当你使用 named routes
并且你想用你的 child 加载组件时,你必须使用 child 的名称路由。
在您的导航菜单链接中,如果您为 parent
使用名称路由,则 child 将不会自动加载,即使 child 路径什么也没有。
比方说,我们有一个 User 路由,我们希望默认显示组件内的用户列表,所以每当我们转到“/user”路径时,我们都想在其中加载一个用户列表作为 child :
routes: [
{
path: '/user',
name: 'User',
component: User,
children: [
{path: '', name: 'UserList', component: UserList}, // <== child path is = '';
]
}
]
如果您考虑代码,您可能会假设如果您转到名称为 'User' 的路由,您也可能会在其中获得 UserList,因为 parent 和 [=21= 的路径]ren 两者相同。但事实并非如此,您必须选择 'UserList' 作为名称。 为什么会这样? 因为 Vuejs 加载了您所指的确切组件,而不是 url。 你可以实际测试这个,而不是在你的链接中使用命名路由,你可以只引用 url,这次 vuejs 将加载 parent 和 child 没有问题,但是当您使用命名路由,它不会查看 url 并加载您所指的组件。
在 Vue 2.6.11 中,如果命中父路由,您可以自动重定向到子路由:
const routes = [
{
name: 'parent',
path: '/',
component: Parent,
children: [
{
name: 'parent.child',
path: 'child',
component: Child,
}
],
/**
* @type {{name: string} | string} Target component to redirect to
*/
redirect: {
name: 'parent.child'
}
}
];