Vue路由
vue的单页面应用是基于路由和组件的,路由用于设定访问路径,并将路径和组件映射起来
路由的基本使用
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fmrC4CUU-1592221876236)(en-resource://database/632:1)]
第一步:创建组件
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>路由</title>
<script src="lib/vue-2.4.0.js"></script>
</head>
<body>
<div id="app">
</div>
</body>
<script>
var login = {
template: "<h2>我是登录组件</h2>"
}
var register = {
template: "<h2>我是注册组件</h2>"
}
new Vue({
el: "#app",
data: {
}
})
</script>
</html>
第二步:创建Router
导入:
vue-router-3.0.1.js
包
VueRouter
:创建一个VueRouter实例对象
routes
:routes中定义了路由的规则
path
:表示路由的url
redirect
:就是重定向,访问path
时,会被重定向到redirect
指定的路由
component
:表示路由要跳转的组件
router-link
:控制组件的切换,内容会被默认渲染成标签
tag
:指定router-link
被渲染成哪种标签
router-view
:相当于一个占位符,当组件进行切换时,该路由会匹配到响应的组件
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>路由</title>
<script src="./lib/vue-2.4.0.js"></script>
<script src="./lib/vue-router-3.0.1.js"></script>
</head>
<body>
<div id="app">
<router-link to="/login" tag="button">登录</router-link>
<router-link to="/register">注册</router-link>
<transition>
<router-view></router-view>
</transition>
</div>
</body>
<script>
var login = {
template: "<h2>我是登录组件</h2>"
}
var register = {
template: "<h2>我是注册组件</h2>"
}
//创建一个VueRouter实例对象
let routerObj = new VueRouter({
routes:[//定义规则
{path:'/',redirect:'login'},//path:路由的url,redirect:重定向的指定路由
{path:"/login",component:login},//component:跳转的路径
{path:"/register",component:register}
]
})
new Vue({
el: "#app",
data: {
},
router:routerObj
})
</script>
</html>
第三步:添加动画
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>路由</title>
<script src="./lib/vue-2.4.0.js"></script>
<script src="./lib/vue-router-3.0.1.js"></script>
<style>
/* v-enter 这是个时间点,是进入之前,元素的起始状态,此时还没有进入 */
/* v-leave-to 这是个时间点,是动画离开之后,元素的终止状态,此时,元素 动画已经结束了 */
.component-enter,
.component-leave-to {
opacity: 0;
transform: translateX(50px);
}
/* v-enter-active 入场动画的时间段 */
/* v-leave-active 离场动画的时间段 */
.component-enter-active,
.component-leave-active {
transition: all 0.5s ease;
}
</style>
</head>
<body>
<div id="app">
<!--
router-link : 控制组件的切换
tag : 指定被渲染成那种标签
-->
<router-link to="/login" tag="button">登录</router-link>
<router-link to="/register">注册</router-link>
<transition name="component" mode="out-in"> <!--name和mode是添加动画必须的-->
<router-view></router-view>
</transition>
</div>
</body>
<script>
var login = {
template: "<h2>我是登录组件</h2>"
}
var register = {
template: "<h2>我是注册组件</h2>"
}
//创建一个VueRouter实例对象
let routerObj = new VueRouter({
routes: [//定义规则
{ path: '/', redirect: 'login' },//path:路由的url,redirect:重定向的指定路由
{ path: "/login", component: login },//component:跳转的路径
{ path: "/register", component: register }
]
})
new Vue({
el: "#app",
data: {
},
router: routerObj
})
</script>
</html>
路由传参
方法一:直接在url路径后面./login?id=xx&name=xx
方法二:使用restful风格:./login/id/name
this.$route
:获取路由对象
query
:适用于?后面拼接的参数params
:适用于/
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>路由</title>
<script src="./lib/vue-2.4.0.js"></script>
<script src="./lib/vue-router-3.0.1.js"></script>
<style>
/* v-enter 这是个时间点,是进入之前,元素的起始状态,此时还没有进入 */
/* v-leave-to 这是个时间点,是动画离开之后,元素的终止状态,此时,元素 动画已经结束了 */
.component-enter,
.component-leave-to {
opacity: 0;
transform: translateX(50px);
}
/* v-enter-active 入场动画的时间段 */
/* v-leave-active 离场动画的时间段 */
.component-enter-active,
.component-leave-active {
transition: all 0.5s ease;
}
</style>
</head>
<body>
<div id="app">
<!--
router-link : 控制组件的切换
tag : 指定被渲染成那种标签
-->
<router-link to="/login?id=123&name=曹青稳" tag="button">登录</router-link>
<router-link to="/register/456/周园园">注册</router-link>
<transition name="component" mode="out-in"> <!--name和mode是添加动画必须的-->
<router-view></router-view>
</transition>
</div>
</body>
<script>
var login = {
template: "<h2>我是登录组件{{this.$route.query.id}}-----{{this.$route.query.name}}</h2>"
}
var register = {
template: "<h2>我是注册组件{{this.$route.params.id}}-----{{this.$route.params.name}}</h2>"
}
//创建一个VueRouter实例对象
let routerObj = new VueRouter({
routes: [//定义规则
{ path: '/', redirect: 'login' },//path:路由的url,redirect:重定向的指定路由
{ path: "/login", component: login },//component:跳转的路径
{ path: "/register/:id/:name", component: register }
]
})
new Vue({
el: "#app",
data: {
},
router: routerObj
})
</script>
</html>
路由嵌套
坑1:
坑2:微信登录
- 之间要写微信登录
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>路由嵌套</title>
<script src="./lib/vue-2.4.0.js"></script>
<script src="./lib/vue-router-3.0.1.js"></script>
<!--vue-router引用要在Vue引用之后-->
</head>
<body>
<div id="app">
<router-link to="/login" tag="button">登录</router-link>
<transition>
<router-view></router-view>
</transition>
</div>
<template id="login">
<div>
<router-link to="/login/dengweixin">微信登录</router-link>
<router-link to="/login/dengzhanghao">账号登录</router-link>
<router-view></router-view>
</div>
</template>
</body>
<script>
var login = {
template: "#login"
}
var weixin = {
template: "<h2>微信登录</h2>"
}
var zhanghao = {
template: "<h2>账号登录</h2>"
}
let routerObj = new VueRouter({
routes: [
{ path: '/', redirect: '/login' },
{
path: '/login',
component: login,
// children属性用于指定子路由,通过子路由可以实现路由的嵌套.
// 里面定义的内容和外面没有区别
children: [
{ path: 'dengweixin', component: weixin },
{ path: 'dengzhanghao', component: zhanghao }
]
}
]
})
new Vue({
el: "#app",
data: {
},
router: routerObj
})
</script>
</html>