1. 路由
-
【对路由的理解】
-
【基本切换效果】
Vue3
中要使用vue-router
的最新版本,目前是4版本- 路由配置文件代码如下:
// 创建一个路由器,并暴露出去
// 第一步:引入createRouter
import { createRouter, createWebHistory } from 'vue-router'
// 引入一个一个可能要呈现组件
import Home from '../components/Home.vue'
import News from '../components/News.vue'
import About from '../components/About.vue'
// 第二步:创建路由器并暴露出去
export default createRouter({
history: createWebHistory(),//路由器的工作模式
routes: [//一个一个的路由规则
{
path: '/home',
component: Home
},
{
path: '/news',
component: News
},
{
path: '/about',
component: About
}
]
})
main.ts
代码如下:
// 引入createApp用于创建应用
import { createApp } from 'vue'
// 引入App根组件
import App from './App.vue'
// 引入路由器
import router from './router'
// 创建一个应用
const app = createApp(App)
// 使用路由器
app.use(router)
// 挂载整个应用到app容器中
app.mount('#app')
App.vue
代码如下:
<template>
<div class="app">
<h2 class="title">Vue路由测试</h2>
<!-- 导航区 -->
<div class="navigate">
<RouterLink to="/home" active-class="active">首页</RouterLink>
<RouterLink to="/news" active-class="active">新闻</RouterLink>
<RouterLink to="/about" active-class="active">关于</RouterLink>
</div>
<!-- 展示区 -->
<div class="main-content">
<RouterView></RouterView>
</div>
</div>
</template>
<script lang="ts" setup name="App">
import {RouterLink,RouterView} from 'vue-router';
</script>
- 【两个注意点】
- 路由组件通常存放在
pages
或views
文件夹,一般组件通常放在components
文件夹 - 通过点击导航,视觉效果上“消失”了的路由组件,默认是被卸载的,需要的时候再去挂载
- 【路由器工作模式】
history
模式
优点:
URL
更加美观,不带有#
,更接近传统的网站URL
缺点: 后期项目上线,需要服务端配合处理路径问题,否则刷新会有404
错误const router = createRouter( history: createWebHistory(), // history模式 ... )
hash
模式
优点: 兼容性更好,因为不需要服务端处理路径 确定:
URL
带有#
不美观,且在SEO
优化方面相对较差const router = createRouter( history: createWebHashHistory(), // hash模式 ... )
- 【
to
的两种写法】
<RouterLink to="/news" active-class="active">新闻</RouterLink>
<RouterLink :to="{path: '/about'}" active-class="active">关于</RouterLink>
-
【命名路由】
- 作用:可以简化路由跳转及传参
- 给路由规则命名:
{ name: 'zhuye', path: '/home', component: Home }, { name: 'xinwen', path: '/news', component: News }, { name: 'guanyu', path: '/about', component: About }
- 跳转路由:
<RouterLink :to="{name: 'xinwen'}" active-class="active">新闻</RouterLink>
-
【嵌套路由】
- 编写
News
的子路由:Detail.vue
- 配置路由规则,使用
Children
配置项
export default createRouter({ history: createWebHistory(),//路由器的工作模式 routes: [//一个一个的路由规则 { name: 'zhuye', path: '/home', component: Home }, { name: 'xinwen', path: '/news', component: News, children: [ { path: 'detail', component: Detail } ] }, { name: 'guanyu', path: '/about', component: About } ] })
- 跳转路由(记得要加完整路径)与展示区
<RouterView/>
:
<ul> <li v-for="news in newsList" :key="news.id"> <RouterLink to="/news/detail">{{ news.title }}</RouterLink> </li> </ul> <!-- 展示区 --> <div class="news-content"> <RouterView></RouterView> </div>
- 编写
-
【路由传参】
query
参数- 传递参数
<!-- query传参 第一种 --> <RouterLink :to="`/news/detail?id=${news.id}&title=${news.title}&content=${news.content}`">{{ news.title }}</RouterLink> <!-- query传参 第二种 --> <RouterLink :to="{ path: '/news/detail', query: { id: news.id, title: news.title, content: news.content, } }" > {{ news.title }} </RouterLink>
- 接收参数
<template> <div> <h2> 编号:{{ query.id }} </h2> <h2> 标题:{{ query.title }} </h2> <h3> 内容:{{ query.content }} </h3> </div> </template> <script setup lang="ts" name="Detail"> import {toRefs} from 'vue' import { useRoute } from 'vue-router'; let route = useRoute() const { query } = toRefs(route) </script>
params
参数- 传递参数
// 1. router文件中 { name: 'xinwen', path: '/news', component: News, children: [ { name: 'xiangqing', path: 'detail/:id/:title/:content', component: Detail } ] }, // 2. news文件传递参数 <!-- params传参 第一种 --> <RouterLink :to="`/news/detail/${news.id}/${news.title}/${news.content}`">{{ news.title }}</RouterLink> <!-- params传参 第二种 --> <RouterLink :to="{ name: 'xiangqing', params: { id: news.id, title: news.title, content: news.content, } }" > {{ news.title }} </RouterLink>
- 接收参数
<template> <div> <h2> 编号:{{ params.id }} </h2> <h2> 标题:{{ params.title }} </h2> <h3> 内容:{{ params.content }} </h3> </div> </template> <script setup lang="ts" name="Detail"> import {toRefs} from 'vue' import { useRoute } from 'vue-router'; let route = useRoute() const { params } = toRefs(route) </script>
备注:
- 传递
params
参数时:若使用to
的对象写法,必须使用name配置项,不能用path
- 传递
params
参数时:需要提前在规则中占位- 传递
params
参数时:传递参数属性不能是对象类型- 传递
params
参数时:若是非必传,占位后加?
,如:path: 'detail/:id/:title?/:content?'
- 【路由的props配置】
- 作用:让路由组件更方便的收到参数(可以将路由参数作为
props
传给组件)
// router中配置路由规则
{
name: 'xiangqing',
// path: 'detail/:id/:title/:content', // params传参
path: 'detail',// query传参
component: Detail,
// 1. props的布尔值写法,作用:把收到了每一组params参数,作为props传给Detail组件
// props: true
//2. props的函数写法,作用:把返回的对象中每一组key-value作为props传给Detail组件
props(route){ // 参数route就是路由信息,可以解决query传参
return route.query
}
//3. props的对象写法,作用:把对象中每一组key-value作为props传给Detail组件
// props: { //
// id: '111',
// title: '2222',
// content: '333'
// }
}
// 接收参数
<template>
<div>
<h2> 编号:{{ id }} </h2>
<h2> 标题:{{ title }} </h2>
<h3> 内容:{{ content }} </h3>
</div>
</template>
<script setup lang="ts" name="Detail">
defineProps(['id', 'title', 'content'])
</script>
-
【
replace
属性】- 作用:控制路由跳转时操作浏览器历史记录的模式
- 浏览器的历史记录有两种写入方式:分别是
push
和replace
:
push
是追加历史记录(默认值)replace
是替换当前记录
- 开启
replace
模式:<RouterLink replace ... >News</RouterLink>
-
【编程式导航】 路由组件的两个重要的属性:
$route
和$router
变成了两个`hooks
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)
- 【重定向
redirect
】- 作用:将特定的路径,重新定向到已有路由
- 具体编码:
// 不输入路径自动跳转 { path: '/', redirect: '/about' }, // 无法匹配重定向 随便输入路径,未匹配到做重定向 { path: '/:pathMatch(.*)*', redirect: '/news' }