带参数的动态路由匹配
很多时候,我们需要将给定匹配模式的路由映射到同一个组件。例如,我们可能会有一个 classify 组件,它应该对所有的商品进行渲染,但是商品的分类不同。在Vue Router中,我们可以在路径中使用一个动态段来实现,我们称之为 路径参数:
什么是动态路由? url是变化的,但是组件是同一个组件,根据参数不同显示内容不同 动态传参数
- 我们从一个组件中将数据携带在url上传递到另一个组件中去
动态接参数:
- 我们从url中获取参数,然后拿到参数之后使用,如作为请求的参数
动态传参数:
- 通过router-link的to属性传递参数给路径
src/pages/classify/index.vue
<template><div>分类别组件<hr /><ul><li><!-- 这里的params和query就是可以传递到另外一个路由中到数据 --><!-- 路由后面需要写:id} --><router-link :to="{name: 'list',params: {id: 1,},query: {a: 1,b: 1,title:'衣服'},}">衣服</router-link></li><li><router-link :to="{name: 'list',params: {id: 2,},query: {a: 2,b: 2,title:'美食'},}">美食</router-link></li><li><router-link :to="{name: 'list',params: {id: 3,},query: {a: 3,b: 3,title:'电器'},}">电器</router-link></li></ul></div></template>
const routes = [{path: "/list/:id", // 这里需要加个idcomponent: () => import(/*webpackChunkName:'list'*/ "../pages/list/index.vue"),name: "list",},]
不写id时 http://localhost:8080/list?a=1&b=1&title=衣服 写了id后 http://localhost:8080/list/1?a=1&b=1&title=衣服
展示:
- 动态接参数
通过useRoute这个Hook来接受url上的参数,然后使用
src/pages/list/index.vue
<template><div>list列表组件<div>{{id}}{{a}}{{b}}{{title}}</div></div></template><script lang="ts">import { defineComponent, onMounted, reactive,toRefs } from 'vue'import {useRoute} from 'vue-router'export default defineComponent({setup() {const state=reactive({id:'',a:'',b:'',title:''})const route=useRoute()// 数据在这里面console.log(route.query)console.log(route)onMounted(()=>{state.id=route.params.id;state.a=route.query.a;state.b=route.query.b;state.title=route.query.title;})return {...toRefs(state)}},})</script>
路由元信息
应用:实现 头部内容变化、面包屑导航、权限操作
有时,你可能希望将任意信息附加到路由上,如过渡名称、谁可以访问路由等。这些事情可以通过接受属性对象等 meta 属性来实现,并且它可以在路由地址和导航守卫上被访问到。定义路由的时候你可以这样配置 meta 字段:
// src/router/index.tsconst routers = [{path: "/about",component: () =>import(/*webpackChunkName:'about'*/ "../pages/about/index.vue"),name: "about",meta: {title: "携带点内容在这个路由中",},}]//src/pages/about/index.vue<template><div>关于我们{{title}}</div></template><script lang="ts">import { defineComponent } from 'vue'import{useRoute} from 'vue-router'export default defineComponent({setup() {const route =useRoute()console.log(route.meta.title)return{title:route.meta.title}},})</script>
动态路由
添加路由到你的路由上通常是通过 routes 配置来完成,但是在某些情况下,你可能想在应用程序已经运行的时候添加或者删除路由。
- 添加路由
动态路由主要通过两个函数实现。 router.addRoute() 和 router.removeRoute() 。它们只注册一个新的路由,也就是说,如果新增加的路由与当前位置相匹配,就需要你用 router.push() 或 router.replace() 来手动导航,才能显示该新路由。hasRouter :确认是否存在指定名称的路由
<template><div>智能应用<button @click="addRoutes">添加</button><button @click="remove">删除</button><router-link to="/lakers">lakers</router-link><button @click="hasRouter">是否有路由</button></div></template><script lang="ts">import { defineComponent } from "vue";import{useRouter} from 'vue-router'export default defineComponent({setup() {const router =useRouter()// 追加const addRoutes=()=>{router.addRoute({path:'/lakers',component:()=>import(/*webpackChunName:'about'*/'../lakers/index.vue'),name:'lakers'})}// 删除const remove=()=>{router.removeRoute('lakers') // 填name}// 判断const hasRouter=()=>[console.log(router.hasRoute('lakers'))]return {addRoutes,remove,hasRouter}},});</script>
