先介紹一下bower包管理器
npm install bower -g(全局安裝)
npm install bower (安裝到當(dāng)前文件夾)
bower -version(獲取bower的版本號(hào))
bower install <包名>(安裝)
bower uninstall <包名>(卸載)
bower info <包名>(獲取包名的所有版本號(hào))
$ bower install vue#1.0.28
//下載1.0.28版本的vue
vue動(dòng)畫
<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>
點(diǎn)擊按鈕,紅色方塊向右移動(dòng)200px并逐漸透明化
再點(diǎn)擊按鈕,則在一開始的位置出現(xiàn)
vue動(dòng)畫的實(shí)現(xiàn)原理是:CSS3的transition、transform
在標(biāo)簽上增加transition="fade"屬性
.fade-transition樣式里寫入transition屬性
.fade-enter樣式里寫入出現(xiàn)動(dòng)畫
.fade-leave樣式里寫入消失動(dòng)畫
animate.css官網(wǎng)
bower install animate.css
里面封裝了許多動(dòng)畫樣式
<link rel="stylesheet" href="bower_components/animate.css/animate.css">
引入animate.css文件
<div id="div1" class="animated" v-show="bSign" transition="bounce"></div>
標(biāo)簽寫入class="animated" transition="動(dòng)畫名稱"屬性
transitions:{ //定義所有動(dòng)畫名稱
bounce:{
enterClass:'zoomInLeft',
leaveClass:'zoomOutRight'
}
}
設(shè)置動(dòng)畫名稱bounce的進(jìn)入動(dòng)畫enterClass和離開動(dòng)畫leaveClass
vue自定義組件
全局組件
HTML
<div id="box">
<aaa></aaa>
</div>
javascript
var Aaa=Vue.extend({
template:'<h3>我是標(biāo)題3</h3>'
});
Vue.component('aaa',Aaa);
var vm=new Vue({
el:'#box'
});
等同
javascript
Vue.component('aaa',{
template:'<h3>我是標(biāo)題3</h3>'
});
效果

全局組件可以在任意掛載目標(biāo)里使用
局部組件
HTML
<div id="box">
<aaa></aaa>
</div>
javascript
var Aaa=Vue.extend({//組件對(duì)象
template:'<h3>{{msg}}</h3>',
data(){
return {msg:'我是標(biāo)題3'}
}
});
var vm=new Vue({
el:'#box',
components:{ //局部組件
aaa:Aaa
}
});
等同
javascript
var vm=new Vue({
el:'#box',
components:{//定義多個(gè)組件
'aaa':{//組件對(duì)象
data(){
return {msg:'我是標(biāo)題3'}
},
template:'<h3>{{msg}}</h3>'
}
}
});
組件是一個(gè)對(duì)象,
用ES6語法聲明的data函數(shù)返回?cái)?shù)據(jù)對(duì)象的屬性msg,
用template屬性定義模板
效果

組件模板
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:'我是標(biāo)題3'}
},
template:'#aaa'
}
}
});
</script>
模板是HTML標(biāo)簽字符串
template的屬性值是選擇器,選擇器匹配的標(biāo)簽就是模板
等同
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:'我是標(biāo)題3',
arr:['apple','banana','orange']
}
},
template:'#aaa'
}
}
});
</script>
動(dòng)態(tài)組件
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>

