Vue学习:路由
- 后端路由:对于普通的网站,所有的超链接都是URL地址,所有的URL地址都对应服务器上对应的资源
- 前端路由:对于单页面应用程序来说,主要通过URL中的hash(#号)来实现不同页面之间的切换,同时,hash有一个特点:HTTP请求中不会包含hash相关的内容;所以,单页面程序中的页面跳转主要用hash实现
- 在单页面应用程序中,这种通过hash改变来切换页面的方式,称作前端路由(区别于后端路由)
二、路由的入门
<style>
/* 路由按钮高亮 第一种 不需要注册linkActiveClass*/
/* .router-link-active {
color: red;
font-weight: 800;
font-style: italic;
font-size: 80px;
text-decoration: underline;
background-color: green;
} */
/* 第二种 */
.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>
<body>
<!-- vue里面的路由基于hash的,不能用斜线(相当于调转到一个真实的页面) 前面需要加上# -->
<!-- <a href="#/login">登录</a>
<a href="#/register">注册</a> -->
<div id="app">
<!-- router-link 默认渲染为一个a 标签 tag="span"渲染成一个span标签,但是永远还是会绑定一个点击事件-->
<router-link to="/login" tag="span">登录</router-link>
<router-link to="/register">注册</router-link>
<!-- vue提供的过度模式mode="out-in" -->
<transition mode="out-in">
<!-- 这是 vue-router提供的元素,专门用来当作占位符的,将来路由规则匹配到的组件,就会展示到这个router-view中去 -->
<router-view></router-view>
</transition>
</div>
<script>
//创建组件
var login = {
template: '<h3>这是登陆的组件</h3>'
}
var register = {
template: '<h3>注册组件</h3>'
}![](https://img2018.cnblogs.com/blog/1449832/201905/1449832-20190512211311339-2130357793.png)
//创建一个路由对象
var routerObj = new VueRouter({
//路由匹配规则
// 每个路由规则,都是一个对象,这个规则对象,身上,有两个必须的属性:
// 属性1 是 path, 表示监听 哪个路由链接地址;
// 属性2 是 component, 表示如果路由是前面匹配到的path,则展示component属性对应的那个组件。component 的属性值必须是一个组件的模板对象,不能是组件的引用名称;
routes: [
//默认初始加载某个组件 转发
{ path: '/', redirect: '/login' },
{ path: '/login', component: login },
{ path: '/register', component: register }
],
// 高亮路由
linkActiveClass: 'myactive'
});
var vm = new Vue({
el: '#app',
// 将路由规则对象,注册到 vm 实例上,用来监听 URL 地址的变化,然后展示对应的组件
router: routerObj
})
</script>
</body>
三、路由传参
<body>
<div id="app">
<!-- 如果在路由中,通过地址栏给路由传递参数,则不需要修改路由规则的path属性 -->
<router-link to="/login?id=10&name=张三">登陆</router-link>
<router-link to="/register">注册</router-link>
<router-view></router-view>
</div>
<script>
var login = {
template: '<h1>登录---{{$route.query.id}} ---{{$route.query.name}}</h1>',
//data和methods已经初始化成功
created() {
//获取路由的参数
console.log(this.$route)
console.log("我是组件路由上面的参数:" + this.$route.query.id);
}
}
var register = {
template: '<h1>注册</h1>'
}
var router = new VueRouter({
routes: [
{ path: '/login', component: login },
{ path: '/register', component: register }
]
})
var vm = new Vue({
el: '#app',
// router: router //属性名和属性值一样可以简化
router
})
</script>
</body>
可以将地址栏传参修改一下
<router-link to="/login/10/张三">登陆</router-link>
var login = {
template: '<h1>登录--{{$route.params.id}}---{{$route.params.name}}</h1>',
created() {
console.log(this.$route);
console.log("我是通过正则表达式匹配到的值:" + this.$route.params.id);
}
}
{ path: '/login/:id/:name', component: login },
四、路由的嵌套
<body>
<div id="app">
<router-link to="/test">路由嵌套</router-link>
<router-view></router-view>
</div>
<template id="test">
<div>
<h1>下面开始嵌套路由</h1>
<router-link to="/test/login">登录</router-link>
<router-link to="/test/register">注册</router-link>
<router-view></router-view>
</div>
</template>
<script>
var test = {
template: '#test'
}
var login = {
template: '<h3>登录</h3>'
}
var register = {
template: '<h3>注册</h3>'
}
var router = new VueRouter({
routes: [
{
path: '/test',
component: test,
// 使用children属性,实现子路由同时,子路由的path前面不要带/ ,会自动加上面的路由地址
children: [
{ path: 'login', component: login },
{ path: 'register', component: register }
]
}
]
})
var vm = new Vue({
el: '#app',
router
})
</script>
</body>
五、使用命名视图
<style>
html,
body {
margin: 0;
padding: 0;
}
.header {
background-color: orange;
height: 80px;
}
h1 {
margin: 0;
padding: 0;
font-size: 16px;
}
.container {
display: flex;
height: 600px;
}
.left {
background-color: lightgreen;
flex: 2;
}
.main {
background-color: lightpink;
flex: 8;
}
</style>
<body>
<div id="app">
<router-view></router-view>
<div class="container">
<router-view name="left"></router-view>
<router-view name="main"></router-view>
</div>
</div>
<script>
var header = {
template: '<h1 class="header">Header头部区域</h1>'
}
var leftBox = {
template: '<h1 class="left">Left侧边栏区域</h1>'
}
var mainBox = {
template: '<h1 class="main">mainBox主体区域</h1>'
}
var router = new VueRouter({
routes: [
// { path: "/", component: header },
// { path: "/left", component: leftBox },
// { path: "/main", component: mainBox }
{
path: '/', components: {
'default': header,
'left': leftBox,
'main': mainBox
}
}
]
})
var vm = new Vue({
el: '#app',
router
})
</script>
</body>