npm i vue-router
注意:新的vue-router
4只能在vue3中使用,vue-router3
能在vue2中使用
用vue2可运行: npm i vue-router@3
Vue.use(VueRouter)
(并引入路由文件)- //引入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,
- meta:{isAuth:true,title:'详情'},//传递数据
- }
- ]
- })
-
- //暴露router
- export default router
router-link会别vue解析成a,可以当做a标签使用
About
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
- <router-link :to="`/home/message/detail?id=${m.id}&title=${m.title}`">跳转router-link>
-
- <router-link
- :to="{
- path:'/home/message/detail',
- query:{
- id:666,
- title:'你好'
- }
- }"
- >跳转router-link>
$route可获取到当前路由的信息
$route.query.id
$route.query.title
1. 配置路由,声明接收params参数
- {
- path:'/home',
- component:Home,
- children:[
- {
- path:'news',
- component:News
- },
- {
- component:Message,
- children:[
- {
- name:'xiangqing',
- path:'detail/:id/:title', //使用占位符声明接收params参数
- component:Detail,
- meta:{
- isshow:false,//可通过false配置路由信息
- }
- }
- ]
- }
- ]
- }
2. 传递参数
- <router-link :to="/home/message/detail/666/你好">跳转router-link>
-
- <router-link
- :to="{
- name:'xiangqing',
- params:{
- id:666,
- title:'你好'
- }
- }"
- >跳转router-link>
3. 接收参数:
$route.params.id
$route.params.title
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(1) //可前进也可后退 和window.href.go()用法类似
"News"> - <router-view>router-view>
index中路由的配置:
通过配置存在meta对象中的isAuth,和title属性分别进行是否做权限判断,和路由标题显示
next()方法决定是否向下执行路由
- //创建并暴露一个路由器
- const router = new VueRouter({
- routes:[
- {
- name:'guanyu',
- path:'/about',
- component:About,
- meta:{isAuth:true,title:'关于'}
- },
- {
- name:'zhuye',
- path:'/home',
- component:Home,
- meta:{title:'主页'},
- children:[
- {
- name:'xinwen',
- path:'news',
- component:News,
- meta:{isAuth:true,title:'新闻'},
- /* beforeEnter: (to, from, next) => {
- console.log('前置路由守卫',to,from)
- if(to.meta.isAuth){ //判断是否需要鉴权
- if(localStorage.getItem('school')==='atguigu'){
- next()
- }else{
- alert('学校名不对,无权限查看!')
- }
- }else{
- next()
- }
- } */
- },
- {
- name:'xiaoxi',
- path:'message',
- component:Message,
- meta:{isAuth:true,title:'消息'},
- children:[
- {
- name:'xiangqing',
- path:'detail',
- component:Detail,
- meta:{isAuth:true,title:'详情'},
- }
- ]
- }
- ]
- }
- ]
- })
- //全局前置守卫:初始化时执行、每次路由切换前执行
- 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)=>{
- console.log('afterEach',to,from)
- if(to.meta.title){
- document.title = to.meta.title //修改网页的title
- }else{
- document.title = 'vue_test'
- }
- })//全局配置标题
在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) {
- }
在index配置文件里:
暴露的router路由,有两种工作模式:
- const router = new VueRouter({
- mode:'history',//或者mode:'hash'
- routes:[]//配置路径
- })