從零開始學Vue(二~三)—— Vue 實例 / 模板語法(插值、指令)

概述

vue.js作爲現在筆記熱門的JS框架,使用比較簡單易上手,也成爲很多公司首選的JS框架。 但是對於初學者可能學起來有些麻煩,所以推出《從零開始學Vue》系列博客,本系列計劃推出19篇博客文章,在第一篇博客發佈之後,還是受到了大家的支持,所以本篇文章是一次性更新系列博客的第二和第三章,感謝大家支持哦! 如下是暫定的系列博客目錄,歡迎有興趣的同學關注學習~~

系列博客目錄一覽(暫定)

01 Vue.js入門 

02 Vue.js實例

03插值、指令

04過濾器Filters

05計算屬性Computed

06 Class與Style綁定

07 監聽屬性 Watch

08 條件渲染

09 列表渲染v-for

10 事件處理

11 初識組件

12 命令行工具(CLI)搭建

13 介紹vue-cli工程目錄結構

14 組件嵌套/組件CSS作用域Scoped

15 Props屬性傳值

16 傳值與傳址

17 自定義事件傳值

18 生命週期鉤子

19 路由

 

第二章  Vue 實例

2.1 創建一個 Vue 實例

每個 Vue 應用都是通過用 Vue 函數創建一個新的 Vue 實例開始的:

var vm = new Vue({

  // 選項

})

雖然沒有完全遵循 MVVM 模型,但是 Vue 的設計也受到了它的啓發。因此在文檔中經常會使用 vm (ViewModel 的縮寫) 這個變量名錶示 Vue 實例。

當創建一個 Vue 實例時,你可以傳入一個選項對象。這篇教程主要描述的就是如何使用這些選項來創建你想要的行爲。作爲參考,你也可以在 API 文檔 中瀏覽完整的選項列表。

一個 Vue 應用由一個通過 new Vue 創建的根 Vue 實例,以及可選的嵌套的、可複用的組件樹組成。舉個例子,一個 todo 應用的組件樹可以是這樣的:

根實例

└─ TodoList

   ├─ TodoItem

   │  ├─ DeleteTodoButton

   │  └─ EditTodoButton

   └─ TodoListFooter

      ├─ ClearTodosButton

      └─ TodoListStatistics

我們會在稍後的組件系統章節具體展開。不過現在,你只需要明白所有的 Vue 組件都是 Vue 實例,並且接受相同的選項對象 (一些根實例特有的選項除外)。

 

2.2 數據與方法

 

當一個 Vue 實例被創建時,它向 Vue 的響應式系統中加入了其 data 對象中能找到的所有的屬性。當這些屬性的值發生改變時,視圖將會產生“響應”,即匹配更新爲新的值。

// 我們的數據對象

var data = { a: 1 }

 

// 該對象被加入到一個 Vue 實例中

var vm = new Vue({

  data: data

})

 

// 它們引用相同的對象!

vm.a === data.a // => true

 

// 設置屬性也會影響到原始數據

vm.a = 2

data.a // => 2

 

// ……反之亦然

data.a = 3

vm.a // => 3

當這些數據改變時,視圖會進行重渲染。值得注意的是只有當實例被創建時 data 中存在的屬性纔是響應式的。也就是說如果你添加一個新的屬性,比如:

vm.b = 'hi'

那麼對 b 的改動將不會觸發任何視圖的更新。如果你知道你會在晚些時候需要一個屬性,但是一開始它爲空或不存在,那麼你僅需要設置一些初始值。比如:

data: {

  newTodoText: '',

  visitCount: 0,

  hideCompletedTodos: false,

  todos: [],

  error: null

}

這裏唯一的例外是使用 Object.freeze(),這會阻止修改現有的屬性,也意味着響應系統無法再追蹤變化。

var obj = {

  foo: 'bar'

}

 

Object.freeze(obj)

 

new Vue({

  el: '#app',

  data () {

    return {

      obj

    }

  }

})

<div id="app">

  <p>{{ obj.foo }}</p>

  <!-- 這裏的 `obj.foo` 不會更新! -->

  <button @click="obj.foo = 'baz'">Change it</button>

</div>

