前言
筆記一下Vue的模板語法
模板語法
Mustache: { {variable} } 只能用於單行語句 e.g. if-else,且雙大括號會將數據解析為一般文字
由於Hexo解析”雙大括號”會發生錯誤,所以文章涉及”雙大括號”都會以{ {} }
表示
- 指令監聽DOM事件,並改變 data內的資料,
若傳入多個參數時,事件名稱需加上 $
- 陣列更新
append、unshift,注意陣列是返回原陣列,或是新陣列。
若改變原陣列,可使頁面更新。
若不改變原陣列,建一新陣列,則無法使頁面刷新。
methods:
表示調用函數,呼叫函式需添加 “()”
computed:
計算屬性,亦可呼叫函數,但不須添加 “()”
watch:
計算屬性 vs 方法
屬性的相關內容不持續變動時,建議使用computed,只在相關響應式依賴發生改變時它們才會重新求值,只要屬性的相關內容還沒有發生改變,多次訪問計算屬性會立即返回之前的計算結果,而不必再次執行函數。
表單輸入綁定
v-model 進行雙向數據綁定,輸入內容的同時,同步將數據更新到頁面上,重要修飾符:
.lazy
.number
.trim
資料渲染 v-text、v-html、{ {} }
透過模板語法直接將指令寫在html中
{ {} }
使用{}將掛載的物件內容顯示出來
1 2 3
| <div id="app"> { { message } } </div>
|
1 2 3 4 5 6
| var app = new Vue({ el: '#app', data: { message: 'Hello Vue!' } })
|
v-text
更新元素的textContent
1 2 3
| <div id="app"> <p v-text="title"></p> </div>
|
1 2 3 4 5 6
| var app = new Vue({ el: '#app', data: { title: "<h1>模板指令</h1>", } })
|
v-html
更新元素的innerHTML
文字內容會套用html標籤的特性
1 2 3
| <div id="app"> <p v-text="title"></p> </div>
|
1 2 3 4 5 6
| var app = new Vue({ el: '#app', data: { title: "<h1>模板指令</h1>", } })
|
控制顯示、隱藏 v-if
、 v-show
差別:
若不顯示的話
v-if
則不進行渲染
v-show
元素始終會被渲染並保留在DOM中。v-show只是簡單地切換元素的CSS屬性display。
1 2 3
| <p class="show" v-if="isShow">模組的顯示、隱藏</p>
<p class="show" v-show="isShow">模組的顯示、隱藏</p>
|
1 2 3 4 5 6
| var app = new Vue({ el: '#app', data: { isShow: false, } })
|
渲染循環列表 v-for
似for.. in 的JS方法,可用於陣列或物件,良好的習慣是添加key屬性,key的作用主要是為了高效的更新虛擬DOM,因為是根據key值去判斷某個值是否修改,如果修改,則重新渲染這一項,否則重複使用之前的元素;
1 2 3 4 5
| <ul> <li v-for="item in arr"> { { item } }<!--調用item--> </li> </ul>
|
1 2 3 4 5 6
| var app = new Vue({ el: '#app', data: { arr: ["1、html", "2、CSS", "3、JavaScript"], } })
|
事件綁定v-on
事件綁定 v-on:event,搭配method方法,event 表示點擊後所觸發的事件
可用簡寫: @
代替 v-on:
1 2 3
| <div class="show" v-on:click="speak"></div> <!-- 與上方相同 --> <div class="show" @click="speak"></div>
|
1 2 3 4 5 6 7 8
| var app = new Vue({ el: '#app', methods: { speak: function() { alert("hello"); } } })
|
屬性綁定v-bind
v-bind: 綁定
綁定的目標為標籤屬性
,為一物件,往後只需要修改變數的值即可,<標籤 v-bind:屬性名="要绑定Vue物件的data內的屬性名"></標籤>
由於v-bind使用非常頻繁,所以Vue提供了簡單的寫法,簡寫: : 代替v-bind:
1 2 3 4 5
| <img src="angry_25.jpg" v-bind:src="imgName" alt="" style="width: 200px; height: 200px;"/>
<!--兩者相同-->
<img src="angry_25.jpg" :src="imgName" alt="" style="width: 200px; height: 200px;"/>
|
1 2 3 4 5 6
| var app = new Vue({ el: '#app', data: { imgName: "angry_18.jpg", } })
|
樣式
綁定v-bind
Vue專門加強了class和style的屬性的綁定。可以有複雜的物件綁定、陣列綁定樣式。
1 2 3 4 5 6
| <div class="view" v-bind:class="{active:isActive}"> { {message1} } </div> <!-- <div class="view"> 樣式綁定 </div> -->
|
1 2 3 4 5 6 7 8 9
|
var app = new Vue({ el: '#app', data: { message1: '樣式綁定', isActive:false } })
|
雙向數據綁定 v-model
上面的例子基本都是單向的js物件向HTML進行綁定,Vue提供了一個新的指令:v-model
進行雙向數據的綁定。
1 2 3 4
| <div id="app"> <input type="text" v-model="title"> <p>{ {title} }</p> </div>
|
1 2 3 4 5 6 7
| const app = new Vue({ el: "#app", data: { title: "Vue入門" } });
|
原理:
輸入框input(v-model)內發生改變,會同時去改變 title屬性
Vue組件中重要選項
data數據
代表vue物件的數據,創建的Vue物件中的data屬性就是用來綁定數據到HTML的,Vue框架會自動監視data裡面的數據變化,自動更新數據到HTML標籤上去。
1 2 3
| <div id="app"> { { message } } </div>
|
1 2 3 4 5 6
| var app = new Vue({ el: '#app', data: { message: 'Hello Vue!' } })
|
methods方法
代表vue物件的方法,不過要注意的是這個方法自動綁定this
1 2 3 4 5
| <div id="app"> <div class="test" @click="run"></div>
<div class="test" @click="speak"></div> </div>
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| var app = new Vue({ el: '#app', methods: { run: function() { alert("button1"); }, speak: function() { alert("button2"); }, add: function() { this.i++; console.log(this.i); } })
|
computed計算屬性
計算屬性,屬性可以是一個方法
在計算屬性中定義的函數裡面可以直接使用this
。
注意:
採用return
回傳值到{ {expression} }
中
1 2 3 4 5
| <div id="app"> <div class="test" @click="add"> { { strFn } } </div> </div>
|
1 2 3 4 5 6 7 8 9 10 11 12 13
| computed: { strFn: function() { if (this.i <= 5) { return "多點幾次"; } else if (this.i <= 10) { return "再多點幾次"; } else if (this.i <= 15) { return "再比之前多點幾次"; } else if (this.i <= 20) { return "目前點很多次"; } }
|
watch監聽選項
設定物件的監聽方法,用於監聽數據變化,針對data內的屬性進行監聽,不過不適合用於複雜的計算邏輯。
1 2 3 4 5
| <div id="app"> <div class="test" @click="add"> { { strFn } } </div> </div>
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| const app = new Vue({ el: "#app", data: { i:0 },methods: { add: function() { this.i++; console.log(this.i); }, watch: { i: function(newValue, oldValue) { console.log(newValue, oldValue); } } });
|