上一篇Vue.js(三)主要学习了Vue组件的基本知识,这节主要是学习一下Vue路由
<script src="lib/vue-2.4.0.js">script>
<script src="lib/vue-router-3.0.1.js">script>
var router = new VueRouter({
routes: [
{ path: '/login', component: login },
{ path: '/register', component: register }
]
});
var vm = new Vue({
el: '#app',
data: {},
methods: {},
router: routerObj
<router-view>router-view>
<router-link to="/login">登录router-link>
<router-link to="/register">注册router-link>
以下是第一种办法,可以用,但是不推荐
{ path: '/', component: login},
这是第二种办法,借用redirect
var router = new VueRouter({
routes: [
{ path: '/', redirect: '/login' },
{ path: '/login', component: login },
{ path: '/register', component: register }
]
});
router-link-active
class样式,我们可以修改他,来设置我们的样式第一种:
.router-link-active{
color: red;
font-weight: 800;
font-style: italic;
font-size: 80px;
text-decoration: underline;
}
第二种:
var router = new VueRouter({
routes: [
{ path: '/', redirect: '/login' },
{ path: '/login', component: login },
{ path: '/register', component: register }
],
linkActiveClass:'myActive'
});
.myactive {
color: red;
font-weight: 800;
font-style: italic;
font-size: 80px;
text-decoration: underline;
}
transition
包裹起来,再写上样式,注意加mode<style>
.v-enter,
.v-leave-to {
opacity: 0;
transform: translateX(140px);
}
.v-enter-active,
.v-leave-active {
transition: all 0.5s ease;
}
style>
<transition mode="out-in">
<router-view>router-view>
transition>
两种方式:
在模板中中,我们可以用$route.query.id
获得参数
<router-link to="/login?id=10&name=zs">登录router-link>
<script>
var com1={
template: '登录模块----{{$route.query.id}}----{{$route.query.name}}
',
created(){ // 组件的生命周期钩子函数
console.log(this.$route)
// console.log(this.$route.query.id)
}
};
script>
<router-link to="/login/12/ls">登录router-link>
<script>
var com1={
template: '登录模块----{{$route.params.id}}----{{$route.params.name}}
',
created(){ // 组件的生命周期钩子函数
console.log(this.$route)
// console.log(this.$route.query.id)
}
};
var routerObj=new VueRouter({
routes:[
{path:'/login/:id/:name',component:com1},
{path:'/register',component:com2}
],
linkActiveClass:'myactive'
});
script>
实际生活中的应用界面,通常由多层嵌套的组件组合而成。同样地,URL 中各段动态路径也按某种结构对应嵌套的各层组件
应用场景:在选项卡中,顶部有数个导航栏,中间的主体显示的是内容;这个时候,整个页面是一个路由,然后点击选项卡切换不同的路由来展示不同的内容,这个时候就是路由中嵌套路由。
我们使用children属性实现路由嵌套
<div id="app">
<router-link to="/account">Accountrouter-link>
<router-view>router-view>
div>
<template id="tmpl">
<div>
<h1>这是一个Accounth1>
<router-link to="/account/login">登录router-link>
<router-link to="/account/register">注册router-link>
<router-view>router-view>
div>
template>
<script>
var com1={
template: '登录模块
'
};
var com2={
template: '注册模块
'
};
var account={
template:'#tmpl'
};
var routerObj=new VueRouter({
routes:[
// {path:'/',redirect:'/account'},
{
path:'/account',
component:account,
children:[
{path:'login',component:com1},
{path:'register',component:com2}
]
},
],
linkActiveClass:'myactive'
});
var vm=new Vue({
el:'#app',
data:{},
methods:{},
router:routerObj
})
script>
注意:1. 子路由path之前不加/
,否则永远一根路径开始请求,不方便理解URL地址 2. 在router-link中,路径要写全,写绝对路径
通过vue实现上左右经典布局
components
属性,区别于component,他可以匹配多个组件。components中提供了一个属性default
默认匹配。我们在components中定义视图名称:模板对象,通过在HTML标签中的属性name
来实现对应 <style>
*{
margin: 0;
padding: 0;
}
h1{
margin: 0;
padding: 0;
}
.headbox{
background-color: lightgreen;
height: 80px;
}
.content{
display: flex;
height: 520px;
}
.leftbox{
background-color: lightblue;
flex: 2;
}
.mainbox{
background-color: lightgoldenrodyellow;
flex: 8;
}
style>
<div id="app">
<router-view>router-view>
<div class="content">
<router-view name="left">router-view>
<router-view name="main">router-view>
div>
div>
<script>
var header={
template:'header
'
};
var leftbox={
template:'left
'
};
var mainbox={
template:'main
'
};
var router=new VueRouter({
routes:[
{path:'/',components:{
'default':header,
'left':leftbox,
'main':mainbox
}}
]
});
var vm=new Vue({
el:'#app',
data:{},
router,
methods:{}
})
script>
实现firstname+lastname=fullname
<div id="app">
<input type="text" v-model="firstname" @keyup="getFullName">+
<input type="text" v-model="lastname" @keyup="getFullName">=
<input type="text" v-model="fullname">
div>
<script>
var vm=new Vue({
el:'#app',
data:{
firstname:'',
lastname:'',
fullname:''
},
methods:{
getFullName(){
this.fullname=this.firstname+'-'+this.lastname;
}
}
})
script>
<div id="app">
<input type="text" v-model="firstname">+
<input type="text" v-model="lastname">=
<input type="text" v-model="fullname">
div>
<script>
var vm=new Vue({
el:'#app',
data:{
firstname:'',
lastname:'',
fullname:''
},
methods:{},
watch:{
firstname(nVaule){
this.fullname=nVaule+'-'+this.lastname;
},
'lastname'(nVaule){
this.fullname=this.firstname+'-'+nVaule;
}
}
})
script>
<div id="app">
<input type="text" v-model="firstname">+
<input type="text" v-model="lastname">=
<input type="text" v-model="fullname">
<p>{{fullname}}p>
<p>{{fullname}}p>
<p>{{fullname}}p>
div>
<script>
var vm=new Vue({
el:'#app',
data:{
firstname:'',
lastname:'',
},
methods:{},
computed:{
'fullname':function () {
console.log("ok");
return this.firstname+'-'+this.lastname
}
}
})
script>
watch适合监听非DOM元素事件(虚拟的)
以下就是借助$route.path监听路由地址的改变
<style>
.v-enter,
.v-leave-to {
opacity: 0;
transform: translateX(140px);
}
.v-enter-active,
.v-leave-active {
transition: all 0.5s ease;
}
style>
<body>
<div id="app">
<router-link to="/login" tag="span">登录router-link>
<router-link to="/register">注册router-link>
<transition mode="out-in">
<router-view>router-view>
transition>
div>
body>
<script>
var login = {
template: '登录组件
'
};
var register = {
template: '注册组件
'
};
var routerObj = new VueRouter({
routes: [
{ path: '/login', component: login },
{ path: '/register', component: register }
]
});
var vm=new Vue({
el:'#app',
data:{},
methods:{},
watch:{
'$route.path'(nValue){
if (nValue==='/login'){
console.log('欢迎来到登录页面')
} else if (nValue==='/register') {
console.log('欢迎来到注册页面');
}
}
},
router: routerObj
})
script>
()
,直接把它当作属性使用