1. 模板語法
## demo2.hrml
1.1 插值
1.1.1 文本
{{msg}}
1.1.2 html
使用v-html指令用於輸出html代碼
1.1.3 屬性
HTML屬性中的值應使用v-bind指令
1.1.4 表達式
Vue提供了完全的JavaScript表達式支持
{{str.substr(0,6).toUpperCase()}}
{{ number + 1 }}
{{ ok ? 'YES' : 'NO' }}
<li v-bind:id="'list-' + id">我的Id是js動態生成的</li>
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>vue的插值案例</title> <script src="https://cdn.bootcss.com/vue/2.6.10/vue.js"></script> </head> <body> <div id="app"> <ul> <li> <h3>文本</h3> {{msg}} </li> <li> <h3>html字符串渲染</h3> <div v-html="htmlStr"></div> </li> <li> <h3>v-bind屬性綁定指令</h3> <input type="text" value="16" /> <input type="text" v-bind:value="age" /> </li> <li> <h3>表達式</h3> {{str.substr(0,6).toUpperCase()}} {{ number + 1 }} {{ ok ? 'YES' : 'NO' }} <li v-bind:id="'list-' + id">我的Id是js動態生成的</li> </li> </ul> </div> </body> <script type="text/javascript"> new Vue({ el:'#app', data:{ msg:'hello vue!', htmlStr:'<span style="color:red;">紅了</span>', age:18, str:'https://www.baidu.com', number:6, ok:true, id:16 } }) </script> </html>
效果如下:
1.2 指令
指的是帶有“v-”前綴的特殊屬性
## demo2.1.html
1.2.1 核心指令
(v-if|v-else|v-else-if)/v-show/v-for/v-bind/v-on/v-model
v-if|v-else|v-else-if:根據其后表達式的bool值進行判斷是否渲染該元素
他們只能是兄弟元素
v-else-if上一個兄弟元素必須是v-if
v-else上一個兄弟元素必須是v-if或者是v-else-if
v-show:與v-if類似,只是會渲染其身后表達式為false的元素,而且會給這樣的元素添加css代碼:style="display:none"
v-for:類似JS的遍歷,
遍歷數組: v-for="item in items", items是數組,item為數組中的數組元素
遍歷對象: v-for="(value,key,index) in stu", value屬性值,key屬性名,index下標
v-bind
v-on
v-model:用來在 input、select、textarea、checkbox、radio 等表單控件元素上創建雙向數據綁定,根據表單上的值,自動更新綁定的元素的值
v-for/v-model一起綁定[多選]復選框和單選框
## demo2.2.html
1.2.2 參數
一些指令能夠接收一個“參數”,在指令名稱之后以冒號表示,例如:
<a v-bind:href="url">...</a>
在這里href是參數,告知v-bind指令將該元素的href屬性與表達式url的值綁定
<a v-on:click="doSomething">...</a>
在這里click參數是監聽的事件名。
1.2.3 動態參數
從2.6.0開始,可以用方括號括起來的JavaScript表達式作為一個指令的參數
<a v-bind:[attrname]="url"> ... </a>
同樣地,你可以使用動態參數為一個動態的事件名綁定處理函數
<a v-on:[evname]="doSomething"> ... </a>
注1:動態參數表達式有一些語法約束,evName無效,evname有效,回避大寫
## 初學者了解下即可
1.2.4 修飾符
修飾符 (modifier) 是以半角句號 . 指明的特殊后綴,用於指出一個指令應該以特殊方式綁定。
例如:.prevent 修飾符告訴 v-on 指令對於觸發的事件調用 event.preventDefault()
<form v-on:submit.prevent="onSubmit">...</form>
注1:event.preventDefault()方法的作用?
該方法將通知Web瀏覽器不要執行與事件關聯的默認動作(如果存在這樣的動作)
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>vue的指令案例</title> <script src="https://cdn.bootcss.com/vue/2.6.10/vue.js"></script> </head> <body> <div id="app"> <ul> <li> <h3>分支</h3> <div v-if="score > 90">A</div> <div v-else-if="score > 80">B</div> <div v-else-if="score > 70">C</div> <div v-else-if="score > 60">D</div> <div v-else="">E</div> <input type="text" v-model="score"/> </li> <li> <h3>v-show指令</h3> <div v-show="flag">出現</div> <!-- 分清楚v-if跟v-show的區別 v-if:控制的是標簽是否打印 v-show:控制的是標簽的樣式 --> <div v-show="flag">出現2</div> </li> <li> <h3>v-for指令</h3> <div v-for="item,index in data1"> {{item}}~{{index}} </div> <hr /> <div v-for="item,index in data2"> {{item.id}}~{{item.name}}~{{index}}<br /> </li> <li> <h3>動態事件調用</h3> <button v-on:[evname]="xxx">動態事件調用</button> <input type="text" v-model="evname"/> </li> </ul> </div> </body> <script type="text/javascript"> new Vue({ el:'#app', data:{ score:88, flag:true, data1:[1,3,5,7,12], data2:[{ id:1, name:'張三' }, { id:2, name:'李四' }, { id:3, name:'王五' }], evname:'click' }, methods:{ xxx(){ console.info("xxx方法被調用"); } } }) </script> </html>
效果如下:
3. 過濾器
全局過濾器
Vue.filter('filterName', function (value) {
// value 表示要過濾的內容
});
局部過濾器
new Vue({
filters:{'filterName':function(value){}}
});
vue允許你自定義過濾器,被用作一些常見的文本格式化,格式如下:
<!-- 在兩個大括號中 -->
{{ name | capitalize }}
<!-- 在 v-bind 指令中 -->
<div v-bind:id="rawId | formatId"></div>
注1:過濾器函數接受表達式的值作為第一個參數
注2:過濾器可以串聯
{{ message | filterA | filterB }}
注3:過濾器是JavaScript函數,因此可以接受參數:
{{ message | filterA('arg1', arg2) }}
注4:js定義一個類
function Stu(){};
Stu.prototype.add(a,b){};//添加一個新的實例方法
Stu.update(a,b){};//添加一個新的類方法
案例:首字母大寫/日期格式化
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>vue的過濾器案例</title> <script src="https://cdn.bootcss.com/vue/2.6.10/vue.js"></script> </head> <body> <div id="app"> <ul> <li> <h3>局部過濾的注冊</h3> {{msg}}<br /> {{msg|a}}<br /> {{javah|a}}<br /> </li> <li> <h3>局部過濾器的串聯</h3> {{javah|a|b}} </li> <li> <h3>全局過濾器的注冊</h3> {{javah|c}} </li> </ul> </div> </body> <script type="text/javascript"> Vue.filters('c':function(v){ console.log(v); return v.substring(10,16); }) new Vue({ el:'#app', data:{ msg:'https://www.baidu.com', javah:'https://www.javah.com' }, filters:{ //a是過濾器的名字,后面的函數是過濾器的作用 'a':function(v){ console.log(v); return v.substring(0,16); }, 'b':function(v){ console.log(v); return v.substring(5,10); } } }) </script> </html>
效果如下:
4. 計算屬性
計算屬性可用於快速計算視圖(View)中顯示的屬性。這些計算將被緩存,並且只在需要時更新
computed:{}
5. 監聽屬性
監聽屬性 watch,我們可以通過 watch 來響應數據的變化
watch:{}
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>vue的計算屬性監聽屬性</title> <script src="https://cdn.bootcss.com/vue/2.6.10/vue.js"></script> </head> <body> <div id="app"> <ul> <li> <h3>計算屬性</h3> 單價:<input v-model="price" /> 數量:<input v-model="num" /> 總價:{{total}} </li> <li> <h3>監聽屬性</h3> km:<input v-model="km" /> m:<input v-model="m" /> </li> </ul> </div> </body> <script type="text/javascript"> new Vue({ el:'#app', data:{ price:16, num:1, km:1, m:1000 }, computed:{ total(){ return parseInt(this.price) * parseInt(this.num); } }, watch:{ km(v){ this.m=v*1000; }, m(v){ this.km=v/1000; } } }) </script> </html>
效果如下:
小結:計算屬性和監聽屬性的區別
自己的理解
computed用來監控自己定義的變量,該變量不在data里面聲明,直接在computed里面定義,然后就可以在頁面上進行雙向數據綁定展示出結果或者用作其他處理;
computed比較適合對多個變量或者對象進行處理后返回一個結果值,也就是數多個變量中的某一個值發生了變化則我們監控的這個值也就會發生變化,
舉例:購物車里面的商品列表和總金額之間的關系,只要商品列表里面的商品數量發生變化,或減少或增多或刪除商品,總金額都應該發生變化。這里的這個總金額使用computed屬性來進行計算是最好的選擇
與watch之間的區別:
剛開始總是傻傻分不清到底在什么時候使用watch,什么時候使用computed。這里大致說一下自己的理解:
watch主要用於監控vue實例的變化,它監控的變量當然必須在data里面聲明才可以,它可以監控一個變量,也可以是一個對象
---恢復內容結束---