Vue.js資料繫結語法
資料繫結語法
Vue.js 的模板是基於 DOM 實現的。這意味著所有的 Vue.js 模板都是可解析的有效的 HTML,且通過一些特殊的特性做了增強。Vue 模板因而從根本上不同於基於字串的模板,請記住這點。
插值
文字
資料繫結最基礎的形式是文字插值,使用 “Mustache” 語法(雙大括號):
<span>Message: {{ msg }}</span>
|
Mustache 標籤會被相應資料物件的 msg
屬性的值替換。每當這個屬性變化時它也會更新。
你也可以只處理單次插值,今後的資料變化就不會再引起插值更新了:
<span>This will never change: {{* msg }}</span |
原始的 HTML
雙 Mustache 標籤將資料解析為純文字而不是 HTML。為了輸出真的 HTML 字串,需要用三 Mustache 標籤:
<div>{{{ raw_html }}}</div>
|
內容以 HTML 字串插入——資料繫結將被忽略。如果需要複用模板片斷,應當使用partials。
在網站上動態渲染任意 HTML 是非常危險的,因為容易導致 XSS 攻擊。記住,只對可信內容使用 HTML 插值,永不用於使用者提交的內容。
HTML 特性
Mustache 標籤也可以用在 HTML 特性 (Attributes) 內:
<div id="item-{{ id }}" |
注意在 Vue.js 指令和特殊特性內不能用插值。不必擔心,如果 Mustache 標籤用錯了地方 Vue.js 會給出警告。
繫結表示式
放在 Mustache 標籤內的文字稱為繫結表示式。在 Vue.js 中,一段繫結表示式由一個簡單的 JavaScript 表示式和可選的一個或多個過濾器構成。
JavaScript 表示式
到目前為止,我們的模板只繫結到簡單的屬性鍵。不過實際上 Vue.js 在資料繫結內支援全功能的 JavaScript 表示式:
{{ number + 1 }} {{ ok ? 'YES' : 'NO' }} {{ message.split('').reverse().join('') }} |
這些表示式將在所屬的 Vue 例項的作用域內計算。一個限制是每個繫結只能包含單個表示式,因此下面的語句是無效的:
<!-- 這是一個語句,不是一個表示式: --> {{ var a = 1 }} <!-- 流程控制也不可以,可改用三元表示式 --> {{ if (ok) { return message } }} |
過濾器
Vue.js 允許在表示式後新增可選的“過濾器 (Filter) ”,以“管道符”指示:
{{ message | capitalize }}
|
這裡我們將表示式 message
的值“管輸(pipe)”到內建的 capitalize
過濾器,這個過濾器其實只是一個 JavaScript 函式,返回大寫化的值。Vue.js 提供數個內建過濾器,在後面我們會談到如何開發自己的過濾器。
注意管道語法不是 JavaScript 語法,因此不能在表示式內使用過濾器,只能新增到表示式的後面。
過濾器可以串聯:
{{ message | filterA | filterB }}
|
過濾器也可以接受引數:
{{ message | filterA 'arg1' arg2 }}
|
過濾器函式始終以表示式的值作為第一個引數。帶引號的引數視為字串,而不帶引號的引數按表示式計算。這裡,字串 'arg1'
將傳給過濾器作為第二個引數,表示式 arg2
的值在計算出來之後作為第三個引數。
指令
指令 (Directives) 是特殊的帶有字首 v-
的特性。指令的值限定為繫結表示式,因此上面提到的 JavaScript 表示式及過濾器規則在這裡也適用。指令的職責就是當其表示式的值改變時把某些特殊的行為應用到 DOM 上。我們來回頭看下“概述”裡的例子:
<p v-if="greeting">Hello!</p>
|
這裡 v-if
指令將根據表示式 greeting
值的真假刪除/插入 <p>
元素。
引數
有些指令可以在其名稱後面帶一個“引數” (Argument),中間放一個冒號隔開。例如,v-bind
指令用於響應地更新 HTML 特性:
<a v-bind:href="url"></a>
|
這裡 href
是引數,它告訴 v-bind
指令將元素的 href
特性跟表示式 url
的值繫結。可能你已注意到可以用特性插值 href="{{url}}"
獲得同樣的結果:這樣沒錯,並且實際上在內部特性插值會轉為 v-bind
繫結。
另一個例子是 v-on
指令,它用於監聽 DOM 事件:
<a v-on:click="doSomething">
|
這裡引數是被監聽的事件的名字。我們也會詳細說明事件繫結。
修飾符
修飾符 (Modifiers) 是以半形句號 .
開始的特殊字尾,用於表示指令應當以特殊方式繫結。例如 .literal
修飾符告訴指令將它的值解析為一個字面字串而不是一個表示式:
<a v-bind:href.literal="/a/b/c"></a>
|
當然,這似乎沒有意義,因為我們只需要使用 href="/a/b/c"
而不必使用一個指令。這個例子只是為了演示語法。後面我們將看到修飾符更多的實踐用法。
縮寫
v-
字首是一種標識模板中特定的 Vue 特性的視覺暗示。當你需要在一些現有的 HTML 程式碼中新增動態行為時,這些字首可以起到很好的區分效果。但你在使用一些常用指令的時候,你會感覺一直這麼寫實在是囉嗦。而且在構建單頁應用(SPA )時,Vue.js 會管理所有的模板,此時 v-
字首也沒那麼重要了。因此Vue.js 為兩個最常用的指令 v-bind
和v-on
提供特別的縮寫:
v-bind
縮寫
<!-- 完整語法 --> <a v-bind:href="url"></a> <!-- 縮寫 --> <a :href="url"></a> <!-- 完整語法 --> <button v-bind:disabled="someDynamicCondition">Button</button> <!-- 縮寫 --> <button :disabled="someDynamicCondition">Button</button> |
v-on
縮寫
<!-- 完整語法 --> <a v-on:click="doSomething"></a> <!-- 縮寫 --> <a @click="doSomething"></a> |
它們看起來跟“合法”的 HTML 有點不同,但是它們在所有 Vue.js 支援的瀏覽器中都能被正確地解析,並且不會出現在最終渲染的標記中。縮寫語法完全是可選的,不過隨著一步步學習的深入,你會慶幸擁有它們。