带参数的动态路由匹配

很多时候,我们需要将给定匹配模式的路由映射到同一个组件。例如,我们可能会有一个 classify 组件,它应该对所有的商品进行渲染,但是商品的分类不同。在Vue Router中,我们可以在路径中使用一个动态段来实现,我们称之为 路径参数:

什么是动态路由? url是变化的,但是组件是同一个组件,根据参数不同显示内容不同 动态传参数

  • 我们从一个组件中将数据携带在url上传递到另一个组件中去

动态接参数:

  • 我们从url中获取参数,然后拿到参数之后使用,如作为请求的参数

动态传参数:
  • 通过router-link的to属性传递参数给路径

src/pages/classify/index.vue

  1. <template>
  2. <div>
  3. 分类别组件
  4. <hr />
  5. <ul>
  6. <li>
  7. <!-- 这里的paramsquery就是可以传递到另外一个路由中到数据 -->
  8. <!-- 路由后面需要写:id} -->
  9. <router-link :to="{name: 'list',params: {id: 1,},query: {a: 1,b: 1,title:'衣服'},}">衣服</router-link>
  10. </li>
  11. <li>
  12. <router-link :to="{name: 'list',params: {id: 2,},query: {a: 2,b: 2,title:'美食'},}">美食</router-link>
  13. </li>
  14. <li>
  15. <router-link :to="{name: 'list',params: {id: 3,},query: {a: 3,b: 3,title:'电器'},}">电器</router-link>
  16. </li>
  17. </ul>
  18. </div>
  19. </template>
  1. const routes = [{
  2. path: "/list/:id", // 这里需要加个id
  3. component: () => import(/*webpackChunkName:'list'*/ "../pages/list/index.vue"),
  4. name: "list",
  5. },]

不写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

  1. <template>
  2. <div>
  3. list列表组件
  4. <div>
  5. {{id}}
  6. {{a}}
  7. {{b}}
  8. {{title}}
  9. </div>
  10. </div>
  11. </template>
  12. <script lang="ts">
  13. import { defineComponent, onMounted, reactive,toRefs } from 'vue'
  14. import {useRoute} from 'vue-router'
  15. export default defineComponent({
  16. setup() {
  17. const state=reactive({
  18. id:'',
  19. a:'',
  20. b:'',
  21. title:''
  22. })
  23. const route=useRoute()
  24. // 数据在这里面
  25. console.log(route.query)
  26. console.log(route)
  27. onMounted(()=>{
  28. state.id=route.params.id;
  29. state.a=route.query.a;
  30. state.b=route.query.b;
  31. state.title=route.query.title;
  32. })
  33. return {
  34. ...toRefs(state)
  35. }
  36. },
  37. })
  38. </script>

路由元信息

应用:实现 头部内容变化、面包屑导航、权限操作

有时,你可能希望将任意信息附加到路由上,如过渡名称、谁可以访问路由等。这些事情可以通过接受属性对象等 meta 属性来实现,并且它可以在路由地址和导航守卫上被访问到。定义路由的时候你可以这样配置 meta 字段:

  1. // src/router/index.ts
  2. const routers = [{
  3. path: "/about",
  4. component: () =>
  5. import(/*webpackChunkName:'about'*/ "../pages/about/index.vue"),
  6. name: "about",
  7. meta: {
  8. title: "携带点内容在这个路由中",
  9. },
  10. }]
  11. //src/pages/about/index.vue
  12. <template>
  13. <div>
  14. 关于我们
  15. {{title}}
  16. </div>
  17. </template>
  18. <script lang="ts">
  19. import { defineComponent } from 'vue'
  20. import{useRoute} from 'vue-router'
  21. export default defineComponent({
  22. setup() {
  23. const route =useRoute()
  24. console.log(route.meta.title)
  25. return{
  26. title:route.meta.title
  27. }
  28. },
  29. })
  30. </script>

动态路由

添加路由到你的路由上通常是通过 routes 配置来完成,但是在某些情况下,你可能想在应用程序已经运行的时候添加或者删除路由。

  • 添加路由

动态路由主要通过两个函数实现。 router.addRoute()router.removeRoute() 。它们只注册一个新的路由,也就是说,如果新增加的路由与当前位置相匹配,就需要你用 router.push()router.replace() 来手动导航,才能显示该新路由。
hasRouter :确认是否存在指定名称的路由

  1. <template>
  2. <div>
  3. 智能应用
  4. <button @click="addRoutes">添加</button>
  5. <button @click="remove">删除</button>
  6. <router-link to="/lakers">lakers</router-link>
  7. <button @click="hasRouter">是否有路由</button>
  8. </div>
  9. </template>
  10. <script lang="ts">
  11. import { defineComponent } from "vue";
  12. import{useRouter} from 'vue-router'
  13. export default defineComponent({
  14. setup() {
  15. const router =useRouter()
  16. // 追加
  17. const addRoutes=()=>{
  18. router.addRoute({
  19. path:'/lakers',
  20. component:()=>import(/*webpackChunName:'about'*/'../lakers/index.vue'),
  21. name:'lakers'
  22. })
  23. }
  24. // 删除
  25. const remove=()=>{
  26. router.removeRoute('lakers') // 填name
  27. }
  28. // 判断
  29. const hasRouter=()=>[
  30. console.log(router.hasRoute('lakers'))
  31. ]
  32. return {
  33. addRoutes,remove,hasRouter
  34. }
  35. },
  36. });
  37. </script>