Vue 动态路由
#
动态路由匹配const router = new VueRouter({ routes: [ { path: "/user/:id", component: User } // 动态路径参数 以冒号开头 例 /:id ]});
注意
路由的公共地址是 /user/
基于它下面的所有子路由,都会被 /:id
匹配到,比如 /user/app
、 /user/blog
等。
这是一种匹配策略,一个路由匹配多个地址,呈现同一个页面,页面根据地址关键参数不同,展示不同的数据内容。
这里介绍的是简单的动态路由,动态地址部分/:id
这个值怎么获取到呢
// 在路由组件里使用this.$route.params.id// 这里需要注意的是id名称不是死的,是根据配置路由时命名的变量名,动态路由可以匹配很多个,如:path: '/user/:id/:age/:job'// 那获取得时候就得这样写this.$route.params.id、this.$route.params.age、this.$route.params.job// 上面获取得就是咱们配置里写的字段名称,不是固定死的,如果是直接在html中,不加this
路由配置
router/index.js
{ // 动态路由配置 path: '/dongtai', compoonent: () => import('../views/Dong')}, { path: '/dongtai/:page_id', compoonent: () => import('../components/dongtai.vue')}// *是通配符,表示匹配所有,/表示根目录,* 通配符优先匹配所有路由规则,如果在规则里没有匹配到符合的规则,会匹配到通配符// *通配符通常做容错,用户访问不存在的页面时,跳到404页面
#
嵌套路由嵌套路由和动态理由的区别
- 动态路由是不用写死子路由的,实际上动态路由也是匹配子路由的一种,
- 动态路由是一个路由模板组件匹配多个不同的路由地址,而嵌套路由是父地址不变,子路由对应各自的模板组件。
- 嵌套路由是需要写死子路由地址的,在
children
里; 一般用在类似面包屑导航的路由结构里,还有一些应用的路由数据是后端给的,嵌套的时候多,就需要我们对嵌套有一个深层的了解。 - 嵌套路由不会丢失父页面的内容,动态路由只显示匹配到的子路由内容
路由配置
router/index.js
routes: [ { path: "/dongtai", component: DongTai children: [ { path: "news", component: DongTaiNew }, { path: "about", component: DongTaiObout } ] }]
// index.vue<router-link to="/dongtai/news">新闻</router-link><router-link to="/dongtai/about">关于</router-link><router-view />
// 如果?我想页面一打开就显示其中一个子路由,比如新闻路由{ path: "/dongtai", // component: DongTai component: DongTai, children: [ { path: "",// 这里表示的就是当前父级路由 component: DongTaiNew }, { path: "news", component: DongTaiNew }, { path: "about", component: DongTaiObout } ]}
#
嵌套路由配合动态路由// 这里需要注意 children 里的地址一定要写全。const router = new VueRouter({ routes: [ { path: "/dongtai/:id", component: DongTai, children: [ { path: "/dongtai/news", component: DongTaiNew }, { path: "/dongtai/about", component: DongTaiObout } ] } ]});// 你会发现页面跳转到/dongtai里的时候空白页了,因为这还是动态路由,它需要/dongtai/xx 的形式,所以匹配不上,需要在它的上面写一个普通匹配const router = new VueRouter({ routes: [ { path: "/dongtai", component: DongTai }, { path: "/user/:id", component: User, children: [ { path: "/dongtai/news", component: DongTaiNew }, { path: "/dongtai/about", component: DongTaiObout } ] } ]});// 小坑<router-link to="/dongtai/news">新闻</router-link><router-link to="/dongtai/about">关于</router-link><router-view />// 这里就是渲染出子路由的位置
#
监听路由变化由于动态路由复用的是同一个组件,为了优化性能,所以不会重新加载组件,那么我们需要使用监听或监听路由函数【路由守卫】来获取路由更新的参数
watch: { '$route' (to, from) { // 对路由变化作出响应... } } // or 使用计算属性也可以computed: { id: function(){ return this.$route.params.id }}// 使用v2.2 中引入的 beforeRouteUpdate 导航守卫beforeRouteUpdate (to, from, next) { // react to route changes... // don't forget to call next()}