Vue3路由基础

发布于:2025-07-11 ⋅ 阅读:(14) ⋅ 点赞:(0)

为什么要有路由

我们来看一个网易云的页面网易云音乐

在这里有两个关键,一个是切换页面的按钮,还有一个是网页的地址 

当我们在发现音乐和我的音乐和关注,之间互相切换的时候,观察网页地址的变化

 

 

 当我们点击按钮改变页面的时候,并不会直接换一个HTML页面,而是在HTML页面中更换组件,下面的页面内容都对应一个Vue组件,每次切换都会更换Vue组件

那为什么不直接用v-if呢

  • URL 不变,用户无法分享链接

  • 浏览器后退/前进按钮失效

  • 代码难维护和扩展

 使用路由

 使用路由,我们需要先安装路由包

npm install vue-router

基本使用

// router/index.js
import { createRouter, createWebHistory } from 'vue-router'
import Home from '@/views/Home.vue'
import About from '@/views/About.vue'

const routes = [
  { path: '/', component: Home },
  { path: '/about', component: About },
]

export default createRouter({
  history: createWebHistory(),
  routes
})

推荐在router文件夹下创建index.js将路由配置加到这里的js代码中 

//main.js
import { createApp } from 'vue'
import{ createPinia } from 'pinia'
import Antd from 'ant-design-vue'
import App from './App.vue'
import router from '@/router/index.js'
let pinia = createPinia()
let app=createApp(App)
app.use(pinia).use(Antd).use(router)
app.mount('#app')

 我们需要将配置的路由use到App中

//App.vue
<template>
  <div>
    <router-view />
  </div>
</template>
<script>
</script>
<style scoped>

</style>

我们需要在App中显示路由,需要 router-view

 两个组件

//Home.vue
<template>
<div>
    This is the Home page.
</div>
</template>
<script setup>
</script>
<style scoped>
</style>

 另一个

//About.vue
<template>
    <div>
        This is the About page.
    </div>
</template>

<script setup>

</script>

<style scoped></style>

显示效果

 

另一个

当我们更改网页地址之后,会改变App内 router-view显示的组件

<router-link>

router-link用于切换导航地址,使我们可以不用在导航栏中输入地址切换路由,直接点击按钮切换

演示代码

// router/index.js

// router/index.js
import { createRouter, createWebHistory } from 'vue-router'
import Home from '@/views/Home.vue'
import About from '@/views/About.vue'
import Friend from '@/views/Friend.vue'
import Bamboo from '@/views/Bamboo.vue'
const routes = [
  { path: '/home', component: Home },
  { path: '/about', component: About },
  { path: '/friend', component: Friend },
  { path: '/bamboo', component: Bamboo },
]

export default createRouter({
  history: createWebHistory(),
  routes
})

 //App.vue

//App.vue
<template>
  <div>
    <a-space wrap>
      <router-link to="/home">
        <a-button type="primary">Home</a-button>
      </router-link>
      <router-link to="/about">
        <a-button type="primary">About</a-button>
      </router-link>
      <router-link to="/friend">
        <a-button type="primary">Friend</a-button>
      </router-link>
      <router-link to="/bamboo">
        <a-button type="primary">Bamboo</a-button>
      </router-link>
    </a-space>

    <router-view />
  </div>
</template>
<script>
</script>
<style scoped></style>

演示网页

 

 

每点击一个按钮,都会切换到router-link的to对应的网页地址中,router-view会改变显示组件 

路由传参

查询传参

特点:

1. 参数不写在路径中,而是附加在 URL 的末尾

2. 参数类型始终是字符串

  • 所有传递的值都会被转为字符串,哪怕你传的是数字或布尔类型。

3. 查询传参分为单个传参和对象传参

代码示例

App.vue

