【vue3】02 - vue3路由
文章目录

导航栏设置路由的跳转,在vue-router中配置路由和组件的关系。
和vue2大同小异,只是语法上有些区别,对于vue2的路由部分,可以看我的这个文章
一:基本切换效果
Vue3
中要使用vue-router
的最新版本,目前是4
版本。可以在创建脚手架的时候直接勾选vue-router
1:基本切换的实现
基本切换非常的简单:一共四个步骤:
1️⃣ 准备对应的组件,这里假设是Home.vue
和About.vue
, 放到views文件夹下
<template>
<div class="home">
<p>{{ count }}</p>
<button @click="add">点我加一</button>
</div>
</template>
<script lang="ts" setup name="Home">
import { ref } from 'vue'
const count = ref(0)
console.log(count)
function add() {
count.value++
}
</script>
<style lang="scss" scoped>
</style>
<template>
<div class="about">
<h1>This is an about page</h1>
<p>{{ a }}</p>
</div>
</template>
<script lang="ts" setup name="About">
import { ref, onMounted } from 'vue'
onMounted(() => {
console.log('About')
})
let a = ref(1)
</script>
<style lang="scss" scoped>
</style>
2️⃣ 配置路由和组件的映射关系,在router/index.ts
中
import { createRouter, createWebHistory } from 'vue-router'
const router = createRouter({
// 使用history模式, 默认为hash模式, history没有/#
history: createWebHistory(import.meta.env.BASE_URL),
routes: [
// 在这里配置路由和组件的映射关系
{
path: '/home',
// 懒加载,避免一开始加载所有组件
component: () => import('@/views/Home.vue'),
},
{
path: '/about',
// 懒加载,避免一开始加载所有组件
component: () => import('@/views/About.vue'),
},
],
})
export default router
3️⃣ main.ts
中声明使用router, 对其进行初始化
import './assets/main.css'
import { createApp } from 'vue'
import App from './App.vue'
import router from './router'
// 通过 createApp 创建一个 Vue 应用程序
const app = createApp(App)
// 使用 router,对应用程序进行路由初始化
app.use(router)
// 挂载到 DOM,绑定根容器 => id=app 上(在目录的最外城index.html中,模板html文件
app.mount('#app')
4️⃣ 父组件中使用RouterLink和RouterView实现导航和展示的实现
<script setup lang="ts" name="App">
// RouterLink组件和RouterView组件
// RouterLink就是代替a标签的,如果你看了vue2的router-link非常好理解这个,就是换了个名字
// RouterView组件用于展示路由匹配到的组件
import {RouterLink, RouterView} from 'vue-router'
</script>
<!-- 结构样式部分 -->
<template>
<div class="app">
<h2 class="title">Vue路由测试</h2>
<!-- 导航区 -->
<div class="navigate">
<RouterLink to="/home" active-class="active">首页</RouterLink>
<RouterLink to="/about" active-class="active">关于</RouterLink>
</div>
<!-- 展示区 -->
<div class="main-content">
<!-- 假设点击了home路由,将会展示/home路由映射的vue信息 -->
<!-- 这里会根据当前的路由展示不同的信息 -->
<RouterView></RouterView>
</div>
</div>
</template>
<style scoped>
/* css部分 */
</style>
2:注意事项
- 路由组件通常存放在
pages
或views
文件夹,一般组件通常存放在components
文件夹。 - 通过点击导航,视觉效果上“消失” 了的路由组件,默认是被卸载掉的,需要的时候再去挂载。
history模式和hash模式
history
模式
- 优点:
URL
更加美观,不带有#
,更接近传统的网站URL
。 - 缺点:后期项目上线,需要服务端配合处理路径问题,否则刷新会有
404
错误。
const router = createRouter({
// 使用history模式, 默认为hash模式, history没有/#
history: createWebHistory(import.meta.env.BASE_URL),
// ...
}
- vue2——
mode:'history'
& vue3——history:createWebHistory()
hash
模式
- 优点:兼容性更好,因为不需要服务器端处理路径。
- 缺点:
URL
带有#
不太美观,且在SEO
优化方面相对较差。
const router = createRouter({
history:createWebHashHistory(), //hash模式
/******/
})
3:to的两种写法和命名路由
<!-- 第一种:to的字符串写法 -->
<router-link active-class="active" to="/home">主页</router-link>
<!-- 第二种:to的对象写法 -->
<router-link active-class="active" :to="{path:'/home'}">Home</router-link>
命名路由作用:可以简化路由跳转及传参
routes:[
{
name:'zhuye',
path:'/home',
component:Home
},
{
name:'xinwen',
path:'/news',
component:News,
},
{
name:'guanyu',
path:'/about',
component:About
}
]
<!--简化前:需要写完整的路径(to的字符串写法) -->
<!--to写法(通过路径)-->
<router-link to="/news/detail">跳转</router-link>
<!--简化后:直接通过名字跳转(to的对象写法配合name属性) -->
<!--:to写法(通过名字)-->
<router-link :to="{name:'guanyu'}">跳转</router-link>
<!--:to写法(通过路径)-->
<router-link :to="{path:'/about'}">跳转</router-link>
4:嵌套路由
1️⃣ 编写子路由组件,这里以/new
的子路由news/detail
为例,编写一个Detail.vue
2️⃣ 编写映射关系,在news映射中,添加children属性
const router = createRouter({
history:createWebHistory(),
routes:[
{
name:'zhuye',
path:'/home',
component:Home
},
{
name:'xinwen',
path:'/news',
component:News,
// 注意这里----------------
children:[
{
name:'xiang',
path:'detail',
component:Detail
}
]
},
{
name:'guanyu',
path:'/about',
component:About
}
]
})
export default router
3️⃣ 路由的跳转,注意添加完整的路径信息
<router-link to="/news/detail">xxxx</router-link>
<!-- 或 -->
<router-link :to="{path:'/news/detail'}">xxxx</router-link>
4️⃣ 注意在使用位置,用RouterView预留位置
<template>
<div class="news">
<nav class="news-list">
<!-- routerLink代替a标签 -->
<RouterLink v-for="news in newsList" :key="news.id" :to="{path:'/news/detail'}">
{{news.name}}
</RouterLink>
</nav>
<!-- 根据上面的选择,获取对应的组件展示 -->
<div class="news-detail">
<RouterView/>
</div>
</div>
</template>
5:routerLink的replace模式
控制路由跳转时操作浏览器历史记录的模式。
浏览器的历史记录有两种写入方式:分别为push
和replace
:
push
是追加历史记录(默认值)。
replace
是替换当前记录。
<!-- 可以这样开启replace模式 -->
<RouterLink replace .......>News</RouterLink>
二:路由传参
其实和vue2的router都一样,就是语法上有一点点区别
1:query参数
参数的传递
<!-- 跳转并携带query参数(to的字符串写法) -->
<router-link to="/news/detail?a=1&b=2&content=欢迎你">
跳转
</router-link>
<!-- 跳转并携带query参数(to的对象写法) -->
<RouterLink
:to="{
//name:'xiang', //用name也可以跳转
path:'/news/detail',
query:{
id:news.id,
title:news.title,
content:news.content
}
}"
>
{{news.title}}
</RouterLink>
接收参数
import {useRoute} from 'vue-router'
const route = useRoute()
// 打印query参数
console.log(route.query) // 通过route.query拿到对应的参数
2:param参数
参数的传递
- 传递
params
参数时,若使用to
的对象写法,必须使用name
配置项,不能用path
。 - 传递
params
参数时,需要提前在规则中占位。
<!-- 跳转并携带params参数(to的字符串写法) -->
<RouterLink :to="`/news/detail/001/新闻001/内容001`">{{news.title}}</RouterLink>
<!-- 跳转并携带params参数(to的对象写法) -->
<RouterLink
:to="{
name:'xiang', //用name跳转
params:{
id:news.id,
title:news.title,
content:news.title
}
}"
>
{{news.title}}
</RouterLink>
接收参数
import {useRoute} from 'vue-router'
const route = useRoute()
// 打印params参数
console.log(route.params)
3:路由的props配置
让路由组件更方便的收到参数(可以将路由参数作为props
传给组件)
{
name:'xiang',
path:'detail/:id/:title/:content',
component:Detail,
// props的对象写法,作用:把对象中的每一组key-value作为props传给Detail组件
// props:{a:1,b:2,c:3},
// props的布尔值写法,作用:把收到了每一组params参数,作为props传给Detail组件
// props:true
// props的函数写法,作用:把返回的对象中每一组key-value作为props传给Detail组件
props(route){
return route.query
}
}
4:编程式导航传参
同vue2一样,也是提供了两个重要的属性$route
和$router
,只不过这里变成了两个hook
尤其是router.push
的使用!!
方式一:path路径跳转传参(query传参)
router.push("路由路径?参数1=参数值1&参数2=参数值2")
// 或者是下面的写法
router.push({
path: '路由路径',
query: {
参数1:"参数值1",
参数2:"参数值2"
}
})
同样通过$route.query.参数名
接受指定的参数
方式二:name命名路由跳转传参(query传参)
router.push({
name: '路由名称',
query: {
参数1:"参数值1",
参数2:"参数值2"
}
})
// 同时在路径组件映射文件中指定name - index.js
{name: "路由名称", path: '路径', component: 组件},
总结!!
import {useRoute,useRouter} from 'vue-router'
const route = useRoute()
const router = useRouter()
console.log(route.query)
console.log(route.parmas)
console.log(router.push)
console.log(router.replace)
5:重定向和错误处理
网页打开的时候,url打开的默认是/
根路径,此时如果根路径没有配置和任何组件的映射,就会产生一进入导航栏下面空白的情况
而重定向的作用就是,匹配到指定的path之后,强制跳转path的路径
可以在配置路径组件映射的js中设置重定向
{
path:'/',
redirect:'/about'
}
而错误处理要放到所有的最后面,然后path指定为'*'
// 一定要放在所有映射的最后面,表示前面都匹配不到了,使用这个
{
path: '*',
component: ErrorPage
}