【对路由的理解】
【基本切换效果】
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
传给组件)// 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'
}