我们可以使用vue-router
来实现路由,通过vue.js + vue-router
可以实现SPA
(单一页面应用程序),即可以根据不同的url
地址请求在一个页面上呈现出不同的效果。详见vue2.0
当中vue-router
的 使用说明文档 。
1、下载及引包
在此我们同样通过bower
来进行下载vue-router
。我们在项目文件夹的目录下,打开cmd
,键入命令-> bower install vue-router
,下载完成之后,再通过<script src="bower_components/vue-router/dist/vue-router.min.js"></script>
来完成引入。
2、完成页面布局(html部分)
我们在页面布局当中使用<router-link>
标签来实现路由导航,通过传入to
属性来指定链接,如写为<router-link to="/home">主页</router-link>
。当我们完成完整的配置路由项的代码后,加载页面审查元素可以发现,上述标签对会被渲染为<a href="#/home">主页</a>
,即当用户点击该a
标签时,页面上对应的url
地址由index.html
变为index.html#/home
。然后我们在安排路由展示的区域使用固定的标签对<router-view></router-view>
来占位。当页面请求不同的url
地址时,会根据我们的配置的路由项,把router-view
替换成对应的组件在路由展示区域进行展示。
3、配置路由项
我们先在与var vm = new Vue({});
实例并列的上方定义两个全局的组件对象Home
和News
。(组件名的首字母一般都大写)如下所示:
var Home = {
template:'<h2>主页页面内容</h2>'
};
var News = {
template:'<h2>新闻页面内容</h2>'
};
然后同样在全局范围内进行路由的配置,我们在routes
对应的数组当中,放置多个对象,每一个对象对应着一条路由信息。示例代码如下所示:
const routes = [
{path:'/home',component:Home},
{path:'/news',component:News}
];
即我们点击主页这个
a
标签时,在当前的index.html
页面下对应的url地址变为index.html#/home
,此时路由展示区域的标签对<router-view></router-view>
会被替换为Home
这个组件。
接下去在全局范围内使用VueRouter
来生成路由实例,使用变量router
来接收。示例代码如下所示:
const router = new VueRouter({
routes:routes
});
等价于
const router = new VueRouter({
routes
});
最后在var vm = new Vue({});
这个vue
实例上,把刚刚生成的router
这个路由实例挂载上去。示例代码如下所示:
var vm = new Vue({
el:'#box',
router:router
});
等价写法为:
var vm = new Vue({
el:'#box',
router
});
我们可以在配置路由信息的数组最后加上一条
{path:'*',redirect:'/home'}
即当之前所有的路由项都匹配不上时,则匹配上这条路由,页面重定向,等价于路径为'/home'
,在路由展示区域同样显示Home
这个组件。
完整的示例代码如下所示:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title></title>
<script src="bower_components/vue/dist/vue.js"></script>
<script src="bower_components/vue-router/dist/vue-router.min.js"></script>
<style>
.router-link-active{
color:#f40;
}
</style>
<script>
window.onload = function(){
var Home = {
template:'<h2>主页页面内容</h2>'
};
var News = {
template:'<h2>新闻页面内容</h2>'
};
const routes = [
{path:'/home',component:Home},
{path:'/news',component:News},
{path:'*',component:Home}
];
const router = new VueRouter({
routes
});
var vm = new Vue({
el:'#box',
router
});
};
</script>
</head>
<body>
<div id="box">
<router-link to="/home">主页</router-link>
<router-link to="/news">新闻</router-link>
<div>
<router-view></router-view>
</div>
</div>
</body>
</html>
当页面加载完成后,显示为:
当点击新闻这个链接时,显示的页面为:
4、嵌套路由的设置
我们可以在News
这个组件的template
模板当中再加入<router-link>
路由导航与<router-view>
路由展示区域。然后再在/news
这条路由配置对象当中的children
这个数组当中配置上的所有的子路由项。示例代码如下所示:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title></title>
<script src="bower_components/vue/dist/vue.js"></script>
<script src="bower_components/vue-router/dist/vue-router.min.js"></script>
<style>
.router-link-active{
color:#f40;
}
</style>
<script>
window.onload = function(){
var Home = {
template:'<h2>主页页面内容</h2>'
};
var News = {
template:'#aaa'
};
var Event = {
template:'<p>今日新闻</p>'
}
const routes = [
{path:'/home',component:Home},
{path:'/news',component:News,children:[
{path:'event',component:Event}
]},
{path:'*',component:Home}
];
const router = new VueRouter({
routes
});
var vm = new Vue({
el:'#box',
router
});
};
</script>
</head>
<body>
<div id="box">
<router-link to="/home">主页</router-link>
<router-link to="/news">新闻</router-link>
<div>
<router-view></router-view>
</div>
</div>
<template id="aaa">
<div>
<h2>新闻页面内容</h2>
<router-link to="/news/event">某条新闻</router-link>
<div>
<router-view></router-view>
</div>
</div>
</template>
</body>
</html>
当我们在主页面当中点击新闻链接时,显示的页面为:
当我们继续在该页面路径下点击某条新闻这一链接时,显示的页面为:
5、获取路由路径当中的参数
示例代码如下所示:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title></title>
<script src="bower_components/vue/dist/vue.js"></script>
<script src="bower_components/vue-router/dist/vue-router.min.js"></script>
<style>
.router-link-active{
color:#f40;
}
</style>
<script>
window.onload = function(){
var Home = {
template:'<h2>主页页面内容</h2>'
};
var News = {
template:'#aaa'
};
var Event = {
template:'#bbb'
}
const routes = [
{path:'/home',component:Home},
{path:'/news',component:News,children:[
{path:'event/:address/date/:number',component:Event}
]},
{path:'*',component:Home}
];
const router = new VueRouter({
routes
});
var vm = new Vue({
el:'#box',
router
});
};
</script>
</head>
<body>
<div id="box">
<router-link to="/home">主页</router-link>
<router-link to="/news">新闻</router-link>
<div>
<router-view></router-view>
</div>
</div>
<template id="aaa">
<div>
<h2>新闻页面内容</h2>
<router-link to="/news/event/zhejiang/date/10">浙江新闻</router-link>
<router-link to="/news/event/chongqin/date/20">重庆新闻</router-link>
<div>
<router-view></router-view>
</div>
</div>
</template>
<template id="bbb">
<div>
<h3>{{$route.params}}</h3>
<h4>{{$route.params.address}}</h4>
<h4>{{$route.params.number}}</h4>
</div>
</template>
</body>
</html>
当我们点击新闻链接时,显示的页面为:
在此新闻的页面下点击浙江新闻的链接,则在路由展示区域可以显示出该路由路径当中的相关参数,如下图所示:
同理当在该页面下点击重庆新闻链接时,页面效果为:
6、路由实例的两个方法
之前在配置路由项的过程中,我们在全局范围内使用VueRouter
来生成路由实例,并使用变量router
来接收,之后我们再在var vm = new Vue({});
这个vue
实例上,把刚刚生成的router
这个路由实例挂载上去。下面介绍的这两个路由实例的方法一般在vue
实例内部的methods
当中进行声明使用。
其中router.push({path:'/home'});
意为向历史记录当中添加一条路由地址记录,表现为切换路由,即从当前路径切换至/home
这条路径上,相当于重定向。
其中router.replace({path:'/home'});
意为替换路由,也相当于重定向,但不会往历史记录当中添加记录,也不会刷新当前页面,仅仅只是替换了当前的url
地址而已。示例代码如下所示:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title></title>
<script src="bower_components/vue/dist/vue.js"></script>
<script src="bower_components/vue-router/dist/vue-router.min.js"></script>
<style>
.router-link-active{
color:#f40;
}
</style>
<script>
window.onload = function(){
var Home = {
template:'<h2>主页页面内容</h2>'
};
var News = {
template:'<h2>新闻页面内容</h2>'
};
const routes = [
{path:'/home',component:Home},
{path:'/news',component:News},
{path:'*',component:Home}
];
const router = new VueRouter({
routes
});
var vm = new Vue({
el:'#box',
router,
methods:{
push:function(){
router.push({path:'/home'});
},
replace:function(){
router.replace({path:'/home'});
}
}
});
};
</script>
</head>
<body>
<div id="box">
<router-link to="/home">主页</router-link>
<router-link to="/news">新闻</router-link>
<button @click="push">push</button>
<button @click="replace">replace</button>
<div>
<router-view></router-view>
</div>
</div>
</body>
</html>
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。