Vue 路由 详细总结
Posted YuLong~W
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Vue 路由 详细总结相关的知识,希望对你有一定的参考价值。
路由
路由: 是指从源到目的地时,决定端到端路径的决策过程。 对于VueRouter而言,路由就是根据一个请求路径选中一个组件进行渲染的决策过程。
一个路由(route)就是一组 映射关系(key - value),多个路由需要 路由器(router) 进行管理。
前端路由:key是路径,value是组件
Vue Router :是 Vue.js 官方的路由管理器。它和 Vue.js 的核心深度集成,让构建单页面应用变得易如反掌。
- route:首先它是个单数,译为路由,可以理解为单个路由或者某一个路由;例如Home按钮 => home内容, 这是一条route,about按钮 => about 内容, 这是另一条路由。
- routes:它是个复数,表示多个的集合才能为复数;可以理解为多个路由的集合,官方定义routes是一个数组;所以routes 表示多个路由(route)的集合
- router:译为路由器,上面都是路由,这个是路由器,可以理解为一个容器包含上述两个或者说它是一个管理者,负责管理上述两个;举个常见的场景的例子:当用户在页面上点击按钮的时候,这个时候router就会去routes中去查找route,就是说路由器会去路由集合中找对应的路由
VueRouter包括三个主要组成部分 —— VueRouter、router-view和 router-link
- VueRouter :路由器类,根据路由请求在路由视图中动态渲染选中的组件
- router-link:路由链接组件,声明用以提交路由请求的用户接口
- router-view:路由视图组件,负责动态渲染路由选中的组件
基本使用
1. 安装vue-router,命令:npm i vue-router
2. 应用插件:Vue.use(VueRouter)
3. 创建路由器实例:编写router配置项
路由器完全依赖于路由表来分发路由请求,因此创建路由器实例时,需要使用 routes配置项 来声明 请求路径(path)和组件(component) 的对应关系 —— 记录这一映射关系的对象,在VueRouter中被称为路由记录(RouteRecord)。 路由器将根据routes路由记录数组来构造路由表。
//引入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
4. 将路由器注入Vue实例
如果在一个Vue实例的模板中需要使用 router-link 和 router-view 组件,需要首先向这个Vue实例注入路由器对象,因为这两个组件都依赖于路由器对象:
在创建Vue实例时,使用router配置项将路由器对象注入Vue实例的$router
属性,例如:
const myrouter = new VueRouter(...)
const vm = new Vue( router: myrouter )
5. 声明路由请求接口:
路由链接组件(router-link) 为用户提供了提交路由请求的交互接口。 使用 to属性 来声明链接组件的目标路径。当用户点击链接组件时,组件 向路由器提交向目标路径的路由请求。在模板中,使用 标签声明路由链接元素。
实现切换(active-class可配置高亮样式):
<router-link active-class="active" to="/about">About</router-link>
6. 声明路由出口:
路由视图组件(router-view) 为路由器($router)提供了所选中组件的渲染出口。在模板中,使用标签<router-view>
声明路由视图元素。
<router-view></router-view>
注意点:
- 路由组件通常存放在
pages
文件夹,一般组件通常存放在components
文件夹。 - 通过切换,“ 隐藏 ” 了的路由组件,默认是被销毁掉的,需要的时候再去挂载。
- 每个组件都有自己的
$route
属性,里面存储着自己的路由信息。 - 整个应用只有一个router,可以通过组件的
$router
属性获取到。
多级路由
-
配置路由规则,使用 children配置项:
routes:[ path:'/about', component:About, , path:'/home', component:Home, children:[ //通过children配置子级路由 path:'news', //此处一定不要写:/news component:News , path:'message',//此处一定不要写:/message component:Message ] ]
-
跳转(要写 完整路径):
<router-link to="/home/news">News</router-link>
命名路由
作用:可以简化路由的跳转
使用:
-
给路由命名:
path:'/demo', component:Demo, children:[ path:'test', component:Test, children:[ name:'hello' //给路由命名 path:'welcome', component:Hello, ] ]
-
简化跳转:
<!--简化前,需要写完整的路径 --> <router-link to="/demo/test/welcome">跳转</router-link> <!--简化后,直接通过名字跳转 --> <router-link :to="name:'hello'">跳转</router-link> <!--简化写法配合传递参数 --> <router-link :to=" name:'hello', query: id:666, title:'你好' " >跳转</router-link>
路由参数
query参数
1. 传递参数
<!-- 跳转并携带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. 接收参数:
$route.query.id
$route.query.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
params参数
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的字符串写法 -->
<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. 接收参数:
$route.params.id
$route.params.title
路由导航
标签导航
标签导航<router-link>
,<router-link>
是通过转义为<a></a>
标签进行跳转,其中router-link标签中的to属性会被转义为a标签中的href属性
1、不带参数
<router-link :to="name:'home'">
<router-link :to="path:'/home'"> //name,path都行, 建议用name
注意:router-link中链接如果是 ‘/’ 开始就是从根路由开始,如果开始不带 ‘/’ ,则从当前路由开始
2、带参数
1)params传参数 (类似post)
<router-link :to="name:'home', params: id:1">
- 路由配置 path: “/home/:id” 或者 path: “/home:id”
- 不配置path ,第一次可请求,刷新页面id会消失
- 配置path,刷新页面id会保留
- html 取参
$route.params.id
- script 取参
this.$route.params.id
2)query传参数 (类似get,url后面会显示参数)
<router-link :to="name:'home', query: id:1">
- 路由可不配置
- html 取参
$route.query.id
- script 取参
this.$route.query.id
<router-link>
的replace属性:
作用:控制路由跳转时操作浏览器历史记录的模式
浏览器的历史记录有两种写入方式:
push
:追加 历史记录replace
:替换 当前记录
路由跳转时候默认为push
方式,开启replace
方式:<router-link replace .......>News</router-link>
编程式导航
作用:不借助<router-link>
实现路由跳转,让路由跳转更加灵活
this.$router 表示全局路由器对象,项目中通过router路由参数注入路由之后,在任何一个页面都可以通过此属性获取到路由器对象,并调用其push()、go()等方法。
通过this.$router.push()
这个方法来实现编程式导航,也可以实现参数传递,这种编程式导航一般是用于按钮点击之后跳转
1、不带参数
this.$router.push('/home')
this.$router.push(name:'home')
this.$router.push(path:'/home')
2、带参数
1) query传参 (get请求)
this.$router.push(name:'home',query: id:'1')
this.$router.push(path:'/home',query: id:'1')
- html 取参
$route.query.id
- script 取参
this.$route.query.id
2)params传参
this.$router.push(name:'home',params: id:'1') // 只能用 name
- 路由配置 path: “/home/:id” 或者 path: “/home:id”
- 不配置path,第一次可请求,刷新页面id会消失
- 配置path,刷新页面id会保留
- html 取参
$route.params.id
- script 取参
this.$route.params.id
其它用法:
- 前进:
this.$router.forward()
- 后退:
this.$router.back()
- 可前进也可后退:
this.$router.go(n)
路由守卫
作用:对路由进行权限控制
分类:全局守卫、独享守卫、组件内守卫
1、全局守卫:
//全局前置守卫:初始化时执行、每次路由切换前执行
router.beforeEach((to,from,next)=>
console.log('beforeEach',to,from)
if(to.meta.isAuth) //判断当前路由是否需要进行权限控制
if(localStorage.getItem('school') === 'xiyou') //权限控制的具体规则
next() //放行
else
alert('暂无权限查看')
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'
)
2、独享守卫:
beforeEnter(to,from,next)
console.log('beforeEnter',to,from)
if(to.meta.isAuth) //判断当前路由是否需要进行权限控制
if(localStorage.getItem('school') === 'xiyou')
next()
else
alert('暂无权限查看')
else
next()
3、组件内守卫:
//进入守卫:通过路由规则,进入该组件时被调用
beforeRouteEnter (to, from, next)
,
//离开守卫:通过路由规则,离开该组件时被调用
beforeRouteLeave (to, from, next)
路由的实现模式
- 对于一个url来说,什么是hash值?—— #及其后面的内容就是hash值。
- hash值不会包含在 HTTP 请求中,即:hash值不会带给服务器。
Vue 中,它是通过 mode 这一参数控制路由的实现模式:
const router=new VueRouter(
mode:'history',
routes:[...]
)
mode 参数:
- 默认 hash
- history。如果浏览器不支持 history 新特性,则采用 hash
- 如果不在浏览器环境下,就采用 abstract(Node环境下)
hash模式:
- 地址中永远带着#号,不美观 。
- 若以后将地址通过第三方手机app分享,若app校验严格,则地址会被标记为不合法。
- 兼容性较好。
mode:"hash" 多了 “#” --- 默认的
http://localhost:8080/#/login
history模式:
- 地址干净,美观 。
- 兼容性和hash模式相比略差。
- 应用部署上线时需要后端人员支持,解决刷新页面服务端404的问题。
mode:"history"
http://localhost:8080/login
扩展知识:
1、缓存路由组件:
作用:让不展示的路由组件保持挂载,不被销毁。
具体编码:
<keep-alive include="News">
<router-view></router-view>
</keep-alive>
2、两个新的生命周期钩子:
作用:路由组件所独有的两个钩子,用于捕获路由组件的激活状态。
具体分为:
activated
路由组件 被激活 时触发deactivated
路由组件 失活 时触发
以上是关于Vue 路由 详细总结的主要内容,如果未能解决你的问题,请参考以下文章