## demo3.html
1. 樣式綁定
1.1 class綁定
使用方式:v-bind:class="expression"
expression的類型:字符串、數組、對象
1.2 style綁定
v-bind:style="expression"
expression的類型:字符串、數組、對象javascript
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>樣式綁定和事件處理</title> <script src="https://cdn.bootcss.com/vue/2.6.10/vue.js"></script> <style type="text/css"> .a{ color:red; } .b{ color:blue; } .c{ font-size: 60px; } /*div{ padding: 50px; }*/ </style> </head> <body> <div id="app"> <ul> <li> <h3>樣式綁定</h3> <span :class="aClz">犯我華夏</span> <span :class="bClz">雖遠必誅</span> <span :class="cClz">犯我華夏 雖遠必誅</span> </li> </ul> </div> </body> <script type="text/javascript"> //做用將Vue實例掛載到具體的邊界,那麼這個邊界就會被Vue這個漸進式的框架所管理 //注意:邊界不能有兄弟標籤,邊界必定是跟標籤 new Vue({ el:'#app', data:{ aClz:'a', bClz:'b', cClz:['b','c'], } }) </script> </html>
2. 事件處理器
事件監聽可使用v-on 指令css
## 以前已學習
2.1 事件修飾符
Vue經過由點(.)表示的指令後綴來調用修飾符,
.stop
.prevent
.capture
.self
.oncehtml
<!-- 阻止單擊事件冒泡 -->
<a v-on:click.stop="doThis"></a>
<!-- 提交事件再也不重載頁面 -->
<form v-on:submit.prevent="onSubmit"></form>
<!-- 修飾符能夠串聯 -->
<a v-on:click.stop.prevent="doThat"></a>
<!-- 只有修飾符 -->
<form v-on:submit.prevent></form>
<!-- 添加事件偵聽器時使用事件捕獲模式 -->
<div v-on:click.capture="doThis">...</div>
<!-- 只當事件在該元素自己(而不是子元素)觸發時觸發回調 -->
<div v-on:click.self="doThat">...</div>
<!-- click 事件只能點擊一次 -->
<a v-on:click.once="doThis"></a>vue
注1:什麼是事件冒泡?
見「事件冒泡模型.png」 java
## demo3.1.html
2.2 按鍵修飾符
Vue容許爲v-on在監聽鍵盤事件時添加按鍵修飾符:node
<!-- 只有在 keyCode 是 13 時調用 vm.submit() -->
<input v-on:keyup.13="submit">express
Vue爲最經常使用的按鍵提供了別名
<!-- 同上 -->
<input v-on:keyup.enter="submit">json
所有的按鍵別名:
.enter
.tab
.delete (捕獲 "刪除" 和 "退格" 鍵)
.esc
.space
.up
.down
.left
.right
.ctrl
.alt
.shift
.meta 數組
-- demo3.2.html
3. vue表單
用v-model指令在表單控件元素上建立雙向數據綁定瀏覽器
3.1 經常使用控件
文本框/密碼框/文本域/隱藏域
單選複選框/多選複選框
單選按鈕
下拉框
3.2 修飾符
.lazy
默認狀況下, v-model在input事件中同步輸入框的值與數據,但你能夠添加一個修飾符lazy,從而轉變爲在change事件中同步
.number
將用戶的輸入值轉爲 Number 類型
.trim
自動過濾用戶輸入的首尾空格
注1:H5提供的新方法
JSON.parse():只能解析json形式的字符串變成json,安全性高一些
JSON.stringify():json轉換爲字符串,解析的時候會自動加上引號
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>樣式綁定和事件處理</title> <script src="https://cdn.bootcss.com/vue/2.6.10/vue.js"></script> <style type="text/css"> .a{ color:red; } .b{ color:blue; } .c{ font-size: 60px; } /*div{ padding: 50px; }*/ </style> </head> <body> <div id="app"> <ul> <li> <h3>樣式綁定</h3> <span :class="aClz">犯我華夏</span> <span :class="bClz">雖遠必誅</span> <span :class="cClz">犯我華夏 雖遠必誅</span> </li> <li> <h3>事件處理-阻止冒泡</h3> <div style="background-color: #FF0000;width: 200px;height: 200px;" @click="a"> <div style="background-color: blue;width: 150px;height: 150px;" @click="b"> <div style="background-color: pink;width: 100px;height: 100px;" @click="c"> <div style="background-color: greenyellow;width: 60px;height: 60px;" @click="d"> </div> </div> </div> </div> <li> <h3>事件處理-按鈕只能點擊一次</h3> {{info}}<input type="text" v-model="msg" /> <button @click="e">無限次點擊</button> <button @click.once="e">發送一次</button> </li> <li> <h3>按鍵修飾符</h3> {{info}}<input type="text" v-model="msg" v-on:keyup.enter="e" /> <button @click="e">無限次點擊</button> <button @click.once="e">發送一次</button> </li> <li> <h3>select標籤</h3> <select name="hobby" v-model="selectedIds"> <option v-for="d in datas" :value="d.id">{{d.name}}</option> </select> 選中的值:{{selectedIds}} </li> <li> <h3>複選框標籤</h3> <div v-for="d in datas"> <input type="checkbox" :value="d.id" name="likes" v-model="selectedIdArr" />{{d.name}} </div> 選中的值:{{selectedIdArr}} </li> </li> </ul> </div> </body> <script type="text/javascript"> //做用將Vue實例掛載到具體的邊界,那麼這個邊界就會被Vue這個漸進式的框架所管理 //注意:邊界不能有兄弟標籤,邊界必定是跟標籤 new Vue({ el:'#app', data:{ aClz:'a', bClz:'b', cClz:['b','c'], msg:'', info:'', datas:[{ id:1, name:'象棋' },{ id:2, name:'象棋2' },{ id:3, name:'象棋3' }], selectedIds:'', selectedIdArr:[] }, methods:{ a(){ alert('a事件觸發'); }, b(){ alert('b事件觸發'); }, c(){ alert('c事件觸發'); }, d(){ alert('d事件觸發'); }, e(){ this.info=this.msg; this.msg=""; } } }) </script> </html>
-- demo3.3.html
4. 自定義指令
除了Vue自帶的指令(v-on|v-model)等, Vue也容許註冊自定義指令,根據做用範圍又分爲:全局指令/局部指令
Vue.directive("focus",{});//全局指令
new Vue({
el:"#d1",
directives:{//局部指令
focus:{}
}
});
## 下面的內容直接百度或查API便可
指令定義函數提供了幾個鉤子函數用來幫助實現功能(可選)
bind: 只調用一次,指令第一次綁定到元素時調用,用這個鉤子函數能夠定義一個在綁定時執行一次的初始化動做
inserted: 被綁定元素插入父節點時調用(父節點存在便可調用,沒必要存在於 document 中)。
update: 被綁定元素所在的模板更新時調用,而不論綁定值是否變化。經過比較更新先後的綁定值,能夠忽略沒必要要的模板更新(詳細的鉤子函數參數見下)。
componentUpdated: 被綁定元素所在模板完成一次更新週期時調用。
unbind: 只調用一次, 指令與元素解綁時調用。
鉤子函數的參數有
el: 指令所綁定的元素,能夠用來直接操做 DOM 。
binding: 一個對象,包含如下屬性:
name: 指令名,不包括 v- 前綴。
value: 指令的綁定值, 例如: v-my-directive="1 + 1", value 的值是 2。
oldValue: 指令綁定的前一個值,僅在 update 和 componentUpdated 鉤子中可用。不管值是否改變均可用。
expression: 綁定值的表達式或變量名。 例如 v-my-directive="1 + 1" , expression 的值是 "1 + 1"。
arg: 傳給指令的參數。例如 v-my-directive:foo, arg 的值是 "foo"。
modifiers: 一個包含修飾符的對象。 例如: v-my-directive.foo.bar, 修飾符對象 modifiers 的值是 { foo: true, bar: true }。
vnode: Vue 編譯生成的虛擬節點。
oldVnode: 上一個虛擬節點,僅在 update 和 componentUpdated 鉤子中可用。
-- demo3.4.html
5. vue組件
5.1 組件簡介
組件(Component)是Vue最強大的功能之一
組件能夠擴展HTML元素,封裝可重用的代碼
組件系統讓咱們能夠用獨立可複用的小組件來構建大型應用,幾乎任意類型的應用的界面均可以抽象爲一個組件樹
5.2 全局和局部組件
全局組件:Vue.component(tagName, options),tagName爲組件名,options爲配置選項。
局部組件: new Vue({el:'#d1',components:{...}})
<html> <head> <meta charset="UTF-8"> <title>組件</title> <script src="https://cdn.bootcss.com/vue/2.6.10/vue.js"></script> </head> <body> <div id="app"> <ul> <li> <h3>局部組件的註冊</h3> <!--侵入性--> <my-button></my-button> <!--<button @click="doSubmit">被點擊了n次</button>--> </li> <li> <h3>全局組件的註冊</h3> <my-button2></my-button2> </li>
</ul>
</div> </body> <script type="text/javascript"> Vue.component('my-button2',{ template:'<button @click="doSubmit">被點擊了{{n}}次</button>', data(){ return{ n:0 } }, methods:{ doSubmit(){ this.n+=1; } } })
註冊後,咱們可使用如下方式來調用組件:
<tagName></tagName>
5.3 props
props是父組件用來傳遞數據的一個自定義屬性。
父組件的數據須要經過props把數據傳給子組件,子組件須要顯式地用props選項聲明 "prop"
注1:由於組件是可複用的 Vue 實例,因此它們與 new Vue 接收相同的選項,例如 data、computed、watch、methods
以及生命週期鉤子等。僅有的例外是像el這樣根實例特有的選項。
注2:當咱們定義這個 <button-counter> 組件時,你可能會發現它的data並非像這樣直接提供一個對象
data: {
count: 0
}
取而代之的是,一個組件的data選項必須是一個函數,所以每一個實例能夠維護一份被返回對象的獨立的拷貝:
data: function () {
return {
count: 0
}
}
注3:定義組件名的方式有兩種
短橫線分隔命名(建議使用)
Vue.component('my-component-name', { /* ... */ }),引用方式:<my-component-name>
首字母大寫命名
Vue.component('MyComponentName', { /* ... */ }),引用方式: <my-component-name>和<MyComponentName>都是可接受的
注4:HTML 中的特性名是大小寫不敏感的,因此瀏覽器會把全部大寫字符解釋爲小寫字符。這意味着當你使用 DOM 中的模板時,
camelCase (駝峯命名法) 的 prop 名須要使用其等價的 kebab-case (短橫線分隔命名) 命名:
props: ['postTitle'],<my-tag post-title="hello!"></my-tag>
注5:props: ['title', 'likes', 'isPublished', 'commentIds', 'author']
但願每一個 prop 都有指定的值類型
props: {
title: String,
likes: Number,
isPublished: Boolean,
commentIds: Array,
author: Object,
callback: Function,
contactsPromise: Promise // or any other constructor
}
-- demo3.5.html
6. 自定義事件
監聽事件:$on(eventName)
觸發事件:$emit(eventName)
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>組件</title> <script src="https://cdn.bootcss.com/vue/2.6.10/vue.js"></script> </head> <body> <div id="app"> <ul> <li> <h3>局部組件的註冊</h3> <!--侵入性--> <my-button></my-button> <!--<button @click="doSubmit">被點擊了n次</button>--> </li> <li> <h3>全局組件的註冊</h3> <my-button2></my-button2> </li> <li> <h3>組件的通訊(父傳子)</h3> <my-button m='zs'></my-button> </li> <li> <h3>組件的通訊(子傳父)</h3> <my-button m='zs' @three-click='xxx' ></my-button> </li> </ul> </div> </body> <script type="text/javascript"> Vue.component('my-button2',{ template:'<button @click="doSubmit">被點擊了{{n}}次</button>', data(){ return{ n:0 } }, methods:{ doSubmit(){ this.n+=1; } } }) new Vue({ el:'#app', data(){ return{ } }, components:{ 'my-button':{ props:['m'], template:'<button v-on:click="doSubmit">被{{m}}點擊了{{n}}次</button>', data(){ return{ n:0, zedie:'摺疊效果' } }, methods:{ doSubmit(){ this.n+=1; // 註冊一個事件,讓外部調用,而後順便接受內部的值 if(this.n % 3==0){ this.$emit('three-click',this.zedie); } } } } }, methods:{ xxx(v){ alert(v); } } }) </script> </html>
注1:Vue自定義事件是爲組件間通訊設計
vue中父組件經過prop傳遞數據給子組件,而想要將子組件的數據傳遞給父組件,則能夠經過自定義事件的綁定
父Vue實例->Vue實例,經過prop傳遞數據
子Vue實例->父Vue實例,經過事件傳遞數據
注2:事件名
不一樣於組件和prop,事件名不存在任何自動化的大小寫轉換。而是觸發的事件名須要徹底匹配監聽這個事件所用的名稱
建議使用「短橫線分隔命名」,例如:three-click