Vue Router ( 路由 )

一.概念

  1. 理解: 一个路由(route)就是一组映射关系(key - value),多个路由需要路由器(router)进行管理。
  2. 前端路由:key是路径,value是组件。

二.使用步骤

  1. 安装vue-router,命令:npm i vue-router
  2. 应用插件:Vue.use(VueRouter)
  3. 编写router配置项
  4. 路由子组件展示  <router-link active-class="active" to="/about">About</router-link>
  5. 路由切换  <router-view></router-view>
//1.引入VueRouter
import VueRouter from 'vue-router'
//引入其它 组件
import About from '../components/About'
import Home from '../components/Home'

//2.在router/index.js文件中填写路由规则(如没有创建路由对象)
const router = new VueRouter({
	routes:[
		{
			path:'/about',
			component:About
		},
		{
			path:'/home',
			component:Home
		}
	]
})

//暴露router
export default router

//3.在指定位置展示路由( 占坑 )
<router-view></router-view>

//4.路由切换
<router-link active-class="active" to="/about">About</router-link>

三.注意事项

  1. 路由组件通常存放在router文件夹的index.js文件中, ,一般组件通常存放在components文件夹。
  2. 切换组件,“隐藏”了的路由组件,默认是被销毁掉的,可以在生命周期钩子中修改为缓存在内存中。
  3. 每个组件都有自己的\$route属性,里面存储着自己的路由信息。
  4. 整个应用只有一个router,可以通过组件的\$router属性获取到。

四.多级路由

  1. 配置路由规则,使用children配置项:
    routes:[
    	{
    		path:'/about',
    		component:About,
    	},
    	{
    		path:'/home',
    		component:Home,
    		children:[ //通过children配置子级路由
    			{
    				path:'news', //此处不要写/, 如果写/ ,则切换的url从根路径开始, 不是从父路径开始
    				component:News
    			},
    			{
    				path:'message',//此处一定不要写:/message
    				component:Message
    			}
    		]
    	}
    ]
  2. 跳转(要写完整路径):
    <router-link to="/home/news">News</router-link>

五.路由query参数

  1. 使用query传递参数
    <!-- 跳转并携带query参数,to的字符串写法 -->
    <router-link :to="/home/message/detail?id=666&title=你好">跳转</router-link>
    				
    <!-- 跳转并携带query参数,to的对象写法 -->
    <router-link 
    	:to="{
    		path:'/home/message/detail',
    		query:{
    		   id:666,
               title:'你好'
    		}
    	}">跳转</router-link>
  2. 接收参数
    this.$route.query.id
    this.$route.query.title

六.路由的params参数

  1. 配置路由,在路由url处声明接收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的字符串写法 -->
    <router-link :to="/home/message/detail/666/你好">跳转</router-link>
    				
    <!-- 跳转并携带params参数,to的对象写法 -->
    <router-link 
    	:to="{
    		name:'xiangqing',
    		params:{
    		   id:666,
                title:'你好'
    		}
    	}">跳转</router-link>
    
    //特别注意:路由携带params参数时,若使用to的对象写法,则不能使用path配置项,必须使用name配置!
  3.  接收参数:
    this.$route.params.id
    this.$route.params.title

七.路由的props配置

  • 作用:让路由组件更方便的收到参数
    {
    	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-link>的replace和push属性

  1. 作用:控制路由跳转时操作浏览器历史记录的模式

  2. 浏览器的历史记录有两种写入方式:分别为pushreplacepush是追加历史记录,replace是替换当前记录。路由跳转时候默认为push

  3. 如何使用replace模式:

    • <router-link replace .......>News</router-link>

    • this.$router.replace()

九.编程式路由导航

  1. 作用:不借助<router-link>实现路由跳转,让路由跳转更加灵活

  2. 具体编码:

    //$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. 作用:让不展示的路由组件保持挂载 (组件切换时, input框输入的内容仍然存在),不被销毁。

  2. 具体编码:

    //include指定缓存的组件, 不指定默认缓存所有占位的组件
    <keep-alive include="News"> 
        <router-view></router-view>
    </keep-alive>

十一.路由相关的生命周期钩子

  1. 作用:路由组件所独有的两个钩子,用于捕获路由组件的激活状态。

  2. 具体名字:

    • activated路由组件被激活时触发。
    • deactivated路由组件失活时触发。

十二.路由守卫

  1. 作用:对路由进行权限控制

  2. 分类:全局守卫、独享守卫、组件内守卫

  3. 全局守卫:

    //全局前置守卫:初始化时执行、每次路由切换前执行
    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'
    	}
    })
  4. 独享守卫:
    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()
    	}
    }
  5. 组件内守卫:
    //进入守卫:通过路由规则,进入该组件时被调用
    beforeRouteEnter (to, from, next) {
    },
    //离开守卫:通过路由规则,离开该组件时被调用
    beforeRouteLeave (to, from, next) {
    }

十二.路由的两种工作方式

  • 路由的两张工作方式 : history和hash

    • history方式 , 路径中不带 #

    • hash方式 , 路径中带 # 

  • hash值不会包含在 HTTP 请求中,即:hash值不会带给服务器。

  • hash模式:

    • 地址中永远带着#号,不美观 。

    • 若以后将地址通过第三方手机app分享,若app校验严格,则地址会被标记为不合法。

    • 兼容性较好。

  • history模式:

    1. 地址干净,美观 。

    2. 兼容性和hash模式相比略差。

    3. 应用部署上线时需要后端人员支持,解决刷新页面服务端404的问题

  • 默认为hash方式 , 切换为history方式
    const router = new VueRouter({
      mode: 'history',
      base: process.env.BASE_URL,
      routes
    })
    
    export default router

 

 

 

 

 

 

 

 

posted @ 2021-10-26 21:52  清霜半落沙痕浅  阅读(166)  评论(0编辑  收藏  举报