一、介绍
- SPA(single page application):单页面应用,只有一个完整的页面;它在加载页面时,不会加载整个页面,而是只更新某个指定的容器中内容。核心之一就是: 更新视图而不重新请求页面
- vue-router在实现单页面前端路由时,提供了两种方式:Hash模式和History模式
- hash:默认,hash(#)是URL的锚点,代表的是网页中的一个位置,比如 localhost:8093/#/hello、localhost:8093/#/hi,hash值分别为#/hello、#/hi
改变#后的部分,浏览器只会滚动到相应位置,不会重新加载网页,因此改变 hash 不会重新
加载页面
- history:url中没有#,这种模式充分利用了html5 history interface 中新增的pushState、 replaceState方法,这两个方法应用于浏览器的历史记录栈,在当前已有的 back、forward、go 的基础之上,它们提供了对历史记录进行修改的功能。只是当它们执行修改时,虽然改变了当前的 URL,但浏览器不会立即向后端发送请求
- 当使用history模式时,需要后端支持(nginx-try_files),否则路由组件页面刷新会404
- 两者在引用静态资源文件时也有区别
- 路由,就是指向的意思,主要是构建 SPA (单页应用)时,方便渲染你指定路由对应的组件,比如:请求/hello,就访问组件,请求/hi,就访问组件
- SPA只有一个入口url,其他url都是通过前端路由跳转的
二、配置
1、配置路由
- 路由配置文件:src/router/
- Router是官方的路由管理器,管理routes中定义的路由
import { createRouter, createWebHistory } from 'vue-router'
const routes = [
{
name: 'About',
meta: {title: '首页', activeMenu: '/result/result_survey'},
path: '/about',
component: () => import('@/views/')
},
{
path: '/qte',
component: Layout,
hidden: true,
children: [
{
name: 'Dept',
meta: {title:'部门列表'},
path: 'dept',
component: (resolve) => require(['@/views/system/dept/index'], resolve)
},
{
name: 'User',
path: 'user',
meta: {title:'用户列表'},
component: (resolve) => require(['@/views/system/user/index'], resolve)
}
]
}
]
const router = createRouter({
history: createWebHistory(process.env.BASE_URL),
routes
})
export default router
2、全局挂载
- 监听地址栏的改变,修改项目中的router-view组件应该加载的组件
- src/
import router from './router'
createApp(App)
.use(router)
.mount('#app')
3、使用
<template>
<router-view/>
</template>
三、跳转
1、JS
import { useRouter } from "vue-router"
export default {
name: "Screen",
setup(){
const router=useRouter()
{
addRoute:
afterEach:
back:() => go(-1)
beforeEach:
beforeResolve:
currentRoute:{
value:{
fullPath: "/screen?id=1",
hash: "",
href: "/screen?id=1",
matched: [{…}]
meta: {title: '大屏'}
name: "Screen"
params: {}
path: "/screen"
query: {id: '1'}
redirectedFrom: undefined
}
}
forward:() => go(1)
getRoutes:
go:
hasRoute:
install:
isReady:
listening:
onError:
options:
push:
removeRoute:
replace:
resolve:
}
router.push({name:'Screen',query: {id:1}})
const id=router.currentRoute.value.query.id
router.push({name:'Screen',params: {id:1,name:'kimi'}})
const name=router.currentRoute.value.params.name
function jumpBack(){
router.back()
}
return{
id,
name,
jumpBack
}
}
}
2、router-link
- 也是两种:query、params,和js的传参参数一样
<template>
<div class="home">
<router-link :to="{name:'Screen',params: {id:1,name:'kimi'}}">Screen</router-link>
</div>
</template>