外观
外观
怡然
1082字约4分钟
2024-06-19
提示
router
管理route
route
是一组key
和value
// 创建一个router并暴露出去
// 第一步,引入createRouter,createWebHistory
import {createRouter,createWebHistory} from 'vue-router'
// 引入要呈现的组件
import demoOne from "@/components/demoOne.vue"
import demoTwo from "@/components/demoTwo.vue"
import demoThree from "@/components/demoThree.vue"
// 第二步:创建router
const router = createRouter({
history:createWebHistory() // router的工作模式
routes:[
{
path:'/home',
component:demoOne
},
{
path:'/about',
component:demoTwo
}
]
})
// 暴露出去操作
export default router
main.ts
中引用import router from './router/index'
const app = createApp(App)
app.use(router)
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
文件夹里。to
的两种写法<!-- 字符串写法 -->
<RouterLink to="/home"></RouterLink>
<!-- 对象写法 -->
<RouterLink :to="{path:"/news"}"></RouterLink>
router
的工作模式mode:"history"
history:createWebHistory()
<BrowserRouter>
优点与缺点
URL
更加美观,不带有#
,更接近传统的网站URL
。404
错误。mode:"hash"
history:createWebHashHistory()
<HashRouter>
优点与缺点
URL
带有#
不太美观,且在SEO
优化方面相对较差。const router = createRouter({
history:createWebHistory(),
routes:[
// ...
{
name:'xinwen',
path:'/news',
component:News,
children:[
{
name:'xiang',
path:'detail', // 注意:子路由不需要在前面加 /
component:Detail
}
]
},
// ...
]
})
export default router
<router-link to="/news/detail">xxxx</router-link>
<!-- 或 -->
<router-link :to="{path:'/news/detail'}">xxxx</router-link>
<!-- 跳转并携带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)
let {query}=toRefs(route) // 记得解构时响应式数据需要加toRefs
path:"detail/:id/:title/:content"
<!-- 跳转并携带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)
注意
params
参数时,若使用to
的对象写法,必须使用name
配置项,不能用path
。params
参数时,需要提前在规则中占位。path:"detail/:id/:title/:content?"
第一种:在配置路由时配置参数props:true
,将路由收到的所有params参数作为props传给路由组件。
第二种:写成函数,可以自己决定将什么作为props给路由组件,主要用于query传参。
// ...
{
name:"xiang",
path:"detail",
component:Detail,
props(route){
return route.query
},
}
// ...
第三种:对象写法,传参比较固定,使用场景较少
// ...
{
name:"xiang",
path:"detail",
component:Detail,
props:{
id:100,
title:200,
content:300
},
}
// ...
配置props时接收传参的方式:
<script lang="ts" setup name="App">
defineProps(['id','title','content'])
</script>
push
和replace
push
将路由推入浏览栈中,形成历史记录,可以通过浏览器的前进后退点击。replace
:在<RouterLink>
里加上replace
,表示替换原来的路由,则不能前进后退。<RouterLink>
实现路由跳转。import {useRoute,useRouter} from 'vue-router'
const route = useRoute()
const router = useRouter()
function goToDetail(news){
router.push({
name:'detail',
query:{
id:news.id,
title:news.title,
content:news.content
}
})
}
{
path:'/',
redirect:'/about'
}