路由route
什么是路由
与 <a></a>
的功能相似,实现对应的跳转。使用路由机制,不会出现请求及页面刷新。
使用路由
-
安装路由
npm i vue-router
-
在main.js中引入路由
import VueRouter from 'vue-router'
路由是插件,Vue.use(VueRouter) -
在src下创建文件夹router并创建文件index.js,在里面配置路由
-
在index.js中引入vue-router和其他需要的组件
import VueRouter from 'vue-router' import About from '../components/About' import Home from '../components/Home'
-
创建并暴露vue-route实例对象,这里一定要注意,是routes不是routers
export default new VueRouter({ routes: [ { path: '/about', component: About }, { path: '/home', component: Home } ] })
-
使用route-link标签
<router-link class="list-group-item" active-class="active" to="/about">About</router-link> <router-link class="list-group-item" active-class="active" to="/home">Home</router-link>
-
在需要该组件的位置放置router-view标签
<router-view></router-view>
几个注意点
路由组件和一般组件
靠路由规则匹配出来,由路由器渲染的组件为路由组件
亲自写标签的组件称为一般组件
在开发中,为了区分这两类组件,通常把路由组件放在pages文件夹下,而把一般组件放在components文件夹下
没在页面上展示的组件去哪了?
通过切换,隐藏了的路由组件,默认是被销毁掉的需要的时候再去挂载
route和router属性
每个组件都有自己的$router属性,存储着自己的路由信息。
整个应用只有一个router,可以通过组件的$router属性获取到。
嵌套(多级)路由
使用children配置项
export default new VueRouter({
routes: [
{
path: '/home',
component: Home,
children: [{
path: 'message',//注意,此处的path不要写/
component: Message
},
{
path: 'news',
component: News
}]
}
]
})
router-link里面跳转要写完整路径
<router-link
class="list-group-item"
to="/home/message"
active-class="active"
>Message
</router-link>
路由的query参数
-
传递参数
<router-link :to="{ path: '/home/message/detail', query: { id: m.id, title: m.title, }, }" >{{ m.title }} </router-link>
-
接收参数
<ul>
<li>消息编号:{{ $route.query.id }}</li>
<li>消息标题:{{ $route.query.title }}</li>
</ul>
命名路由
作用:简化路由的跳转
-
给路由命名
配置路由的时候多写入一个配置项namechildren: [ { name:'xiangqing', path: 'detail', component: Detail } ]
-
简化跳转
简化前
:to="{ path: '/home/message/detail'}"
简化后
:to= "{ name: 'xiangqing'}"
路由的params参数
- 声明并接收params
children: [{
path: 'message',
component: Message,
children: [
{
path: 'detail/:id/:name',//使用占位符声明接受params
component: Detail
}
]
}]
-
传递参数
<router-link :to="`/home/message/detail/${m.id}/${m.title}`"> {{m.title}}</router-link> //特别注意:如果此处to用的是对象写法,则不能使用path配置项,只能使用name
-
接收参数
<ul> <li>消息编号:{{ $route.params.id }}</li> <li>消息标题:{{ $route.params.title }}</li> </ul>
路由的props配置(写在路由里)
- 对象写法
props:{a:1,b:666} - 值为布尔
props:true
如果props值为true,就会把该路由组件收到的所有params参数以props形式传给组件 - 函数写法
props($route){
return{
id:$route.query.id,
title:$route.query.title
}
}
router-link的replace属性
-
作用:控制路由跳转时操作浏览器历史记录的模式
-
浏览器的历史记录有两种写入方式:(数据结构为栈)分别为push和replace,push是追加历史记录,replace是替换当前记录。路由跳转时候默认为push
-
如何开启replace模式:
<router-link replace ......>...<router-link>
编程式路由导航
作用:不借助 <router-link>
实现路由跳转,使路由跳转更加灵活
编码:router的两个API
push能够保存历史记录,往栈里堆但不会替换
this.$router.push(
{
//传入的参数和to的一样
name:'xiangqing',
params:{
id:xxx,
title:xxx
}
}
)
replace不能保存历史记录,会替换栈顶的操作
this.$router.replace(
{
//传入的参数和to的一样
path:'/home/message/de`tail',
params:{
id:xxx,
title:xxx
}
}
)
back(),forward()和go()
back:后退一步
forward:前进一步
go:根据括号里传的参数决定,正数前进,负数后退对应步数
<button @click="$router.back()">后退</button>
<button @click="$router.forward()">前进</button>
<button @click="$router.go(3)">go</button>
缓存路由组件
作用:让不展示的路由组件保持挂载,不被销毁。
具体编码:
<keep-alive include="News">
<router-view></router-view>
</keep-alive>
include的作用是:选择特定的组件不被销毁,如果不配置include,则默认为全部组件都不被销毁
注意:include=“组件名”!!!
如果需要选择多个组件,组件名之间用逗号隔开
或者 <keep-alive include="['News','Message']"
用数组形式
两个新的生命周期
作用:路由组件所独有的两个钩子,用于捕获路由组件的激活状态
具体名字:
1.activated路由组件被激活时触发
2.deactivated路由组件失活时触发
路由守卫
全局前置路由守卫
router.beforeEach( ( to , from , next ) => { })
只要形成路由的跳转,该函数就会被调用
在初始化时也会被调用
三个参数:
to:跳转去的路由
from:从哪个路由来
next:调用next() , to的组件才会被展示出来(保镖,决定是否放行)
所以,在进行条件判断之后不要忘记掉next()
全局后置路由守卫
初始化执行,每次路由切换后执行
router.afterEach( (to,from)=>{
if(to.meta.title)
document.title=to.meta.title
else
document.title='xxx'
})
独享路由守卫
beforeEnter,判断当前路由是否需要权限控制,谁需要判断就写在谁里面
beforeEnter((to,from,next)=>{
xxxxx
})
注意:独享路由只有前置路由没有后置路由
组件内路由守卫
进入守卫
beforeRouteEnter(to,from,next){
xxxx
}
离开守卫
beforeRouteLeave(to,from,next){
xxx
}
离开不等于后置路由守卫
后置路由守卫触发的时间是,点击router-link跳转后
而离开守卫的时间是,当要离开此组件,点击另一个router-link时
路由器的两种工作模式
hash/history
- 对于一个url来说,什么是hash值?——#及其后面的内容就是hash值
- hash值不会包含在HTTP请求中,即:hash值不会带给服务器
- hash模式:
- 地址中永远带着#,不美观
- 若以后将地址通过第三方手机app分享,若app校验严格,则地址会被标记为不合法
- 兼容性较好
- history模式:
- 地址干净,美观
- 兼容性和hash模式相比略差
- 应用部署上线时需要后端人员支持,解决刷新页面服务端404的问题