什么是路由
1.后端路由:对于普通的网站,所有的超链接都是URL地址,所有的URL地址都对应服务器上对应的资源;
2.前端路由:对于单页面应用程序来说,主要通过URL中的hash(#号)来实现不同页面之间的切换,同时,hash有一个特点:HTTP请求中不会包含hash相关的内容;所以,单页面程序中的页面跳转主要用hash实现;
3.在单页面应用程序中,这种通过hash改变来切换页面的方式,称作前端路由(区别于后端路由);
1.1 引入vue-router
我们需要引入vue-router.js文件,而且必须是在vue.js文件之后引入
1.2 创建组件模板
创建两个组件模板对象,如下
1.3 VueRouter实例
当 导入 vue-router 包之后,在 window 全局对象中,就有了一个 路由的构造函数叫做 VueRouter,在 new 路由对象的时候,可以为 构造函数,传递一个配置对象。在配置对象中我们可以来创建我们的路由规则
1.4 vm实例绑定
创建的VueRouter对象我们还需要绑定到Vue实例中才有效果
1.5 router-view
我们想要使用router路由,那么我们通过router-view标签来占位 我们要显示的内容的位置
(router-view标签是 vue-router 提供的元素,专门用来 当作占位符的,将来,路由规则,匹配到的组件,就会展示到这个 router-view 中去。所以: 我们可以把 router-view 认为是一个占位符。)
效果:
通过上面的演示我们可以通过修改 #/后的内容来 触发路由中的规则,这时我们可以在页面中添加对应的操作按钮来便捷触发。
效果:
2. 重定向
第一次打开的时候,是没有路由规则的,这时我们可以配置一个默认路由,如下
有实现,但是地址显示的是“/”,我们希望地址和路由的结果是一致的,这时我们可以设置个重定向来处理。
3. router-link
我们可以用router-link标签来替换掉 a标签,这样会更灵活些,如下(router-link中的 tag属性来修改 渲染的标签类型)
4. 高亮处理
当对应的标签被选中的时候会动态给标签添加 class属性:
router-link-active,那么我们就可以利用这 属性了
注意在VueRouter实例中有个属性叫 linkActiveClass 可以设置我们 特定的 class 值。
5. 动画效果
最后我们可以将前面讲过的动画运用到组件切换上。如下
效果:
代码:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
<script src="./lib/vue-2.4.0.js"></script>
<!-- 1. 安装 vue-router 路由模块 -->
<script src="./lib/vue-router-3.0.1.js"></script>
<style>
.router-link-active,
.myactive {
color: red;
font-weight: 800;
font-style: italic;
font-size: 80px;
text-decoration: underline;
background-color: green;
}
.v-enter,
.v-leave-to {
opacity: 0;
transform: translateX(140px);
}
.v-enter-active,
.v-leave-active {
transition: all 0.5s ease;
}
</style>
</head>
<body>
<div id="app">
<!-- <a href="#/login">登录</a> -->
<!-- <a href="#/register">注册</a> -->
<!-- router-link 默认渲染为一个a 标签 -->
<router-link to="/login" tag="span">登录</router-link>
<router-link to="/register">注册</router-link>
<!-- 这是 vue-router 提供的元素,专门用来 当作占位符的,将来,路由规则,匹配到的组件,就会展示到这个 router-view 中去 -->
<!-- 所以: 我们可以把 router-view 认为是一个占位符 -->
<transition mode="out-in">
<router-view></router-view>
</transition>
</div>
<script>
// 组件的模板对象
var login = {
template: '<h1>登录组件</h1>'
}
var register = {
template: '<h1>注册组件</h1>'
}
/* Vue.component('login', {
template: '<h1>登录组件</h1>'
}) */
// 2. 创建一个路由对象, 当 导入 vue-router 包之后,在 window 全局对象中,就有了一个 路由的构造函数,叫做 VueRouter
// 在 new 路由对象的时候,可以为 构造函数,传递一个配置对象
var routerObj = new VueRouter({
// route // 这个配置对象中的 route 表示 【路由匹配规则】 的意思
routes: [ // 路由匹配规则
// 每个路由规则,都是一个对象,这个规则对象,身上,有两个必须的属性:
// 属性1 是 path, 表示监听 哪个路由链接地址;
// 属性2 是 component, 表示,如果 路由是前面匹配到的 path ,则展示 component 属性对应的那个组件
// 注意: component 的属性值,必须是一个 组件的模板对象, 不能是 组件的引用名称;
// { path: '/', component: login },
{ path: '/', redirect: '/login' }, // 这里的 redirect 和 Node 中的 redirect 完全是两码事
{ path: '/login', component: login },
{ path: '/register', component: register }
],
linkActiveClass: 'myactive'
})
// 创建 Vue 实例,得到 ViewModel
var vm = new Vue({
el: '#app',
data: {},
methods: {},
router: routerObj // 将路由规则对象,注册到 vm 实例上,用来监听 URL 地址的变化,然后展示对应的组件
});
</script>
</body>
</html>