Vue动态路由
向路由器添加路由通常是通过routes选项完成的,但是在某些情况下,我们可能希望在应用程序已经运行时添加或删除路由,也就是以编程的方式添加或删除路由。
1、添加路由
动态路由主要通过两个方法来实现:router.addRoute()
和router.removeRoute()
。router.addRoute()
方法只是注册一个新的路由,如果新注册的路由与当前位置匹配,则需要使用router.push()
函数或router.replate()
函数手动导航以显示新路由。
在下面的代码中,只定义了一个单一的路由:
const router=createRouter({
history:createWebHistory(),
routes:[{
path:'/:acticleName',
component:Article
}],
})
转到任何页面,如/about、/store,都将渲染Article组件。如果在/about上想显示一个新路由,那么仅仅编写下面的代码是不够的
router.addRoute({
path:'/about',
component:About
})
路由到/about页面,仍将显示Article组件。要显示About组件,我们需要手动调用router.replate()
函数改变当前位置并覆盖之前的位置。代码如下所示:
router.addRoute({
path:'/about',
component:About
})
//也可以使用this.$route或route=useRoute()(在setup函数中)
router.replace(router.currentRoute.value.fullPath)
如果需要等待新路由显示,则可以调用await.router.replace()
2、在导航守卫中添加路由
在导航守卫中添加或删除路由,不要调用router.replace()
函数,而是通过返回新的位置来触发重定向。代码如下所示:
router.beforeEach(to=>{
if(!hasNecessaryRoute(to)){
router.addRoute(generateRoute(to))
//出发重定向
return to.fullPath
}
})
上面的示例假设两件事:首先,新添加的路由记录将匹配到目标位置,这实际上导致了与我们尝试访问的位置不同;其次,hasNecessaryRoute()
函数在添加新路由后返回false
,以避免无线重定向。
因为我们进行了重定向,所以替换了正在进行的导航守卫,其行为与前面的示例类似。在实际场景中,添加更有可能发生在导航守卫之外。例如,当一个视图组件挂在时,它会注册新的路由。
3、删除路由
有几种不同的方式可以删除现有的路由。
3.1 通过添加名称冲突的路由。
如果添加了一个与现有路由同名的路由,那么会先删除该路由,然后再添加路由。代码如下所示:
router.addRoute({
path:'/about',
name:'about',
component:About
})
//这将删除先前添加的路由,因为它们具有相同的名称且名称是唯一的
router.addRoute({
path:'/other',
name:'about',
component:Other
})
3.2 通过调用router.addRoute()函数返回的回调。
const removeRoute=router.addRoute(routeRecord)
removeRoute() //如果路由存在,则删除它
这在路由没有名称时非常有用。
3.3 通过调用router.removeRoute()函数按名称删除一个路由。
router.addRoute({
path:'/about',
name:'about',
component:About
})
//删除路由
router.removeRoute('about')
注意:如果希望使用remoceRoute()函数,但又希望避免名称冲突,可以在路由中使用Symbol作为名称。
当一个路由被删除时,它的所有别名和子路由都会被删除。
4、添加嵌套路由
要想现有路由添加嵌套路由,可将路由的名称作为第一个参数传递给router.addRoute()函数,这将有效地添加路由,就像通过children添加一样。代码如下所示:
router.addRoute({
name:'admin',
path:'/admin',
component:Admin
})
router.addRoute('admin',{
path:'settings',
component:AdminSettings
})
这相当于:
router.addRoute({
name:'admin',
path:'/admin',
component:Admin,
children:[{
path:'settings',
component:adminSettings
}]
})
5、查看现有路由
Vue Router给出了两个查看现有路由的函数:
router.hasRoute:检查路由是否存在。
router.getRoutes():获取包含所有路有记录的数组。
- 点赞
- 收藏
- 关注作者
评论(0)