# Vue.js 學習旅程Mile 4 – 模板語法之一:Mustache 語法 ###### tags: `w3HexSchool` `Vue` `Javascript` ## 前言 我在一開始學習 Vue 時,是直接進入最常見的指令,例如:`v-text`、`v-html`,所以一直以為 `{{ mustache }}` 等同於 `v-text` (汗)....,直到後面學習 methods、computed 等語法`{{ mustache }}` 又出現時,就被搞混了。因此這次為了撰寫文章而重新學習,回頭看了官方文件說明,才更了解 `{{ mustache }}` 的用法 與 Vue 的運作。 ## 模板語法 Template Syntax Vue.js 使用了基於 HTML 的模板語法,讓開發者能聲明式地把 DOM 綁定至底層 Vue 實例的數據(Vue instance’s data)。所有 Vue.js 的模板(templates)都是有效的 HTML,所以能被遵循規範的瀏覽器和 HTML 解析器解析。 在底層的實現上,Vue 將模板編譯(compiles)成虛擬 DOM 渲染函數(Virtual DOM render functions)。結合響應式系統(reactivity system),Vue 能夠智能地計算出最少需要重新渲染多少組件,並把 DOM 操作次數減到最少。 ### 模板 ![](https://i.imgur.com/apIOll4.png) * 模板會經由 Compiler 編譯為 Render Function。 * Watcher:每個 Vue 實例都有相對應的 Watcher,作用是在 Vue 實例的 data 資料有更新時,會觸發 re-render 重新渲染。 * Render Function 會生成 Virtual DOM Tree 。 * 對比新舊 Virtual DOM Tree 的不同,收集差異,最後將差異用到真實的 DOM Tree #### Vue 模板語法分為三種 1. 插值 Interpolations,即 **`{{ Mustache }} 語法`** 2. 指令 Directives,如:v-text、v-bind 等,以 **`v-`** 為前綴詞的特殊屬性 3. 縮寫 Shorthands ## Mustache 語法 ### 文字 Text 最常見使用 `{{ mustache }}` 語法的就是文字插植 ```htmlmixed= <span>Message: {{ msg }}</span> ``` 只要綁定的資料對象上 msg 屬性發生了改變,插值處的內容就會更新。 ### 單次綁定 v-once 加上 v-once 這個指令,可以讓 `{{ mustache }}` 語法只渲染一次 ```htmlmixed= <span v-once>This will never change: {{ msg }}</span> ``` ### JavaScript 陳述式(JavaScript Expressions) `{{ mustache }}` 語法除了可以直接使用實體中的屬性外,我們也可以使用 JavaScript 的陳述式寫一些運算或判斷。例如: ```htmlmixed= {{ number + 1 }} {{ ok ? 'YES' : 'NO' }} {{ message.split('').reverse().join('') }} ``` #### 限制 使用 JavaScript 陳述式的限制是,每個綁定都只能包含單個表達式,所以下面的例子都不會生效。 ```htmlmixed= <!-- 這是語句 statement,不是表達式 expression --> {{ var a = 1 }} <!-- 流程控制也不會生效,請使用三元表達式 --> {{ if (ok) { return message } }} ``` > `{{ mustache }}` 語法的 JavaScript 陳述式雖然好用,但是由於不可復用及較差的可讀性,通常在開發時會用 **`computed`** 或是 **`methods`** 取代 ## 參考資料 * [Vue.js Guide: Template Syntax](https://vuejs.org/v2/guide/syntax.html) * [Vue.js Core 30天屠龍記(第5天): 模板語法 Part 1 - Mustache 標籤](https://ithelp.ithome.com.tw/articles/10202967) * [|D6| 從原始碼看 Vue 渲染機制 (4) - render](https://ithelp.ithome.com.tw/articles/10218727) ## 結語 藉由這次整理的筆記,才讓我對 `{{ mustache }}` 這位鬍子先生有了更清楚的認識,這樣每次見面時總算能熟識地打招呼,而非呼嚨地躲過惹(笑)。