點(diǎn)擊“bbb組件”按鈕之后,下面的內(nèi)容變成“我是bbb組件”
<component :is="組件名"><component>
組件名可以是變量,當(dāng)點(diǎn)擊按鈕之后,這個(gè)組件名的值會(huì)變化
父子組件
父組件傳數(shù)據(jù)給子組件
<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屬性對(duì)象里,屬性即是組件名
組件名屬性對(duì)象里,template屬性對(duì)象放入模板,
components屬性則是子組件集合對(duì)象,里面放入子組件名屬性,
依次類推,可以多層嵌套
父組件data屬性函數(shù)的數(shù)據(jù)對(duì)象,傳遞給子組件的模板
components:{
'aaa':{
data(){
return {
msg:'我是父組件的數(shù)據(jù)'
}
},
template:'<h2>我是aaa組件</h2><bbb></bbb>',
components:{
'bbb':{
template:'<h3>我是bbb組件->{{msg}}</h3>'
}
}
}
}
data屬性返回的是一個(gè)對(duì)象,對(duì)象里面的屬性即是數(shù)據(jù),可以在它自身模板,或子組件的模板里使用,這樣就完成父組件對(duì)子組件的數(shù)據(jù)傳遞
父組件的data屬性函數(shù)的數(shù)據(jù)對(duì)象,傳遞給子組件自定義的屬性
<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:'我是父組件的數(shù)據(jù)'
}
},
template:'#aaa',
components:{
'bbb':{
props:['mmm'],
template:'<h3>我是bbb組件->{{mmm}}</h3>'
}
}
}
}
});
</script>
數(shù)據(jù)在在父組件上,
傳遞給父組件的模板,
子組件自定義了屬性mmm,
數(shù)據(jù)傳給子組件名的mmm屬性,
子組件模板直接從mmm屬性獲取給傳遞的數(shù)據(jù)
自定義屬性props是數(shù)組
<bbb :mmm="msg2" :my-msg="msg"></bbb>
data(){
return {
msg:111,
msg2:'我是父組件的數(shù)據(jù)'
}
},
bbb':{
props:['mmm','myMsg'],
template:'<h3>我是bbb組件->{{mmm}} <br> {{myMsg}}</h3>'
}
自定義屬性props是對(duì)象,規(guī)定接受的數(shù)據(jù)類型
components:{
'bbb':{
props:{
'mmm':String,
'myMsg':Number
},
template:'<h3>我是bbb組件->{{mmm}} <br> {{myMsg}}</h3>'
}
}
子組件傳數(shù)據(jù)給父組件
$emit
<div id="box">
<aaa>
</aaa>
</div>
<template id="aaa">
<span>我是父級(jí) -> {{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:'我是子組件的數(shù)據(jù)'
}
},
template:'#bbb',
methods:{
send(){
this.$emit('child-msg',this.a);
}
}
}
}
}
}
});
</script>
點(diǎn)擊子組件按鈕,觸發(fā)send方法函數(shù),
this.$emit子組件發(fā)送數(shù)據(jù)this.a給自定義事件child-msg,
父組件觸發(fā)自定義事件child-msg接收數(shù)據(jù),調(diào)用get方法函數(shù),
get方法函數(shù)接收數(shù)據(jù),改變父組件的數(shù)據(jù)msg


slot—組件中的標(biāo)簽
插入標(biāo)簽組件化
<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>這是默認(rèn)的情況</slot>
<p>welcome vue</p>
</template>
<script>
var vm=new Vue({
el:'#box',
data:{
a:'aaa'
},
components:{
'aaa':{
template:'#aaa'
}
}
});
</script>
一對(duì)slot標(biāo)簽,表示插入組件的HTML標(biāo)簽,
如果組件里沒有插入的HTML標(biāo)簽,即slot標(biāo)簽無效時(shí),則slot標(biāo)簽里的數(shù)據(jù)才會(huì)顯示

插入標(biāo)簽組件化的分類
<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">這是默認(rèn)的情況</slot>
<p>welcome vue</p>
<slot name="ul-slot">這是默認(rèn)的情況2</slot>
</template>
slot標(biāo)簽的name屬性,將出入的HTML標(biāo)簽的頂部標(biāo)簽分類,
標(biāo)頂部簽的slot屬性與之對(duì)應(yīng),
插入標(biāo)簽實(shí)際渲染的位置與模板里slot標(biāo)簽的位置有關(guān),與組件里的位置無關(guān)

