Vue3实战笔记(22)—路由Vue-Router 实战指南(路由传参)


前言

vue-router 是 Vue.js 官方路由管理器。它和 Vue.js 核心深度集成,让用 Vue.js 构建单页应用变得易如反掌。
前面提到过简单的使用路由,直到上文使用404界面发现了个问题,和路由相关,觉得需要掌握的还很多,打算花点时间好好深入的学习一下,路由出山后我觉得问题就能迎刃而解了。


一、路由router-link

前文中我们已经配置好了一些路由,先列出来作为准备工作:

//路由器
import {createRouter,createWebHistory} from 'vue-router'

import Home from '@/views/Home.vue'
import HelloSH from '@/views/HelloSH.vue'
import About from '@/views/About.vue'
import Login from '@/views/Login.vue'
import CheckboxVue from '@/views/Checkbox.vue'
import vList from '@/components/vlist.vue'

import notFound from '@/views/errors/404.vue'


//创建路由器
const router = createRouter({
    history:createWebHistory(),
    routes:[
        {
            path:'/',
            component:Home
        },
        {
            path:'/hellosh',
            component:HelloSH
        },
        {
            path:'/about',
            component:About
        },
        {
            path:'/login',
            component:Login
        },
        {
            path:'/checkbox',
            component:CheckboxVue
        },
        {
            path:'/vlist',
            component:vList
        },
        {
            // 会匹配所有路径
            path: "/:pathMatch(.*)*",
            redirect: '/404'
        },
        {
            path:'/404',
            components:{mainLayout:notFound}
        }
        
    ]
})

使用一个自定义组件 router-link 来创建链接。这使得 Vue Router 可以在不重新加载页面的情况下更改 URL,处理 URL 的生成以及编码。
我在首页增加了两个router-link标签,注意有两种写法:

<template>
    <v-app>
        <v-main>
            <div style="font-size:100px; color:black; position:fixed;box-shadow: 0px 0px 0px #ccc; left:50%;top:33%; " >首页</div>
            <div style="font-size:80px; color:black; position:fixed;box-shadow: 0px 0px 0px #ccc; left:50%;top:50%; " ><RouterLink to="/vlist" >to list</RouterLink> </div>
            <div style="font-size:80px; color:black; position:fixed;box-shadow: 0px 0px 0px #ccc; left:50%;top:70%; " ><router-link to="/checkbox" >to checkbox</router-link> </div>


        </v-main>
    </v-app>
</template>

<script setup lang='ts' name="Home">

</script>

<style lang='less' scoped></style>

在这里插入图片描述
分别点击跳转到了相应的路由:
在这里插入图片描述
在这里插入图片描述
这个标签比较简单也比较常用就不多说了。

二、路由传参

路由跳转时候经常需要传递参数,再学习几种传参方式。

1.query方式

类似get请求的传参方式,用问号标志,&分隔:,在router-link中:


<div style="font-size:80px; color:black; position:fixed;box-shadow: 0px 0px 0px #ccc; left:50%;top:80%; " >
    <router-link to="/studyRoute?id=123456&name=shanhua" >
        to studyRoute
    </router-link> 
</div>

路由配置:

import studyRoute from '@/views/study/Route.vue'
 
 ...
 
  {
      path:'/studyRoute/:id', //params方式
      components:{default:studyRoute}
  }

StudyRoute.vue:


<template>
    <div>
            
            query-------<br>
            id:{{$route.query.id}}
            <br>
            name:{{$route.query.name}}
            
    </div>

</template>

<script setup lang="ts" name="">
</script>

<style lang='scss' scoped>
</style>

页面展示效果:
在这里插入图片描述
还有另一种写法:

 <div style="font-size:80px; color:black; position:fixed;box-shadow: 0px 0px 0px #ccc; left:50%;top:80%; " >
      <router-link :to=
      "{
          path:'/studyRoute',
          query:{
              id:'12345',
              name:'shanhua'
          }
      }">
          to studyRoute
      </router-link> 
  </div>

2.params方式

在router-link中:


<div style="font-size:80px; color:black; position:fixed;box-shadow: 0px 0px 0px #ccc; left:50%;top:80%; " >
    <router-link to="/studyRoute/123456/shanhua" >
        to studyRoute
    </router-link> 
