什么是路由
1.**后端路由:**对于普通的网站,所有的超链接都是URL地址,所有的URL地址都对应服务器上对应的资源;
2.**前端路由:**对于单页面应用程序来说,主要通过URL中的hash(#号)来实现不同页面之间的切换,同时,hash有一个特点:HTTP请求中不会包含hash相关的内容;所以,单页面程序中的页面专挑主要用hash实现;
3.在页面应用程序中,这种通过hash改变来切换页面的方式,称作前端路由(区别于后端路由);
在vue 中使用 vue-router
1.导入vue-router
组件类库:
<script src="../js/vue.js"></script>
<script src="../js/vue-router.js"></script> <!-- 它依赖于vue.js -->
2.创建一个路由对象,当导入vue-router
包之后,在 window 全局对象中,就有了一个路由的构造函数,叫做 VueRouter
,在 new 路由对象的时候,可以为构造函数,传递一个配置对象
var routerObj = new VueRouter({ })
3.routes
这个配置对象中的 routes
表示 【路由匹配规则】 的意思
每个路由规则,都是一个对象,这个规则对象身上,有两个必须的属性。
属性1:path
,表示监听哪个路由链接地址
属性2:component
,表示如果路由是前面匹配到的 path,则展示 component
属性对应的那个组件
注意:component的属性值,必须是一个组件的模板对象,不能是组件的引用名称;
//组件的模板对象
var login = {
template: '<h1>登录组件</h1>'
}
var register = {
template: '<h1>注册组件</h1>'
}
var routerObj = new VueRouter({
routes: [
//{path: '/',component: login}, 不推荐使用
{
path: '/',
redirect: '/login'
}, {
path: '/login',
component: login
}, {
path: '/register',
component: register
}
]
})
4.将路由规则对象,注册到 VM 实例上,用来监听 URL 地址的变化,然后展示对应的组件
var vm = new Vue({
el: '#app',
data: {},
methods: {},
router: routerObj
})
5.渲染组件
router-view
:这是 vue-router
提供的元素,专门用来当作占位符的,将来路由规则匹配到的组件就会展示到这个 router-view
中去;所以,我们可以把 router-view
认为是一个占位符
<transition mode="out-in">
<router-view></router-view>
</transition>
使用tag属性指定router-link渲染的标签类型
<!-- <a href="#/login">登录</a>
<a href="#/register">注册</a> -->
<!-- router-link 默认渲染为一个 a 标签 -->
<!-- 如果想把 router-link 渲染为一个 span 标签:<router-link to="/login" tag="span">登录</router-link> -->
<router-link to="/login">登录</router-link>
<router-link to="/register">注册</router-link>
设置路由重定向
路由重定向是通过 redirect
实现,这里的redirect
和 Node(302重定向) 中的 redirect (修改地址中的hash值) 完全是两码事
var routerObj = new VueRouter({
routes: [
{
path: '/',
redirect: '/login'
}, {
path: '/login',
component: login
}, {
path: '/register',
component: register
}
],
linkActiveClass: 'mycative'
})
设置路由高亮
router-link
标签有两个类;分别是: router-link-exact-active
和 router-link-active
,如果想要改变 router-link-active
名可以通过路由规则的 linkActiveClass
即可( linkActiveClass: 'mycative' )
;
如果想要给router-link
标签改变内容设置高亮可以改变 router-link-active
类中的内容
.router-link-active,
.mycative {
color: red;
font-weight: 800;
font-style: italic;
font-size: 80px;
text-decoration: underline;
background: green;
}
设置路由切换动画
设置路由的切换动画,通过 transition
标签包裹住 router-view
标签,再给 transition
标签设置动画即可。
样式:
.v-enter,
.v-leave-to {
opacity: 0;
transform: translateX(140px);
}
.v-enter-active,
.v-leave-active {
transition: all 0.8s ease;
}
<transition mode="out-in">
<router-view></router-view>
</transition>
在路由中定义参数
1.如果在路由中使用查询字符串给路由传递参数,则不需要修改路由规则的path
属性
<router-link to="/login?id=10&name=张三">登录</router-link>
<router-link to="/login ">注册</router-link>
var login = {
template: '<h1>登录-----{{$route.query.id}}-----{{$route.query.name}}</h1>',
created() { //组件的生命周期钩子函数
console.log(this.$route);
}
}
<router-link to="/login/10/zs">登录</router-link>
<router-link to="/register">注册</router-link>
var login = {
template: '<h1>登录----{{$route.params.id}}----{{$route.params.name}}</h1>',
created() { //组件的生命周期钩子函数
console.log(this.$route);
}
}
var router = new VueRouter({
routes: [{
path: '/login/:id/:name',
component: login
}, {
path: '/register',
component: register
}]
})
路由嵌套
使用children
属性,实现子路由,同时,子路由的 path
前面,不要带 / ,否则永远以根路径开始请求,这样不方便我们用户理解 URL 地址
<body>
<div id="app">
<router-link to="/account">Account</router-link>
<router-view></router-view>
</div>
<template id="tmpl">
<div>
<h1>这是 Account 组件</h1>
<router-link to="/account/login">登录</router-link>
<router-link to="/account/register">注册</router-link>
<router-view></router-view>
</div>
</template>
<script src="../js/vue.js"></script>
<script src="../js/vue-router.js"></script>
</body>
<script>
var account = {
template: '#tmpl'
}
var login = {
template: '<h1>这是登录模块</h1>'
}
var register = {
template: '<h1>这是注册模块</h1>'
}
var router = new VueRouter({
routes: [{
path: '/account',
component: account,
children: [{
path: 'login',
component: login
}, {
path: 'register',
component: register
}]
}
]
})
var vm = new Vue({
el: '#app',
data: {},
methods: {},
router
});
</script>