路由
嵌入路由插件vue-router
<script src="bower_components/vue-router/dist/vue-router.js"></script>
單層組件路由
基本的路由實(shí)例
<div id="box">
<ul>
<li>
<a v-link="{path:'/home'}">主頁</a>
</li>
<li>
<a v-link="{path:'/news'}">新聞</a>
</li>
</ul>
//相當(dāng)于兩個(gè)鏈接
<div>
<router-view></router-view>
</div>
//鏈接拿到的數(shù)據(jù)插入到HTML文檔中的位置
</div>
<script>
//1. 準(zhǔn)備一個(gè)根組件,包含鏈接和鏈接數(shù)據(jù)存放的位置
var App=Vue.extend();
//2. Home News組件都準(zhǔn)備,鏈接數(shù)據(jù)
var Home=Vue.extend({
template:'<h3>我是主頁</h3>'
});
var News=Vue.extend({
template:'<h3>我是新聞</h3>'
});
//3. 準(zhǔn)備路由,路由實(shí)例
var router=new VueRouter();
//4. 關(guān)聯(lián),判斷鏈接路徑,給出響應(yīng)的數(shù)據(jù),
//參數(shù)是一個(gè)鏈接路徑對(duì)象,屬性是鏈接的路徑,對(duì)應(yīng)鏈接的屬性是對(duì)應(yīng)的組件屬性
router.map({
'home':{
component:Home
},
'news':{
component:News
}
});
//5. 啟動(dòng)路由,并綁定鏈接的整個(gè)區(qū)域范圍
router.start(App,'#box');
</script>

默認(rèn)路徑獲取的組件數(shù)據(jù)
//6. 跳轉(zhuǎn)
router.redirect({
'/':'/home'
});
URL不輸入路徑時(shí),默認(rèn)鏈接的組件
多層組件路由
<style>
//vue鏈接激活狀態(tài)的樣式
.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'}">注冊(cè)</a>
</div>
//子路由組件數(shù)據(jù)存放區(qū)域
<div>
<router-view></router-view>
</div>
</template>
<template id="news">
<h3>我是新聞</h3>
</template>
<script>
//1. 準(zhǔn)備一個(gè)根組件
var App=Vue.extend();
//2. Home News組件都準(zhǔn)備
var Home=Vue.extend({
template:'#home'
});
var News=Vue.extend({
template:'#news'
});
//3. 準(zhǔn)備路由
var router=new VueRouter();
//4. 關(guān)聯(lián),路由
router.map({
//路由路徑
'home':{
component:Home,
//關(guān)聯(lián)呢,子路由
subRoutes:{
//子路由鏈接
'login':{
component:{
template:'<strong>我是登錄信息</strong>'
}
},
'reg':{
component:{
template:'<strong>我是注冊(cè)信息</strong>'
}
}
}
},
'news':{
component:News
}
});
//5. 啟動(dòng)路由
router.start(App,'#box');
//6. 跳轉(zhuǎn)
router.redirect({
'/':'home'
});
</script>

新增news的子組件路由
news模板中的子鏈接,以及路由組件存放區(qū)域,
以及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>
準(zhǔn)備子組件Detail
var Detail=Vue.extend({
template:'#detail'
});
父組件路由News,以及自組件路由Detail
'news':{
component:News,
subRoutes:{
//將路徑對(duì)應(yīng)位置的參數(shù)賦值給屬性id
'/detail/:id':{
component:Detail
}
}
}

獲取激活的鏈接路徑,并匹配參數(shù)對(duì)象
<template id="detail">
//參數(shù)對(duì)象
{{$route.params | json}}
<br>
//激活的鏈接路徑
{{$route.path}}
<br>
{{$route.query | json}}
</template>

zns登錄和strive注冊(cè)
<template id="home">
<h3>我是主頁</h3>
<div>
<a v-link="{path:'/home/login/zns'}">登錄</a>
<a v-link="{path:'/home/reg/strive'}">注冊(cè)</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>我是注冊(cè)信息</strong>'
}
}
}
},
