这篇文章继承上一篇继续学习 Vue 的路由。
参考: Vue Router 官方文档 https://router.vuejs.org/zh/guide/
上一篇文章的链接:Vue 学习(三)——组件 http://www.honeybee.top/articles/2018/10/09/1539073039977.html
1. 什么是路由
路由可以被区分为前端路由和后端路由,这两者之间的区别:
后端路由:以前都是用超链接作为 URL 地址,所有的 URL 地址也相对应服务器上的资源。
前端路由:不同于后端路由,对于单页面的应用程序来说,主要通过 URL 中的 hash(#号)来实现不同页面之间的切换,而且 hash 有一个特点:http 请求中不会包含 hash 相关的内容,所以单页面程序中的跳转主要用 hash 实现。
2. 安装
~NPM
npm install vue-router
如果在模块化工程中使用路由,必须要通过 Vue.use()
明确安装路由功能:
import Vue from 'vue'
import VueRouter from 'vue-router'
Vue.use(VueRouter)
注:如果使用全局的 script 标签,则无须如此 (手动安装)。因为是学习单个功能的原因,所以没有创建模块化工程,下面例子都是直接用 html 页面引入 js 来完成的。
3. 路由的基本使用
<html>
<head>
<meta charset="utf-8" />
<script src="https://cdn.bootcss.com/vue/2.5.16/vue.js"></script>
<script src="https://unpkg.com/vue-router/dist/vue-router.js"></script>
</head>
<body>
<div id="app">
<!-- 这个写法也可以,但一般使用下面的官方写法-->
<!--<a href="#/login">登录</a>--》
<!--<a href="#/register">注册</a>-->
<!-- 说到底其实router-link 默认渲染的是一个 a 标签 -->
<router-link to="/login">登录</router-link>
<router-link to="/register">注册</router-link>
<!-- 这是vue-router中的元素,用来当作占位符,路由规则匹配到的组件则会展示到这个元素中去 -->
<router-view></router-view>
</div>
<script>
//2.创建一个登录组件模板对象
var login = {
template: '<h2>登录组件</h2>'
};
//3.创建一个注册组件模板对象
var register = {
template: '<h2>注册组件</h2>'
};
//1.通过VueRouter构造函数创建一个路由对象
var routerObj = new VueRouter({
//为构造函数传递一个配置对象routes,可以放置路由匹配规则
routes: [
//每个路由匹配规则都是一个对象,这个必须有两个属性:
//属性1:path, 表示监听路由的链接地址;
//属性2: component, 表示匹配到path的地址后,则展示component属性对应的组件
//注意: component 的属性值应该是组件的 模板对象 , 而不是组件的名称
{path: '/login', component: login},
{path: '/register', component: register}
]
});
var vm = new Vue({
el: '#app',
data: {},
methods: {},
//4.将路由规则对象,注册到VM实例上,监听URL地址的变化来展示对应的组件
router: routerObj
});
</script>
</body>
</html>
~路由对应的运行结果(注意地址栏的变化):
登录组件:
注册组件:
另外需要说明的是:在引入 vue-router.js 后地址栏会自动带上 #/
,代表 hash 路由。
4. 重定向
将上面的例子修改下:让页面默认跳转到 /login
路由上,在上面例子的基础上修改
//1.通过VueRouter构造函数创建一个路由对象
var routerObj = new VueRouter({
//为构造函数传递一个配置对象routes,可以放置路由匹配规则
routes: [
//每个路由匹配规则都是一个对象,这个必须有两个属性:
//属性1:path, 表示监听路由的链接地址;
//属性2: component, 表示匹配到path的地址后,则展示component属性对应的组件
//注意: component 的属性值应该是组件的 模板对象 , 而不是组件的名称
{path: '/', redirect: '/login'}, //新增加的行
{path: '/login', component: login},
{path: '/register', component: register}
]
});
5. 路由传参方式
1) 传参方式 1:使用 query 方式传递参数
对 路由的基本使用
的例子再做改动:
<html>
<head>
<meta charset="utf-8" />
<script src="https://cdn.bootcss.com/vue/2.5.16/vue.js"></script>
<script src="https://unpkg.com/vue-router/dist/vue-router.js"></script>
</head>
<body>
<div id="app">
<!--改动1:-->
<router-link to="/login?id=1&account=admin">登录</router-link>
<router-link to="/register">注册</router-link>
<router-view></router-view>
</div>
<script>
//改动2:这里通过$route.query来获取参数
var login = {
template: '<h2>登录组件 --- {{this.$route.query.id}} --- {{$route.query.account}}</h2>'
};
var register = {
template: '<h2>注册组件</h2>'
};
var routerObj = new VueRouter({
routes: [
{path: '/login', component: login},
{path: '/register', component: register}
]
});
var vm = new Vue({
el: '#app',
data: {},
methods: {},
router: routerObj
});
</script>
</body>
</html>
login 路由的页面结果如下:
2)传参方式 2:使用 params 方式传递参数
对 路由的基本使用
的例子做改动:
<html>
<head>
<meta charset="utf-8" />
<script src="https://cdn.bootcss.com/vue/2.5.16/vue.js"></script>
<script src="https://unpkg.com/vue-router/dist/vue-router.js"></script>
</head>
<body>
<div id="app">
<!--改动3:-->
<router-link to="/login/1/admin">登录</router-link>
<router-link to="/register">注册</router-link>
<router-view></router-view>
</div>
<script>
//改动2:
var login = {
template: '<h2>登录组件 --- {{this.$route.params.id}} --- {{$route.params.account}}</h2>'
};
var register = {
template: '<h2>注册组件</h2>'
};
var routerObj = new VueRouter({
routes: [
//改动1:
{path: '/login/:id/:account', component: login},
{path: '/register', component: register}
]
});
var vm = new Vue({
el: '#app',
data: {},
methods: {},
router: routerObj
});
</script>
</body>
</html>
login 路由的页面结果如下:
6. 路由嵌套
<html>
<head>
<meta charset="utf-8" />
<script src="https://cdn.bootcss.com/vue/2.5.16/vue.js"></script>
<script src="https://unpkg.com/vue-router/dist/vue-router.js"></script>
</head>
<body>
<div id="app">
<router-link to="/account">Account</router-link>
<router-view></router-view>
</div>
<template id="account">
<div>
<h1>Account组件</h1>
<router-link to="/account/login">登录</router-link>
<router-link to="/account/register">注册</router-link>
<!-- 在account组件下面再挂载一个router-view来显示子路由-->
<router-view></router-view>
</div>
</template>
<script>
var account = {
template: '#account'
}
var login = {
template: '<h2>登录组件</h2>'
}
var register = {
template: '<h2>注册组件</h2>'
}
var routerObj = new VueRouter({
routes: [
{
path: '/account',
component: account,
//使用children属性实现子路由
//注意:子路由path路径不需要带'/', 否则会以根路径来请求
children: [
{path: 'login', component: login},
{path: 'register', component: register}
]
}
]
});
var vm = new Vue({
el: '#app',
data: {},
methods: {},
router: routerObj
});
</script>
</body>
</html>
运行结果如下:
7. 路由的命名视图
<html>
<head>
<meta charset="utf-8" />
<script src="https://cdn.bootcss.com/vue/2.5.16/vue.js"></script>
<script src="https://unpkg.com/vue-router/dist/vue-router.js"></script>
<style>
html,body {
margin: 0;
padding: 0;
}
.headerq {
background-color: deepskyblue;
height: 80px;
}
.container {
display: flex;
height: 400px;
}
h1 {
margin: 0;
padding: 0;
font-size: 20px;
}
.left {
background: lightgray;
flex: 2;
}
.main {
background: lightpink;
flex: 8;
}
</style>
</head>
<body>
<div id="app">
<router-view></router-view>
<div class="container">
<!-- 根据name属性值来显示不同的组件-->
<router-view name='left'></router-view>
<router-view name='main'></router-view>
</div>
</div>
<script>
var header = {
template: '<h1 class="headerq">Header头部区域</h1>'
}
var leftBox = {
template: '<h1 class="left">left侧边栏区域</h1>'
}
var mainBox = {
template: '<h1 class="main">main区域</h1>'
}
//创建路由对象
var routerObj = new VueRouter({
routes: [
{
path: '/',
//components属性可以挂载多个组件,并且命名,默认为default
components: {
'default': header,
'left': leftBox,
'main': mainBox
}
},
]
})
var vm = new Vue({
el: '#app',
data: {},
methods: {},
router: routerObj
});
</script>
</body>
</html>
运行结果如下:
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于