除了數據屬性,Vue 實例還暴露了一些有用的實例屬性與方法。它們都有前綴 $,以便與用戶定義的屬性區分開來。例如:

var data = { a: 1 }

var vm = new Vue({

  el: '#example',

  data: data

})

 

vm.$data === data // => true

 

// $watch 是一個實例方法

vm.$watch('a', function (newValue, oldValue) {

  // 這個回調將在 `vm.a` 改變後調用

})

以後可以在 API 參考中查閱到完整的實例屬性和方法的列表。

 

 

 

第三章  模板語法(插值、指令)

Vue.js 使用了基於 HTML 的模板語法,允許開發者聲明式地將 DOM 綁定至底層 Vue 實例的數據。所有 Vue.js 的模板都是合法的 HTML ,所以能被遵循規範的瀏覽器和 HTML 解析器解析。

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

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

接下來,給大家總結了模板語法中常用的插值、指令、用戶輸入、縮寫共四部分的知識點筆記。

3.1 插值

3.1.1 文本

 

數據綁定最常見的形式就是使用“Mustache”語法 (也就是雙大括號方式) 的文本插值:

<span>Message: {{ msg }}</span>

Mustache 標籤將會被替代爲對應數據對象上 msg 屬性的值。無論何時,綁定的數據對象上 msg 屬性發生了改變,插值處的內容都會更新。

 

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

<span v-once>這個將不會改變: {{ msg }}</span>

 

3.1.2 原始 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 插值,絕不要對用戶提供的內容使用插值。

3.1.3 特性

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> 元素中。

 

3.1.4 使用 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 } }}

 

模板表達式都被放在沙盒中,只能訪問全局變量的一個白名單,如 Math 和 Date 。你不應該在模板表達式中試圖訪問用戶定義的全局變量。

 

3.2 指令

 

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

<p v-if="seen">現在你看到我了</p>

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

3.2.1 參數

 

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

<a v-bind:href="url">...</a>

 

在這裏 href 是參數,告知 v-bind 指令將該元素的 href 屬性與表達式 url 的值綁定。

 

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

<a v-on:click="doSomething">...</a>

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

3.2.2 修飾符

 

修飾符 (Modifiers) 是以半角句號 . 指明的特殊後綴,用於指出一個指令應該以特殊方式綁定。

例如,.prevent 修飾符告訴 v-on 指令對於觸發的事件調用 event.preventDefault():

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

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

 

3.3 用戶輸入

3.3.1 鍵盤輸入

在 input 輸入框中,我們可以使用 v-model 指令來實現雙向數據綁定。

實例:根據用戶輸入信息進行數據實時更新

HTML:

<div id="app">

    <p>{{ message }}</p>

    <input v-model="message">

</div>

JS:

<script>

new Vue({

  el: '#app',

  data: {

    message: 'Runoob!'

  }

})

</script>

 

3.3.2 鼠標輸入

按鈕的事件,我們可以使用 v-on 監聽事件,並對用戶的輸入進行響應。

實例:在用戶點擊按鈕後,對字符串進行反轉操作。

HTML:

<div id="app">

    <p>{{ message }}</p>

    <button v-on:click="reverseMessage">反轉字符串</button>

</div>

JS:

<script>

new Vue({

  el: '#app',

  data: {

    message: 'Runoob!'

  },

  methods: {

    reverseMessage: function () {

      this.message = this.message.split('').reverse().join('')

    }

  }

})

</script>

 

3.4 縮寫

v- 前綴作爲一種視覺提示,用來識別模板中 Vue 特定的特性。當你在使用 Vue.js 爲現有標籤添加動態行爲 (dynamic behavior) 時,v- 前綴很有幫助,然而,對於一些頻繁用到的指令來說,就會感到使用繁瑣。同時,在構建由 Vue.js 管理所有模板的單頁面應用程序 (SPA - single page application) 時,v- 前綴也變得沒那麼重要了。因此,Vue.js 爲 v-bind 和 v-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 的瀏覽器都能被正確地解析。而且,它們不會出現在最終渲染的標記中。縮寫語法是完全可選的,但隨着你更深入地瞭解它們的作用,你會慶幸擁有它們。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章