Vue.js 使用一種超集的 HTML 樣板語言。我們可以使用插值和指令。本文將解釋指令。


Vue.js 模板和插值中,我們看到了如何在 Vue 模板中嵌入數據。

本文將解釋 Vue.js 在模板中提供的另一種技術:指令

指令基本上就像是添加在模板內的 HTML 屬性。它們都以 v- 開頭,表示它們是 Vue 的特殊屬性。

讓我們逐一看一下每個 Vue 指令的詳細用法。

v-text

可以使用 v-text 指令來替代插值,它執行相同的工作:

<span v-text="name"></span>

v-once

你知道 {{ name }} 是綁定到組件數據的 name 屬性的。當你的組件數據中的 name 發生變化時,Vue 會在瀏覽器中更新該值。

除非使用 v-once 指令,它基本上就像是一個 HTML 屬性:

<span v-once>{{ name }}</span>

v-html

當你使用插值來打印數據屬性時,HTML 會被轉義。這是 Vue 自動保護免受 XSS 攻擊的一種很好的方式。

然而,有時你想要輸出 HTML 並讓瀏覽器解釋它。你可以使用 v-html 指令:

<span v-html="someHtml"></span>

v-bind

插值只在標籤內容中起作用,無法在屬性上使用。

屬性必須使用 v-bind

<a v-bind:href="url">{{ linkText }}</a>

v-bind 如此常見,所以它還有一種簡略語法:

<a v-bind:href="url">{{ linkText }}</a>
<a :href="url">{{ linkText }}</a>

使用 v-model 雙向綁定

v-model 允許我們綁定表單輸入元素(例如),在用戶更改字段內容時更改 Vue 數據屬性:

<input v-model="message" placeholder="輸入一條消息">
<p>消息是:{{ message }}</p>
<select v-model="selected">
 <option disabled value="">選擇一個水果</option>
 <option>蘋果</option>
 <option>香蕉</option>
 <option>草莓</option>
</select>
<span>選擇的水果:{{ selected }}</span>

使用運算式

你可以在指令中使用任何 JavaScript 運算式:

<span v-text="'你好,' + name + '!'"></span>
<a v-bind:href="'https://' + domain + path">{{ linkText }}</a>

指令中使用的任何變量都引用相應的數據屬性。

條件語句

在指令內部,你可以使用三元運算符進行條件檢查,因為它是一個表達式:

<span v-text="name == Flavio ? '你好 Flavio!' : '你好' + name + '!'"></span>

還有專門的指令可供你執行更有組織的條件語句:v-ifv-elsev-else-if

<p v-if="shouldShowThis">嘿!</p>

shouldShowThis 是包含在組件數據中的布林值。

循環

v-for 允許你渲染一個項目列表。與 v-bind 一起使用,可以設置列表中每個項目的屬性。

你可以對一個普通的數值數組進行迭代:

<template>
 <ul>
 <li v-for="item in items">{{ item }}</li>
 </ul>
</template>

<script>
export default {
 data() {
 return {
 items: ['汽車', '自行車', '狗']
 }
 }
}
</script>

或者對一個對象數組進行迭代:

<template>
 <div>
 <!-- 使用插值 -->
 <ul>
 <li v-for="todo in todos">{{ todo.title }}</li>
 </ul>
 <!-- 使用 v-text -->
 <ul>
 <li v-for="todo in todos" v-text="todo.title"></li>
 </ul>
 </div>
</template>

<script>
export default {
 data() {
 return {
 todos: [
 { id: 1, title: '做一些事情' },
 { id: 2, title: '做其他事情' }
 ]
 }
 }
}
</script>

v-for 可以通過以下方式提供索引:

<li v-for="(todo, index) in todos"></li>

事件

v-on 允許你監聽 DOM 事件,並在事件發生時觸發一個方法。這裡我們監聽點擊事件:

<template>
 <a v-on:click="handleClick">點擊我!</a>
</template>

<script>
export default {
 methods: {
 handleClick: function() {
 alert('測試')
 }
 }
}
</script>

你可以向任何事件傳遞參數:

<template>
 <a v-on:click="handleClick('測試')">點擊我!</a>
</template>

<script>
export default {
 methods: {
 handleClick: function(value) {
 alert(value)
 }
 }
}
</script>

並且可以在模板中直接放入一小段 JavaScript(單個表達式):

<template>
 <a v-on:click="counter = counter + 1">{{counter}}</a>
</template>

<script>
export default {
 data: function() {
 return {
 counter: 0
 }
 }
}
</script>

click 只是一種事件。常見的事件是 submit,你可以使用 v-on:submit 進行綁定。

v-on 如此常見,因此它還有一種簡略語法 @

<a v-on:click="handleClick">點擊我!</a>
<a @click="handleClick">點擊我!</a>

有關 v-on 的更多詳細信息,請參見Vue 事件

顯示或隱藏

你可以選擇僅當 Vue 實例的特定屬性求值為 true 時,顯示 DOM 中的元素,使用 v-show

<p v-show="isTrue">某物</p>

該元素仍然被插入到 DOM 中,但如果條件不滿足,它的 display 設置為 none

事件指令修飾符

Vue 提供了一些可選的事件修飾符,你可以與 v-on 一起使用,它們可以自動在事件處理程序中執行某些操作,而不需要顯式編寫。

一個很好的例子是 .prevent,它自動在事件上調用 preventDefault()

在這種情況下,表單不會導致頁面重新加載,這是默認行為:

<form v-on:submit.prevent="formSubmitted"></form>

其他修飾符包括 .stop.capture.self.once.passive,可以在官方文檔中詳細說明

自定義指令

Vue 默認的指令已經可以讓你完成很多工作,但如果你想要,你可以始終添加新的自定義指令。

如果你對此感興趣,請閱讀https://vuejs.org/v2/guide/custom-directive.html以了解更多信息。