目录
1. 概念
1.1 vue-router的概念
1.2 SPA的概念
2. 基本使用
2.1 搭配环境和使用
2.2 注意点
2.3 多级路由(多级路由)
2.4 路由query 传参
2.5 命名路由
2.6 路由的params传参
2.6 路由的props配置
2.7 的replace属性
2.8 编程式路由导航
2.9 缓存路由组件
2.10 生命周期的钩子 activated和deactivated
3. 路由守卫
3.1 全局守卫
3.1.1 全局前置守卫
3.1.1 全局后置守卫
3.2 独享守卫
3.3 组件内守卫
4. 路由器的两种工作模式
4.1 history 模式
4.2 hash模式
1. 安装vue-router命令:npm i vue-router
注意vue-router4只能在vue3使用, vue-router3只能在vue2使用
2. src创建index.js文件编写router配置项:
//引入VueRouter
import VueRouter from 'vue-router'
//引入Luyou 组件
import About from '../components/About'
import Home from '../components/Home'
//创建router实例对象,去管理一组一组的路由规则
const router = new VueRouter({
routes:[
{
path:'/about',
component:About
},
{
path:'/home',
component:Home
}
]
})
//暴露router
export default router
3. 实现切换(active-class可配置高亮样式)
About
4. 指定展示位置
组件分为路由组件(无需跳转)和一般组件(写标签)
路由组件放在pages文件夹,一般组件放在components文件夹。
通过切换,“隐藏”了的路由组件,默认是被销毁掉的,需要的时候再去挂载。
每个组件都有自己的 $route属性,里面存储着自己的路由信息
整个应用只有一个router,可以通过组件的 $router 属性获取到。
1.配置路由规则,使用children配置项:
routes:[
{
path:'/about',
component:About,
},
{
path:'/home',
component:Home,
children:[ //通过children配置子级路由
{
path:'news', //此处一定不要写:/news
component:News
},
{
path:'message',//此处一定不要写:/message
component:Message
}
]
}
]
2. 跳转(要写完整路径):
News
1. 传递参数
跳转
跳转
建议使用对象写法
作用:可以简化路由的跳转。
1. 路由命名
{
path:'/demo',
component:Demo,
children:[
{
path:'test',
component:Test,
children:[
{
name:'hello' //给路由命名
path:'welcome',
component:Hello,
}
]
}
]
}
2. 简单跳转
跳转
跳转
跳转
写了路由名字,可以用name代替to的路径
这种方式要用name的方式写url
1.配置路由,声明接收params参数
{
path:'/home',
component:Home,
children:[
{
path:'news',
component:News
},
{
component:Message,
children:[
{
name:'xiangqing',
path:'detail/:id/:title', //使用占位符声明接收params参数
component:Detail
}
]
}
]
}
2. 传递参数
跳转
跳转
特别注意:路由携带params参数时,若使用to的对象写法,则不能使用path配置项,必须使用name配置!
3. 接收参数:
$route.params.id
$route.params.title
作用:让路由组件更方便的收到参数
{
name:'xiangqing',
path:'detail/:id',
component:Detail,
//第一种写法:props值为对象,该对象中所有的key-value的组合最终都会通过props传给Detail组件
// props:{a:900}
//第二种写法:props值为布尔值,布尔值为true,则把路由收到的所有params参数通过props传给Detail组件
// props:true
//第三种写法:props值为函数,该函数返回的对象中每一组key-value都会通过props传给Detail组件
props(route){
return {
id:route.query.id,
title:route.query.title
}
}
}
作用:不借助
//$router的两个API
this.$router.push({
name:'xiangqing',
params:{
id:xxx,
title:xxx
}
})
this.$router.replace({
name:'xiangqing',
params:{
id:xxx,
title:xxx
}
})
this.$router.forward() //前进
this.$router.back() //后退
this.$router.go() //可前进也可后退
作用:让不展示的路由组件保持挂载,不被销毁。
include里面写组件名!组件名!
数组形式表示,逗号做分割符可以写多个组件
activated和deactivated
作用:路由组件所独有的两个钩子,用于捕获路由组件的激活状态。
这两个生命周期钩子是路由独有的,要配合keep-alive标签使用
activated
路由组件被激活时触发。deactivated
路由组件失活时触发。
nextTick 也是一个生命周期钩子:在下一次dom更新完再执行回调
作用:对路由进行权限控制
分类:全局守卫、独享守卫、组件内守卫
全局前置守卫:初始化时执行、每次路由切换前执行
router.beforeEach((to,from,next)=>{})
//全局前置守卫:初始化时执行、每次路由切换前执行
router.beforeEach((to,from,next)=>{
console.log('beforeEach',to,from)
if(to.meta.isAuth){ //判断当前路由是否需要进行权限控制
if(localStorage.getItem('school') === 'atguigu'){ //权限控制的具体规则
next() //放行
}else{
alert('暂无权限查看')
// next({name:'guanyu'})
}
}else{
next() //放行
}
})
全局后置守卫:初始化时执行、每次路由切换后执行
router.afterEach((to,from)=>{})
//全局后置守卫:初始化时执行、每次路由切换后执行
router.afterEach((to,from)=>{
console.log('afterEach',to,from)
if(to.meta.title){
document.title = to.meta.title //修改网页的title
}else{
document.title = 'vue_test'
}
})
单独对谁进行的守卫
beforeEnter :(to,from,next)=>{}
beforeEnter(to,from,next){
console.log('beforeEnter',to,from)
if(to.meta.isAuth){ //判断当前路由是否需要进行权限控制
if(localStorage.getItem('school') === 'atguigu'){
next()
}else{
alert('暂无权限查看')
// next({name:'guanyu'})
}
}else{
next()
}
}
就是在组件内部进行守卫
beforeRouteEnter (to, from, next) {}
beforeRouteLeave (to, from, next) {}
//进入守卫:通过路由规则,进入该组件时被调用
beforeRouteEnter (to, from, next) {
},
//离开守卫:通过路由规则,离开该组件时被调用
beforeRouteLeave (to, from, next) {
}
如果全局守卫和独享守卫同时存在,想用全局守卫,后用独享守卫
hash值:#及其后面的内容
hash值不会包含在 HTTP 请求中,即:hash值不会带给服务器。
地址干净,美观 。
兼容性和hash模式相比略差。
应用部署上线时需要后端人员支持,解决刷新页面服务端404的问题。
地址中永远带着#号,不美观 。
若以后将地址通过第三方手机app分享,若app校验严格,则地址会被标记为不合法。
兼容性较好。
4.3 补充
项目写完了用 npm run build命令 ,打包生成list文件夹
打包处理的要经过服务器部署 node express
新建一个文件夹
npm init (xxx)
npm i express
新建server.js:
const express=require('express')
const app=express()
//端口监听(设置端口号)
app.listen(5000)
node server
static/public: 放静态资源,html、css、js
然后再把list文件放到static文件夹里