</div>

路由配置(注意name在第二种方式中有用的):

{
    path:'/studyRoute/:id/:name', //params方式
    name:'studyRoute',
    components:{default:studyRoute}
}

StudyRoute.vue:


<template>
    <div>
            
            query-------<br>
            id:{{$route.query.id}}
            <br>
            name:{{$route.query.name}}
            
    </div>

    <div>
            params-------<br>
            id:{{$route.params.id}}
            <br>
            name:{{$route.params.name}}
    </div> 
</template>

<script setup lang="ts" name="">
</script>

<style lang='scss' scoped>
</style>

运行结果:
在这里插入图片描述
另一种写法:


<div style="font-size:80px; color:black; position:fixed;box-shadow: 0px 0px 0px #ccc; left:50%;top:80%; " >
    <router-link :to=
    "{
        name:'studyRoute',//注意此处只能用name不能用path
        params:{
            id:'12345',
            name:'shanhua'
        }
    }">
        to studyRoute
    </router-link> 
</div>

3.props传参

其实这种方式就是让params更加方便的形式,我们在实战中体会。

router-link中的内容不变,还用params方式:

 <div style="font-size:80px; color:black; position:fixed;box-shadow: 0px 0px 0px #ccc; left:50%;top:80%; " >
                <router-link :to=
                "{
                    name:'studyRoute',
                    params:{
                        id:'12345',
                        name:'shanhua'
                    }
                }">
                    to studyRoute
                </router-link> 
            </div>

为了对比,在组件中三种方式都留着,Route.vue:

<template>
    <div>
            
            query-------<br>
            id:{{$route.query.id}}
            <br>
            name:{{$route.query.name}} 
    </div>

    <div>
            params-------<br>
            id:{{$route.params.id}}
            <br>
            name:{{$route.params.name}}
    </div> 

    <div>
            props-------<br>
            id:{{id}}
            <br>
            name:{{name}}
    </div> 
</template>

<script setup lang="ts" name="">

    defineProps(['id','name'])
</script>

<style lang='scss' scoped>
</style>

路由配置:

 {
            path:'/studyRoute/:id/:name', //props方式
            name:'studyRoute',
            props:true,
            components:{default:studyRoute}
        }

注意增加了个属性props,这个的作用其实就类似在组件中增加了props:

<Route id=':id' name=':name'></Route>

这样,params参数就像props一样传递给了子组件,vue3的写法就可以接收props:


defineProps(['id','name'])

运行结果:
在这里插入图片描述
props同时也是兼容params的。


总结

路由传参是 vue-router 的核心功能之一,掌握它对于开发复杂的单页应用至关重要。在实际应用中,根据不同的场景选择合适的传参方式,可以使代码更加清晰和易于维护。

人生苦短,若虚度年华,则短暂的人生就太长了。

相关推荐

  1. vue3

    2024-05-16 11:06:05       8 阅读
  2. Vue学习笔记11--2(/命名

    2024-05-16 11:06:05       29 阅读
  3. vue-router

    2024-05-16 11:06:05       12 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-05-16 11:06:05       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-05-16 11:06:05       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-05-16 11:06:05       19 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-05-16 11:06:05       20 阅读

热门阅读

  1. 在 CentOS 上使用 Nginx 配置 HTTPS 并禁止 IP 访问

    2024-05-16 11:06:05       12 阅读
  2. 【奈学科技】P7大前端架构师1期

    2024-05-16 11:06:05       12 阅读
  3. 基于SpringCloudGateway实现接口鉴权

    2024-05-16 11:06:05       12 阅读
  4. docker 配置文件使用经验,后续持续增加

    2024-05-16 11:06:05       14 阅读
  5. 记录一下-排查免密登录过程

    2024-05-16 11:06:05       11 阅读
  6. Oracle如何实现rsa加密和例子

    2024-05-16 11:06:05       11 阅读
  7. GPT3.5与GPT4.0的差别对比

    2024-05-16 11:06:05       13 阅读
  8. 让调用者自己干活的特殊线程池

    2024-05-16 11:06:05       12 阅读
  9. Scala学习3: 字符串

    2024-05-16 11:06:05       13 阅读