Vue 第一天:模板語法

weixin_33797791發表於2018-01-29

模板語法

Vue.js 使用了基於 HTML 的模板語法,允許開發者宣告式地將 DOM 繫結至底層 Vue 例項的資料。所有 Vue.js 的模板都是合法的 HTML ,所以能被遵循規範的瀏覽器和 HTML 解析器解析。

在底層的實現上,Vue 將模板編譯成虛擬 DOM 渲染函式。結合響應系統,Vue 能夠智慧地計算出最少需要重新渲染多少元件,並把 DOM 操作次數減到最少。

如果你熟悉虛擬 DOM 並且偏愛 JavaScript 的原始力量,你也可以不用模板,直接寫渲染 (render) 函式,使用可選的 JSX 語法。

插值

文字

資料繫結最常見的形式就是使用“Mustache”語法 (雙大括號) 的文字插值:

<span>Message: {{ msg }}</span>
複製程式碼

Mustache 標籤將會被替代為對應資料物件上 msg 屬性的值。無論何時,繫結的資料物件上 msg 屬性發生了改變,插值處的內容都會更新。

通過使用 v-once 指令,你也能執行一次性地插值,當資料改變時,插值處的內容不會更新。但請留心這會影響到該節點上所有的資料繫結:

<span v-once>這個將不會改變: {{ msg }}</span>
複製程式碼

原始 HTML

雙大括號會將資料解釋為普通文字,而非 HTML 程式碼。為了輸出真正的 HTML,你需要使用 v-html 指令:

<p>Using mustaches: {{ rawHtml }}</p>
<p>Using v-html directive: <span v-html="rawHtml"></span></p>
複製程式碼

這個 span 的內容將會被替換成為屬性值 rawHtml,直接作為 HTML——會忽略解析屬性值中的資料繫結。注意,你不能使用 v-html 來複合區域性模板,因為 Vue 不是基於字串的模板引擎。反之,對於使用者介面 (UI),元件更適合作為可重用和可組合的基本單位。

你的站點上動態渲染的任意 HTML 可能會非常危險,因為它很容易導致 XSS 攻擊。請只對可信內容使用 HTML 插值,絕不要對使用者提供的內容使用插值。

特性

Mustache 語法不能作用在 HTML 特性上,遇到這種情況應該使用 v-bind 指令:

<div v-bind:id="dynamicId"></div>
複製程式碼

在布林特性的情況下,它們的存在即暗示為 true,v-bind 工作起來略有不同,在這個例子中:

<button v-bind:disabled="isButtonDisabled">Button</button>
複製程式碼

如果 isButtonDisabled 的值是 null、undefined 或 false,則 disabled 特性甚至不會被包含在渲染出來的 <button> 元素中。

使用 JavaScript 表示式

迄今為止,在我們的模板中,我們一直都只繫結簡單的屬性鍵值。但實際上,對於所有的資料繫結,Vue.js 都提供了完全的 JavaScript 表示式支援。

{{ number + 1 }}

{{ ok ? 'YES' : 'NO' }}

{{ message.split('').reverse().join('') }}

<div v-bind:id="'list-' + id"></div>
複製程式碼

這些表示式會在所屬 Vue 例項的資料作用域下作為 JavaScript 被解析。有個限制就是,每個繫結都只能包含單個表示式,所以下面的例子都不會生效。

<!-- 這是語句,不是表示式 -->
{{ var a = 1 }}

<!-- 流控制也不會生效,請使用三元表示式 -->
{{ if (ok) { return message } }}
複製程式碼

模板表示式都被放在沙盒中,只能訪問全域性變數的一個白名單,如 MathDate 。你不應該在模板表示式中試圖訪問使用者定義的全域性變數。

指令

指令 (Directives) 是帶有 v- 字首的特殊屬性。指令屬性的值預期是單個 JavaScript 表示式 (v-for 是例外情況,稍後我們再討論)。指令的職責是,當表示式的值改變時,將其產生的連帶影響,響應式地作用於 DOM。回顧我們在介紹中看到的例子:

<p v-if="seen">現在你看到我了</p>
複製程式碼

這裡,v-if 指令將根據表示式 seen 的值的真假來插入/移除 <p> 元素。

引數

一些指令能夠接收一個“引數”,在指令名稱之後以冒號表示。例如,v-bind 指令可以用於響應式地更新 HTML 屬性:

<a v-bind:href="url">...</a>
複製程式碼

在這裡 href 是引數,告知 v-bind 指令將該元素的 href 屬性與表示式 url 的值繫結。

另一個例子是 v-on 指令,它用於監聽 DOM 事件:

<a v-on:click="doSomething">...</a>
複製程式碼

在這裡引數是監聽的事件名。我們也會更詳細地討論事件處理。

修飾符

修飾符 (Modifiers) 是以半形句號 . 指明的特殊字尾,用於指出一個指令應該以特殊方式繫結。例如,.prevent 修飾符告訴 v-on 指令對於觸發的事件呼叫 event.preventDefault()

<form v-on:submit.prevent="onSubmit">...</form>
複製程式碼

在接下來對 v-onv-for 等功能的探索中,你會看到修飾符的其它例子。

縮寫

v- 字首作為一種視覺提示,用來識別模板中 Vue 特定的特性。當你在使用 Vue.js 為現有標籤新增動態行為 (dynamic behavior) 時,v- 字首很有幫助,然而,對於一些頻繁用到的指令來說,就會感到使用繁瑣。同時,在構建由 Vue.js 管理所有模板的單頁面應用程式 (SPA - single page application)時,v- 字首也變得沒那麼重要了。因此,Vue.js 為 v-bindv-on 這兩個最常用的指令,提供了特定簡寫:

v-bind 縮寫

<!-- 完整語法 -->
<a v-bind:href="url">...</a>

<!-- 縮寫 -->
<a :href="url">...</a>
複製程式碼

v-on 縮寫

<!-- 完整語法 -->
<a v-on:click="doSomething">...</a>

<!-- 縮寫 -->
<a @click="doSomething">...</a>
複製程式碼

它們看起來可能與普通的 HTML 略有不同,但 : 與@ 對於特性名來說都是合法字元,在所有支援 Vue.js 的瀏覽器都能被正確地解析。而且,它們不會出現在最終渲染的標記中。縮寫語法是完全可選的,但隨著你更深入地瞭解它們的作用,你會慶幸擁有它們。

相關文章