vue的一个插件库,专门用来实现SPA应用
一个完整的页面
。不会刷新
页面, 只会做页面的局部更新
。后端路由:
前端路由:
npm i vue-router
2022年2月7日以后,vue-router的默认版本,为4版本。vue-router4只能用在vue3中。
vue-router3才能在vue2中使用
应用插件:Vue.use(VueRouter)
编写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
实现切换(active-class可配置高亮样式)
About
指定展示位置
pages
文件夹,一般组件通常存放在components
文件夹。$route
属性,里面存储着自己的路由信息。$router
属性获取到。配置路由规则,使用children配置项:
routes:[{path:'/about',component:About,},{path:'/home',component:Home,children:[ //通过children配置子级路由{path:'news', //此处一定不要写:/newscomponent: News},{path:'message',//此处一定不要写:/messagecomponent: Message}]}
]
跳转(要写完整路径):
News
指定展示位置
传递参数
跳转
跳转
接收参数:
$route.query.id
$route.query.title
作用:可以简化路由的跳转。
如何使用
给路由命名:
{path:'/demo',component:Demo,children:[{path:'test',component:Test,children:[{name:'hello', //给路由命名path:'welcome',component:Hello,}]}]
}
简化跳转:
跳转
跳转
跳转
配置路由,声明接收params参数
{path:'/home',component:Home,children:[{path:'news',component:News},{component:Message,children:[{name:'xiangqing',path:'detail/:id/:title', //使用占位符声明接收params参数component:Detail}]}]
}
传递参数
跳转
跳转
特别注意:路由携带params参数时,若使用to的对象写法,则不能使用path配置项,必须使用name配置!
接收参数:
$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,a: 1,b: 'hello'}}
}
方便在要跳转去的组件里更简便的写法
跳转去组件的具体代码
Detail
- 消息编号:{{id}}
- 消息标题:{{title}}
- a:{{a}}
- b:{{b}}
的replace属性push
和replace
,push
是追加历史记录,replace
是替换当前记录。路由跳转时候默认为push
replace
模式:News
作用:不借助
实现路由跳转,让路由跳转更加灵活
具体编码:
//$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
路由组件失活时触发。这两个生命周期钩子需要配合前面的缓存路由组件使用(没有缓存路由组件不起效果)
作用:对路由进行权限控制
分类:全局守卫、独享守卫、组件内守卫
全局守卫:
//全局前置守卫:初始化时执行、每次路由切换前执行
router.beforeEach((to,from,next)=>{console.log('beforeEach',to,from)if(to.meta.isAuth){ //判断当前路由是否需要进行权限控制if(localStorage.getItem('school') === 'zhejiang'){ //权限控制的具体规则next() //放行}else{alert('暂无权限查看')// next({name:'guanyu'})}}else{next() //放行}
})//全局后置守卫:初始化时执行、每次路由切换后执行
router.afterEach((to,from)=>{console.log('afterEach',to,from)if(to.meta.title){ document.title = to.meta.title //修改网页的title} else{document.title = 'vue_test'}
})
完整代码
// 这个文件专门用于创建整个应用的路由器
import VueRouter from 'vue-router'
// 引入组件
import About from '../pages/About.vue'
import Home from '../pages/Home.vue'
import Message from '../pages/Message.vue'
import News from '../pages/News.vue'
import Detail from '../pages/Detail.vue'
// 创建并暴露一个路由器
const router = new VueRouter({routes: [{path: '/home',component: Home,meta:{title:'主页'},children: [{path: 'news',component: News,meta:{isAuth:true,title:'新闻'}},{path: 'message',name: 'mess',component: Message,meta:{isAuth:true,title:'消息'},children: [{path: 'detail/:id/:title',name: 'xiangqing',component: Detail,meta:{isAuth:true,title:'详情'},props($route) {return {id: $route.query.id,title:$route.query.title,a: 1,b: 'hello'}}}]}]},{path: '/about',component: About,meta:{ title: '关于' }}]
})// 全局前置路由守卫————初始化的时候被调用、每次路由切换之前被调用
router.beforeEach((to, from, next) => {console.log('前置路由守卫', to, from);if(to.meta.isAuth) {if(localStorage.getItem('school') === 'zhejiang') {// 放行next()} else {alert('学校名不对,无权查看')}} else {next()}
})// 全局后置路由守卫————初始化的时候被调用、每次路由切换之后被调用
router.afterEach((to, from) => {console.log('后置路由守卫', to, from)document.title = to.meta.title || '我的系统'
})export default router
就是在 routes 子路由内写守卫
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) { }
对于一个url来说,什么是hash值?—— #及其后面的内容就是hash值。
hash值不会包含在 HTTP 请求中,即:hash值不会带给服务器。
hash模式:
history模式: