适合初学者的Vue-1.0教程(四)
先介绍一下bower包管理器
npm install bower -g(全局安装)
npm install bower (安装到当前文件夹)
bower -version(获取bower的版本号)
bower install <包名>(安装)
bower uninstall <包名>(卸载)
bower info <包名>(获取包名的所有版本号)
$ bower install vue#1.0.28
//下载1.0.28版本的vue
vue动画
<style>
#div1{
width:100px;
height:100px;
background: red;
}
.fade-transition{
transition: 1s all ease;
}
.fade-enter{
opacity: 0;
}
.fade-leave{
opacity: 0;
transform: translateX(200px);
}
</style>
<div id="box">
<input type="button" value="按钮" @click="toggle">
<div id="div1" v-show="bSign" transition="fade"></div>
</div>
<script>
new Vue({
el:'#box',
data:{bSign:true},
methods:{
toggle(){this.bSign=!this.bSign;}
}
});
</script>
点击按钮,红色方块向右移动200px并逐渐透明化
再点击按钮,则在一开始的位置出现
vue动画的实现原理是:CSS3的transition、transform
在标签上增加transition="fade"属性
.fade-transition样式里写入transition属性
.fade-enter样式里写入出现动画
.fade-leave样式里写入消失动画
animate.css官网
bower install animate.css
里面封装了许多动画样式
<link rel="stylesheet" href="bower_components/animate.css/animate.css">
引入animate.css文件
<div id="div1" class="animated" v-show="bSign" transition="bounce"></div>
标签写入class="animated" transition="动画名称"
属性
transitions:{ //定义所有动画名称
bounce:{
enterClass:'zoomInLeft',
leaveClass:'zoomOutRight'
}
}
设置动画名称bounce的进入动画enterClass和离开动画leaveClass
vue自定义组件
全局组件
HTML
<div id="box">
<aaa></aaa>
</div>
javascript
var Aaa=Vue.extend({
template:'<h3>我是标题3</h3>'
});
Vue.component('aaa',Aaa);
var vm=new Vue({
el:'#box'
});
等同
javascript
Vue.component('aaa',{
template:'<h3>我是标题3</h3>'
});
效果
image.png
全局组件可以在任意挂载目标里使用
局部组件
HTML
<div id="box">
<aaa></aaa>
</div>
javascript
var Aaa=Vue.extend({//组件对象
template:'<h3>{{msg}}</h3>',
data(){
return {msg:'我是标题3'}
}
});
var vm=new Vue({
el:'#box',
components:{ //局部组件
aaa:Aaa
}
});
等同
javascript
var vm=new Vue({
el:'#box',
components:{//定义多个组件
'aaa':{//组件对象
data(){
return {msg:'我是标题3'}
},
template:'<h3>{{msg}}</h3>'
}
}
});
组件是一个对象,
用ES6语法声明的data函数返回数据对象的属性msg,
用template属性定义模板
效果
image.png
组件模板
HTML
<div id="box">
<aaa></aaa>
</div>
x-template--自定义组件模板
<script type="x-template" id="aaa">
<h3>{{msg}}</h3>
<ul>
<li>apple</li>
<li>banana</li>
<li>orange</li>
</ul>
</script>
javascript
<script type="text/javascript">
var vm=new Vue({
el:'#box',
components:{
'aaa':{
data(){
return {msg:'我是标题3'}
},
template:'#aaa'
}
}
});
</script>
模板是HTML标签字符串
template的属性值是选择器,选择器匹配的标签就是模板
等同
template
<template id="aaa">
<h3>{{msg}}</h3>
<ul>
<li v-for="val in arr">
{{val}}
</li>
</ul>
</template>
javascript
<script>
var vm=new Vue({
el:'#box',
components:{
'aaa':{
data(){
return {
msg:'我是标题3',
arr:['apple','banana','orange']
}
},
template:'#aaa'
}
}
});
</script>
捕获.PNG
动态组件
HTML
<div id="box">
<input type="button" @click="a='aaa'" value="aaa组件">
<input type="button" @click="a='bbb'" value="bbb组件">
<component :is="a"></component>
</div>
javascript
<script>
var vm=new Vue({
el:'#box',
data:{
a:'aaa'
},
components:{
'aaa':{
template:'<h3>我是aaa组件</h3>'
},
'bbb':{
template:'<h3>我是bbb组件</h3>'
}
}
});
</script>
image.png
点击“bbb组件”按钮之后,下面的内容变成“我是bbb组件”
<component :is="组件名"><component>
组件名可以是变量,当点击按钮之后,这个组件名的值会变化
父子组件
父组件传数据给子组件
<div id="box">
<aaa>
</aaa>
</div>
<script>
var vm=new Vue({
el:'#box',
data:{
a:'aaa'
},
components:{
'aaa':{
template:'<h2>我是aaa组件</h2><bbb></bbb>',
components:{
'bbb':{
template:'<h3>我是bbb组件</h3>'
}
}
}
}
});
</script>
components属性对象里,属性即是组件名
组件名属性对象里,template属性对象放入模板,
components属性则是子组件集合对象,里面放入子组件名属性,
依次类推,可以多层嵌套
父组件data属性函数的数据对象,传递给子组件的模板
components:{
'aaa':{
data(){
return {
msg:'我是父组件的数据'
}
},
template:'<h2>我是aaa组件</h2><bbb></bbb>',
components:{
'bbb':{
template:'<h3>我是bbb组件->{{msg}}</h3>'
}
}
}
}
data属性返回的是一个对象,对象里面的属性即是数据,可以在它自身模板,或子组件的模板里使用,这样就完成父组件对子组件的数据传递
父组件的data属性函数的数据对象,传递给子组件自定义的属性
<div id="box">
<aaa>
</aaa>
</div>
<template id="aaa">
<h1>11111</h1>
<bbb :mmm="msg2"></bbb>
</template>
<script>
var vm=new Vue({
el:'#box',
data:{
a:'aaa'
},
components:{
'aaa':{
data(){
return {
msg2:'我是父组件的数据'
}
},
template:'#aaa',
components:{
'bbb':{
props:['mmm'],
template:'<h3>我是bbb组件->{{mmm}}</h3>'
}
}
}
}
});
</script>
数据在在父组件上,
传递给父组件的模板,
子组件自定义了属性mmm,
数据传给子组件名的mmm属性,
子组件模板直接从mmm属性获取给传递的数据
自定义属性props是数组
<bbb :mmm="msg2" :my-msg="msg"></bbb>
data(){
return {
msg:111,
msg2:'我是父组件的数据'
}
},
bbb':{
props:['mmm','myMsg'],
template:'<h3>我是bbb组件->{{mmm}} <br> {{myMsg}}</h3>'
}
自定义属性props是对象,规定接受的数据类型
components:{
'bbb':{
props:{
'mmm':String,
'myMsg':Number
},
template:'<h3>我是bbb组件->{{mmm}} <br> {{myMsg}}</h3>'
}
}
子组件传数据给父组件
$emit
<div id="box">
<aaa>
</aaa>
</div>
<template id="aaa">
<span>我是父级 -> {{msg}}</span>
<bbb @child-msg="get"></bbb>
</template>
<template id="bbb">
<h3>子组件-</h3>
<input type="button" value="send" @click="send">
</template>
<script>
var vm=new Vue({
el:'#box',
data:{
a:'aaa'
},
components:{
'aaa':{
data(){
return {
msg:111
}
},
template:'#aaa',
methods:{
get(msg){
this.msg=msg;
}
},
components:{
'bbb':{
data(){
return {
a:'我是子组件的数据'
}
},
template:'#bbb',
methods:{
send(){
this.$emit('child-msg',this.a);
}
}
}
}
}
}
});
</script>
点击子组件按钮,触发send方法函数,
this.$emit
子组件发送数据this.a
给自定义事件child-msg
,
父组件触发自定义事件child-msg
接收数据,调用get
方法函数,
get
方法函数接收数据,改变父组件的数据msg
slot—组件中的标签
插入标签组件化
<div id="box">
<aaa>
<ul>
<li>1111</li>
<li>2222</li>
<li>3333</li>
</ul>
</aaa>
<hr>
<aaa>
</aaa>
</div>
<template id="aaa">
<h1>xxxx</h1>
<slot>这是默认的情况</slot>
<p>welcome vue</p>
</template>
<script>
var vm=new Vue({
el:'#box',
data:{
a:'aaa'
},
components:{
'aaa':{
template:'#aaa'
}
}
});
</script>
一对slot
标签,表示插入组件的HTML标签,
如果组件里没有插入的HTML标签,即slot
标签无效时,则slot
标签里的数据才会显示
插入标签组件化的分类
<div id="box">
<aaa>
<ul slot="ul-slot">
<li>1111</li>
<li>2222</li>
<li>3333</li>
</ul>
<ol slot="ol-slot">
<li>111</li>
<li>222</li>
<li>333</li>
</ol>
</aaa>
<hr>
<aaa>
</aaa>
</div>
<template id="aaa">
<h1>xxxx</h1>
<slot name="ol-slot">这是默认的情况</slot>
<p>welcome vue</p>
<slot name="ul-slot">这是默认的情况2</slot>
</template>
slot
标签的name
属性,将出入的HTML标签的顶部标签分类,
标顶部签的slot
属性与之对应,
插入标签实际渲染的位置与模板里slot
标签的位置有关,与组件里的位置无关
路由
嵌入路由插件vue-router
<script src="bower_components/vue-router/dist/vue-router.js"></script>
单层组件路由
基本的路由实例
<div id="box">
<ul>
<li>
<a v-link="{path:'/home'}">主页</a>
</li>
<li>
<a v-link="{path:'/news'}">新闻</a>
</li>
</ul>
//相当于两个链接
<div>
<router-view></router-view>
</div>
//链接拿到的数据插入到HTML文档中的位置
</div>
<script>
//1. 准备一个根组件,包含链接和链接数据存放的位置
var App=Vue.extend();
//2. Home News组件都准备,链接数据
var Home=Vue.extend({
template:'<h3>我是主页</h3>'
});
var News=Vue.extend({
template:'<h3>我是新闻</h3>'
});
//3. 准备路由,路由实例
var router=new VueRouter();
//4. 关联,判断链接路径,给出响应的数据,
//参数是一个链接路径对象,属性是链接的路径,对应链接的属性是对应的组件属性
router.map({
'home':{
component:Home
},
'news':{
component:News
}
});
//5. 启动路由,并绑定链接的整个区域范围
router.start(App,'#box');
</script>
image.png
默认路径获取的组件数据
//6. 跳转
router.redirect({
'/':'/home'
});
URL不输入路径时,默认链接的组件
多层组件路由
<style>
//vue链接激活状态的样式
.v-link-active{
font-size: 20px;
color: #f60;
}
</style>
<div id="box">
<ul>
<li>
<a v-link="{path:'/home'}">主页</a>
</li>
<li>
<a v-link="{path:'/news'}">新闻</a>
</li>
</ul>
<div>
<router-view></router-view>
</div>
</div>
<template id="home">
<h3>我是主页</h3>
//子路由组件,链接
<div>
<a v-link="{path:'/home/login'}">登录</a>
<a v-link="{path:'/home/reg'}">注册</a>
</div>
//子路由组件数据存放区域
<div>
<router-view></router-view>
</div>
</template>
<template id="news">
<h3>我是新闻</h3>
</template>
<script>
//1. 准备一个根组件
var App=Vue.extend();
//2. Home News组件都准备
var Home=Vue.extend({
template:'#home'
});
var News=Vue.extend({
template:'#news'
});
//3. 准备路由
var router=new VueRouter();
//4. 关联,路由
router.map({
//路由路径
'home':{
component:Home,
//关联呢,子路由
subRoutes:{
//子路由链接
'login':{
component:{
template:'<strong>我是登录信息</strong>'
}
},
'reg':{
component:{
template:'<strong>我是注册信息</strong>'
}
}
}
},
'news':{
component:News
}
});
//5. 启动路由
router.start(App,'#box');
//6. 跳转
router.redirect({
'/':'home'
});
</script>
image.png
新增news的子组件路由
news模板中的子链接,以及路由组件存放区域,
以及Detail模板
<template id="news">
<h3>我是新闻</h3>
<div>
<a v-link="{path:'/news/detail/001'}">新闻001</a>
<a v-link="{path:'/news/detail/002'}">新闻002</a>
</div>
<router-view></router-view>
</template>
<template id="detail">
{{$route.params | json}}
</template>
准备子组件Detail
var Detail=Vue.extend({
template:'#detail'
});
父组件路由News,以及自组件路由Detail
'news':{
component:News,
subRoutes:{
//将路径对应位置的参数赋值给属性id
'/detail/:id':{
component:Detail
}
}
}
image.png
获取激活的链接路径,并匹配参数对象
<template id="detail">
//参数对象
{{$route.params | json}}
<br>
//激活的链接路径
{{$route.path}}
<br>
{{$route.query | json}}
</template>
image.png
zns登录和strive注册
<template id="home">
<h3>我是主页</h3>
<div>
<a v-link="{path:'/home/login/zns'}">登录</a>
<a v-link="{path:'/home/reg/strive'}">注册</a>
</div>
<div>
<router-view></router-view>
</div>
</template>
'home':{
component:Home,
subRoutes:{
'login/:name':{
component:{
template:'<strong>我是登录信息 {{$route.params | json}}</strong>'
}
},
'reg':{
component:{
template:'<strong>我是注册信息</strong>'
}
}
}
},
image.png