簡介
指令 (Directives) 是帶有 v- 前綴的特殊 attribute。指令 attribute 的值預期是單個 JavaScript 表達式 (v-for 是例外情況,稍後我們再討論)。指令的職責是,當表達式的值改變時,將其產生的連帶影響,響應式地作用於 DOM。
內容
官方API文檔給出的指令有14個,包括了我們之前學習過的v-once
,v-html
,以及v-text
,v-show
,v-if
,v-else
,v-else-if
,v-for
,v-on
,v-bind
,v-model
,v-slot
,v-pre
,v-cloak
。我們簡單的學習幾個,其他的後面會陸續學習到。
-
v-text
更新元素的textcontent,和雙大括號的文本插值是一樣的效果。但是v-text沒有{{value}}插值靈活,因爲他是作用於元素之上,如果只是更新部分文本的話,雙大括號會更加方便。
example:
<div id="app"> <!-- 這是一組相同結果的 --> <p v-text="message"></p> <p>{{message}}</p> <hr/> <!-- 這是一組部分元素更新的 --> <p v-text="message1"></p> <p>this is {{message}}</p> </div> <script type="text/javascript"> var data = { message:'maybe', message1:'this is maybe' }; var vm = new Vue({ el : '#app', data : data }) </script>
result:
-
v-show和v-if
v-show和v-if是一組功能比較相近的指令,他們之間的差別就是v-show指令只是讓元素顯示和隱藏,相當於操作的是元素的display屬性;而v-if指令是決定要不要渲染這個元素。簡單的來說就是如果某個變量爲
false
,如果在v-show指令中,則這個元素存在,但是屬於隱藏不可見,相當於display:none;
,在v-if指定中則這個元素根本就不存在,不會渲染這個元素。example:
<div id="app"> <p v-if="show">123</p> <p v-show="show">123</p> </div> <script type="text/javascript"> var data = { show:false }; var vm = new Vue({ el : '#app', data : data }) </script>
result:
參數指令
一些指令能夠接收一個“參數”,在指令名稱之後以冒號表示,我們簡單的稱爲普通參數指令。從 2.6.0 開始,可以用方括號括起來的 JavaScript 表達式作爲一個指令的參數,我們稱爲動態參數指令。但是這個是有約束的,動態參數預期會求出一個字符串,異常情況下值爲 null。這個特殊的 null 值可以被顯性地用於移除綁定。任何其它非字符串類型的值都將會觸發一個警告。下面以v-bind
,v-on
兩個指令來做演示。
-
普通參數指令
example:
<div id="app"> <a v-bind:href="url">百度</a> <p v-on:click="click">點我</p> </div> <script type="text/javascript"> var data = { url:'https://www.baidu.com' }; var vm = new Vue({ el : '#app', data : data, methods:{ click : function(){ alert('click'); } } }) </script>
result:
-
動態參數指令
example:
<div id="app"> <a v-bind:[attr]="url">百度</a> <p v-on:[event]="click">點我</p> </div> <script type="text/javascript"> var data = { url:'https://www.baidu.com', attr:'href', event:'click' }; var vm = new Vue({ el : '#app', data : data, methods:{ click : function(){ alert('click'); } } }) </script>
result:
-
動態參數及動態表達式的約束
-
語法約束,因爲某些字符,如空格和引號,放在 HTML attribute 名裏是無效的。
example:
<div id="app"> <!-- 這會觸發一個編譯警告 --> <a v-bind:['at'+tr]="url">百度</a> <a v-bind:[at+tr]="url">百度</a> </div> <script type="text/javascript"> var data = { url:'https://www.baidu.com', attr:'href', event:'click', at:'hr', tr:'ef' }; var vm = new Vue({ el : '#app', data : data, methods:{ click : function(){ alert('click'); } } }) </script>
result:
-
大小寫轉換,需要避免使用大寫字符來命名鍵名,因爲瀏覽器會把 attribute 名全部強制轉爲小寫
example:
<div id="app"> <!-- 這會觸發一個編譯警告,必須有個小寫的href屬性才能運行 --> <a v-bind:[Href]="url">百度</a> </div> <script type="text/javascript"> var data = { url:'https://www.baidu.com', Href:'href' }; var vm = new Vue({ el : '#app', data : data, methods:{ click : function(){ alert('click'); } } }) </script>
result:
-
-
修飾符
修飾符 (modifier) 是以半角句號 . 指明的特殊後綴,用於指出一個指令應該以特殊方式綁定。例如,
.prevent
修飾符告訴v-on
指令對於觸發的事件調用event.preventDefault():
<form v-on:submit.prevent="onSubmit">...</form>
-
縮寫
v- 前綴作爲一種視覺提示,用來識別模板中 Vue 特定的 attribute。當你在使用 Vue.js 爲現有標籤添加動態行爲 (dynamic behavior) 時,v- 前綴很有幫助,然而,對於一些頻繁用到的指令來說,就會感到使用繁瑣。同時,在構建由 Vue 管理所有模板的單頁面應用程序 (SPA - single page application) 時,v- 前綴也變得沒那麼重要了。因此,Vue 爲
v-bind
和v-on
這兩個最常用的指令,提供了特定簡寫。-
v-bind縮寫
<!-- 完整語法 --> <a v-bind:href="url">...</a> <!-- 縮寫 --> <a :href="url">...</a> <!-- 動態參數的縮寫 (2.6.0+) --> <a :[key]="url"> ... </a>
-
v-on縮寫
<!-- 完整語法 --> <a v-on:click="doSomething">...</a> <!-- 縮寫 --> <a @click="doSomething">...</a> <!-- 動態參數的縮寫 (2.6.0+) --> <a @[event]="doSomething"> ... </a>
-
example
<div id="app"> <!-- v-bind --> <a v-bind:href="url">百度</a><br/> <a :href="url">百度</a><br/> <a :[href]="url">百度</a> <hr/> <!-- v-on --> <a v-on:click="click">點我</a><br/> <a @click="click">點我</a><br/> <a @[event]="click">點我</a> </div> <script type="text/javascript"> var data = { url:'https://www.baidu.com', href:'href', event:'click' }; var vm = new Vue({ el : '#app', data : data, methods:{ click : function(){ alert('click'); } } }) </script>
-
result
-