//App.vue
<template>
  <div>
    <a-space wrap>
      <router-link to="/home?id=10086">
        <a-button type="primary">Home</a-button>
      </router-link>
      <router-link :to="{path: '/about',query: { id: 10086, name: 'vue3' }}">
        <a-button type="primary">About</a-button>
      </router-link>
      <router-link to="/friend">
        <a-button type="primary">Friend</a-button>
      </router-link>
      <router-link to="/bamboo">
        <a-button type="primary">Bamboo</a-button>
      </router-link>
    </a-space>

    <router-view />
  </div>
</template>
<script>
</script>
<style scoped></style>

About.vue

//About.vue
<template>
    <div>
        This is the About page.
    </div>
    <div>
        <p>Route Query Parameters:</p>
        <ul>
            <li v-for="(value, key) in route.query" :key="key">
                {{ key }}: {{ value }}
            </li>
        </ul>
    </div>
</template>

<script setup>
import { useRoute } from 'vue-router';
let route = useRoute();
</script>

<style scoped></style>

Home.vue

//Home.vue
<template>
    <div>
        This is the Home page.
    </div>
    <div>
        <p>Route Query Parameters:</p>
        <ul>
            <li v-for="(value, key) in route.query" :key="key">
                {{ key }}: {{ value }}
            </li>
        </ul>
    </div>
</template>
<script setup>
import { useRoute } from 'vue-router';
let route = useRoute();
</script>
<style scoped></style>

演示结果

 

 

 动态传参

 路由定义

动态路由传参需要用name来定位,path用来定义参数

// router/index.js
import { createRouter, createWebHistory } from 'vue-router'
import Home from '@/views/Home.vue'
import About from '@/views/About.vue'
import Friend from '@/views/Friend.vue'
import Bamboo from '@/views/Bamboo.vue'
const routes = [
  { path: '/home', component: Home },
  { path: '/about', component: About },
  { name: 'friend', path: '/friend/:fidone/:fidtwo', component: Friend },
  { path: '/bamboo/:fid', component: Bamboo },
]

export default createRouter({
  history: createWebHistory(),
  routes
})

 传值

      <router-link :to="{
        name: 'friend',
        params:{
          fidone: 10001,
          fidtwo: 10002
        }
      }">
        <a-button type="primary">Friend</a-button>
      </router-link>
      <router-link to="/bamboo/110088">
        <a-button type="primary">Bamboo</a-button>
      </router-link>

演示结果

 

 

查询传参和动态传参的区别 

 基本语法区别

类型 写法示例 URL 示例
动态传参 /user/:id 配合 params: { id: 123 } /user/123
查询传参 /search 配合 query: { keyword: 'vue' } /search?keyword=vue

配置要求对比

对比点 动态传参 查询传参
是否需要配置路径 必须在路由中定义 :参数名 不需要额外配置
参数显示位置 URL 路径中 /user/123 URL 问号后 /search?key=value
可选性

一般是必传

可选
参数数量限制 有限制(写多少定义多少) 无限制(键值对,任意多个)

更多配置

重定向redirect

当我们打开网页时,显示

这里的路由显示是一篇空白

我们可以使用redirect,当打开网页直接让路由出口显示

演示代码

const routes = [
  { path: '/home', component: Home },
  { path: '/about', component: About },
  { name: 'friend', path: '/friend/:fidone/:fidtwo', component: Friend },
  { path: '/bamboo/:fid', component: Bamboo },
  { path: '/', redirect:'/about' }
]

当我将导航栏清空后

 404

当路由找不到位置时给个提示页面

语法:代码演示

const routes = [
  { path: '/home', component: Home },
  { path: '/about', component: About },
  { name: 'friend', path: '/friend/:fidone/:fidtwo', component: Friend },
  { path: '/bamboo/:fid', component: Bamboo },
  { path: '/', redirect:'/about' },
  { path:'/:pathMatch(.*)*', component:Error}
]
//Error.vue
<template>
<h1>
    This is the Error page.
</h1>
</template>

<script setup>
        
</script>

<style scoped>

</style>

演示结果

 

 

 

 

 


网站公告

今日签到

点亮在社区的每一天
去签到