文章目录
前言
- 在前端ui界面的时候我们需要跳转路由的操作,用户点击不同的选项页面就会变成不同的样子,以前我们笨拙地使用后端的重定向来实现,现在我们可以通过前端vue的路由跳转来实现:用户选项时,切换路由,而路由就会让vue寻找对应的vue组件从而响应给用户。
一、路由定义
- 狭义的路由概念:在vue3中,路由主要用于管理SPA(单页面应用)的页面跳转,使得不同的url可以映射不同的组件,无需重新加载整个页面。
二、基本示例
1.配置路由器
- 功能:注册路由,配置映射关系,一个路由对应一个组件。
routers
// 1.导入组件以及路由创建器
import { createRouter, createWebHistory } from "vue-router";
import Home from '../components/RouteTest/Home.vue'
import About from '../components/RouteTest/About.vue'
import News from '../components/RouteTest/News.vue'
// 2.将组件对应响应的路由
const router = createRouter({
history:createWebHistory(),
routes:[
{
path:'/home',
component:Home
},
{
path:'/about',
component:About
},
{
path:'/news',
component:News
},
]
})
// 3.将路由器暴露
export default router
2.准备组件
- 一般来说路由组件通常放在:pages或views的文件夹下。
News.vue
<template>
<div>
<p>新闻</p>
</div>
</template>
<script>
export default {
name:'Home'
}
</script>
About.vue
<template>
<div>
<p>关于</p>
</div>
</template>
<script>
export default {
name:'Home'
}
</script>
Home.vue
<template>
<div>
<p>首页</p>
</div>
</template>
<script>
export default {
name:'Home'
}
</script>
3.装入main.ts
main.ts
import {createApp} from 'vue'
import App from './App.vue'
import router from './routers/index'
// 1.获得app应用
const app = createApp(App)
// 2.将路由装入app
app.use(router)
// 3.挂载app
app.mount('#app')
4.在根组件中定义路由结构
- 类似于超链接需要定义路由标签,但是我们在vue3中要使用预制好的标签。
- 然后定义显示区即可。
- 注意:不需要我们导入组件了,因为我们设置了路由,路由会自动去寻找对应的组件。
- 注意:通过点击导航,视觉效果上“消失” 了的路由组件,默认是被卸载掉的,需要的时候再去挂载。可以利用生命周期函数来观察挂载情况。
App.vue
<template>
<div class="app">
<h2 class="title">Vue路由测试</h2>
<div class="navigate">
<!-- 使用RouterLink标签 to表示跳转的路由 active-class表示路由激活后变成的样式 -->
<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></RouterView>
</div>
</div>
</template>
<script lang="ts" setup>
import { RouterLink,RouterView } from 'vue-router';
</script>
三、路由器的工作模式
- 路由器的工作模式决定了URL的显示方式和路由跳转行为。
- 路由器的工作模式分为history模式和hash模式。
history模式:
- 优点:url更加美观,不带有#。
- 缺点:需要和后端配合处理路径问题。
const router = createRouter({
history:createWebHistory(),
routes:[
{
path:'/home',
component:Home
},
{
path:'/about',
component:About
},
{
path:'/news',
component:News
},
]
})
hash模式:
- 优点:兼容性更好,还有#。
- 缺点:需要和后端配合处理路径问题。
const router = createRouter({
history:createWebHashHistory(),
routes:[
{
path:'/home',
component:Home
},
{
path:'/about',
component:About
},
{
path:'/news',
component:News
},
]
})
四、to的两种写法
写法1:
// 直接使用字符串
<RouterLink to="/home" active-class="active">首页</RouterLink>
写法2:
// 对象 适用于嵌套路由
<Router-link active-class="active" :to="{path:'/home'}">Home</Router-link>
五、命名路由
- 简化跳转路由。
命名:
// 1.导入组件以及路由创建器
import { createRouter, createWebHistory } from "vue-router";
import Home from '../pages/Home.vue'
import About from '../pages/About.vue'
import News from '../pages/News.vue'
// 2.将组件对应响应的路由
const router = createRouter({
history:createWebHistory(),
routes:[
{
name:'jia'
path:'/home',
component:Home
},
{
name:'guanyu'
path:'/about',
component:About
},
{
name:'xinwen'
path:'/news',
component:News
},
]
})
// 3.将路由器暴露
export default router
引用:
<template>
<div class="app">
<h2 class="title">Vue路由测试</h2>
<div class="navigate">
<!-- 使用RouterLink标签 to表示跳转的路由 active-class表示路由激活后变成的样式 -->
<RouterLink :to="{name:'jia'}" active-class="active">首页</RouterLink>
<RouterLink to="{name:'xinwen'}"" active-class="active">新闻</RouterLink>
<RouterLink to="{name:'guanyu'}" active-class="active">关于</RouterLink>
</div>
<!-- 展示区 -->
<div class="main-content">
<!-- 使用RouterView标签表示能够在这块区域展示相应的组件 -->
<RouterView></RouterView>
</div>
</div>
</template>
<script lang="ts" setup>
import { RouterLink,RouterView } from 'vue-router';
</script>
六、嵌套路由
- 在路由中又可以嵌套另一个路由,在一个有路由的组件中再设置一层路由,然后就实现了嵌套路由。
- 使用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
七、路由传参
- 有两种方式:query和params。
- 直接使用编程式导航,记住就行了,再使用事件流的时候就可以直接用,不然结构和事件写在一起非常丑。
- 现在的关系是News.vue嵌套了Detail.vue。
- 需求:在一个路由组件接收了用户传过来的参数,然后跳转到嵌套的路由中,嵌套的路由中就可以接收传过来的参数从而作出响应。
1.query
routers
// 1.导入组件以及路由创建器
import { createRouter, createWebHistory } from "vue-router";
import Home from '../components/RouteTest/Home.vue'
import About from '../components/RouteTest/About.vue'
import News from '../components/RouteTest/News.vue'
// 2.将组件对应响应的路由
const router = createRouter({
history:createWebHistory(),
routes:[
{
path:'/home',
component:Home
},
{
path:'/about',
component:About
},
{
path:'/news',
component:News,
children:[
{
path:'detail',
component:Detail,
}
]
},
]
})
// 3.将路由器暴露
export default router
News.vue:
// 注意这时候根组件里
// 方式1:直接字符串写法 没啥意义
<Router-link to="/news/detail?a=1&b=2&content=欢迎你">
跳转
</Router-link>
// 方式2:跳转并携带query参数
<Router-link :to="{
path:'/news/detail',
query:{
id:news.id,
title:news.title,
content:news.content
}
}">
{{ news.title }}
Detail.vue
<template>
<ul>
<li>{{ id }}</li>
<li>{{ title }}</li>
<li>{{ content }}</li>
</ul>
</template>
<script setup>
import {userRoute} from 'vue-router'
const route = useRoute()
// 通过route.query拿到这个函数然后进行解构
const {id,title,content} = route.query
</script>
2.params
routers
// 1.导入组件以及路由创建器
import { createRouter, createWebHistory } from "vue-router";
import Home from '../components/RouteTest/Home.vue'
import About from '../components/RouteTest/About.vue'
import News from '../components/RouteTest/News.vue'
// 2.将组件对应响应的路由
const router = createRouter({
history:createWebHistory(),
routes:[
{
path:'/home',
component:Home
},
{
path:'/about',
component:About
},
{
path:'/news',
component:News,
children:[
{
name:'xiang',
path:'detail/:id/:title/:content',
component:Detail,
}
]
},
]
})
// 3.将路由器暴露
export default router
News.vue:
// 方法1:字符串的形式
<RouterLink :to="`/news/detail/001/新闻001/内容001`">{{news.title}}</RouterLink>
// 方法2:对象的形式
<RouterLink
:to="{
name:'xiang', //用name跳转
params:{
id:news.id,
title:news.title,
content:news.title
}
}"
>
{{news.title}}
</RouterLink>
Detail.vue
import {useRoute} from 'vue-router'
const route = useRoute()
// 打印params参数
const {id, title, content} = route.params
3.区别
区别1:query配置路由时不需要占位符。
区别2:params配置路由时要占位符。
区别3:在路由组件里,params只能使用name命名,不能用path。
区别4:params不能穿数组和对象。
八、路由props
- 刚才我们手动解构了参数,利用params我们可以不用手动解构了。
routers
// 1.导入组件以及路由创建器
import { createRouter, createWebHistory } from "vue-router";
import Home from '../components/RouteTest/Home.vue'
import About from '../components/RouteTest/About.vue'
import News from '../components/RouteTest/News.vue'
// 2.将组件对应响应的路由
const router = createRouter({
history:createWebHistory(),
routes:[
{
path:'/home',
component:Home
},
{
path:'/about',
component:About
},
{
path:'/news',
component:News,
children:[
{
name:'xiang',
path:'detail',
component:Detail,
props: (route)=>{
return route.query
)
}
]
},
]
})
// 3.将路由器暴露
export default router
Detail接收参数:
defineProps(['id','title','content'])
九、replace
- 在需要跳转的RouterLink中的replace标签表示不再可以返回上次的页面跳转,不可以退栈回溯了。
- 加上push时可以回溯。
News.vue
// 方法1:字符串的形式
<RouterLink :to="`/news/detail/001/新闻001/内容001`">{{news.title}}</RouterLink>
// 方法2:对象的形式
<RouterLink replace
:to="{
name:'xiang', //用name跳转
params:{
id:news.id,
title:news.title,
content:news.title
}
}"
>
{{news.title}}
</RouterLink>
十、编程式导航
- 可以写在一个函数里面进行跳转。
- 也可以用router.replace()。
- router.push和router.replace
- route.query和route.params是获取当前路由的参数。
<template>
// 记得点击的时候如果需要传入数据给嵌套的子组件让它显示的话
// 就给它串参数
<button @click="clickToPush({id:'1', title:'标题', content:'内容'})">点我</button>
</template>
<script setup>
import { useRouter } from 'vue-router';
const router = useRouter();
// 对象形式(推荐)
// 定义一个接口
interface INews {
id:string,
title:string,
content:string
}
// 可以写在一个函数里面然后进行定义
// 同时限制类型
function clickToPush(news:INews) {
router.push({
path: '/news/detail',
query: {
id:news.id,
title:news.title,
content:news.title
}
});
}
</script>
十一、重定向
- 在需要重定向的路由配置中加上redirect即可。
const router = createRouter({
history:createWebHistory(),
routes:[
{
path:'/',
redirect:'/home',
}
]
总结
- 路由用来控制组件之间的切换以及跳转,能够在不刷新页面的情况下显示不同的组件。
1752

被折叠的 条评论
为什么被折叠?



