1. 程式人生 > >Vuejs——Vue生命周期,數據,手動掛載,指令,過濾器

Vuejs——Vue生命周期,數據,手動掛載,指令,過濾器

content 插入內容 nbsp 十六 管道符 大括號 數字 tro 表達

目錄(?)[+]

原教程:

http://cn.vuejs.org/guide/instance.html

http://cn.vuejs.org/guide/syntax.html

本博文是在原教程的基礎上加上實例,並嘗試說明的更詳細。

(十)Vue實例的生命周期

如圖:(我自己翻譯的中文版,英文版請查看本博文頂部的,第一個鏈接)

技術分享


(八)傳入的數據綁定

先創建一個對象(假如是obj),然後將他傳入Vue實例中,作為data屬性的值,那麽

①obj的值的變化,將影響Vue實例中的值的變化;

②相反一樣;

③可以在Vue實例外面操縱obj,一樣對Vue實例有影響;

④獲取obj.a的值(假如他有這個屬性),可以通過Vue實例(例如變量vm),vm.a這樣的形式來獲取(他們是等價的,也是綁定的);

⑤後續添加的數值是無效的

例如:

  1. <div id="app">
  2. {{a}}
  3. </div>
  4. <button onclick="add()">+1</button>
  5. <script>
  6. var obj = {a: 1}
  7. var vm = new Vue({
  8. el: ‘#app‘,
  9. data: obj
  10. })
  11. function add() {
  12. //vm.a++;
  13. obj.a++;
  14. }
  15. </script>

add函數中兩條語句效果是等價的,都可以讓顯示的值+1

但若將代碼改成這樣:

  1. var obj = {b: 1}
  2. var vm = new Vue({
  3. el: ‘#app‘,
  4. data: obj
  5. })
  6. function add() {
  7. obj.a = 1;
  8. }

那麽在點擊按鈕後,並不會顯示值(沒有綁定)。

註意:即使修改為vm.a=1也是無效

準確的說,在Vue實例創建後,添加新的屬性到實例上,是不會觸發視圖更新的。

在以上情況下,obj.a === vm.a ,註意,a之前沒有data。

函數:

  1. function test() {
  2. if (vm.a === obj.a) {
  3. console.log("vm.a === obj.a");
  4. }
  5. }

其判斷條件是true

(九)Vue實例暴露的接口

在上一篇中,提到vm.a=obj.a這個;然而我們並沒有獲取全部的data這個屬性;

而Vue提供了幾個暴露的接口:

接口(假設實例為vm)

效果

vm.$data

是vm的data屬性

vm.$el

是vm的el屬性所指向的dom結點

vm.$watch

示例:

vm.$watch(“a”,function(newVal, oldVal){})

當data裏的a變化時,會觸發回調函數

更多的可以查看

http://cn.vuejs.org/api/

搜索 $ 作為關鍵詞來查看。

(十一)$mount()手動掛載

當Vue實例沒有el屬性時,則該實例尚沒有掛載到某個dom中;

假如需要延遲掛載,可以在之後手動調用vm.$mount()方法來掛載。例如:

  1. <div id="app">
  2. {{a}}
  3. </div>
  4. <button onclick="test()">掛載</button>
  5. <script>
  6. var obj = {a: 1}
  7. var vm = new Vue({
  8. data: obj
  9. })
  10. function test() {
  11. vm.$mount("#app");
  12. }

初始,顯示的是{{a}}

當點擊按鈕後,變成了1

(十二)用Vue的v-for寫一個表格

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <title>Vue</title>
  5. <script src="vue.js"></script>
  6. </head>
  7. <body>
  8. <div id="app">
  9. <button onclick="load()">點擊掛載表格</button>
  10. </div>
  11. <style>
  12. table {
  13. border-collapse: collapse;
  14. border-spacing: 0;
  15. border-left: 1px solid #888;
  16. border-top: 1px solid #888;
  17. background: #efefef;
  18. }
  19. th, td {
  20. border-right: 1px solid #888;
  21. border-bottom: 1px solid #888;
  22. padding: 5px 15px;
  23. }
  24. th {
  25. font-weight: bold;
  26. background: #ccc;
  27. }
  28. </style>
  29. <script>
  30. var obj = {
  31. grid: [
  32. {id: "ID", name: "名字", description: "描述", clickButton: "點擊事件"},
  33. {id: "1", name: "a", description: "amorous", clickButton: "點擊彈窗"},
  34. {id: "2", name: "b", description: "beautiful", clickButton: "點擊彈窗"},
  35. {id: "3", name: "c", description: "clever", clickButton: "點擊彈窗"},
  36. {id: "4", name: "d", description: "delicious", clickButton: "點擊彈窗"},
  37. ]
  38. }
  39. var vm = new Vue({
  40. data: obj,
  41. template: ‘<table><tr v-for="row in grid">‘ +
  42. ‘<td>{{row.id}}</td>‘ +
  43. ‘<td>{{row.name}}</td>‘ +
  44. ‘<td>{{row.description}}</td>‘ +
  45. ‘<td><button v-on:click="alert($index)">{{row.clickButton}}</button></td>‘ +
  46. ‘</tr></table>‘,
  47. methods: {
  48. alert: function (index) {
  49. alert("該行是第" + index + "行")
  50. }
  51. }
  52. })
  53. function load() {
  54. vm.$mount("#app");
  55. }
  56. </script>
  57. </body>
  58. </html>


(十三)數據綁定:

html標簽的純文本顯示/被當做html標簽處理;

插值單次更新;

①使用兩個大括號時,假如字符串內容是html標簽,那麽不會被轉義,而是正常顯示;

②使用三個打括號時,字符串內的html標簽會被直接轉義,

例如:

  1. <div id="app">
  2. {{html}}
  3. </div>
  4. <script>
  5. var vm = new Vue({
  6. el:"#app",
  7. data: {
  8. html:"<span>span</span>"
  9. }
  10. })
  11. </script>

屏幕上顯示內容是:

  1. <span>span</span>

如果是三個大括號包含變量名:

  1. <div id="app">
  2. {{{html}}}
  3. </div>
  4. <script>
  5. var vm = new Vue({
  6. el:"#app",
  7. data: {
  8. html:"<span>span</span>"
  9. }
  10. })
  11. </script>
  12. <script>
  13. function load() {
  14. vm.$mount("#app");
  15. }
  16. </script>

顯示的內容則只有

span

③插入內容的數據綁定無效(在沒有使用partials的情況下)

使用兩個大括號或者三個大括號都一樣

例如,將②中的html改為以下值

  1. data: {
  2. html: "<span>span{{val}}</span>",
  3. val: "11"
  4. }

顯示結果乃是:

span{{val}}

說明沒有綁定數據;

按照說明,使用partials可以綁定

http://cn.vuejs.org/api/#partial

不過不會用,等研究明白了再說

④禁止在用戶提交的內容上動態渲染,否則會受到XSS攻擊

⑤插值也可以用在html標簽的屬性中,例如class,或者id,或者其他。

但是Vue.js的指令和特殊特性內是不可以用插值的。

(十四)綁定表達式

插值的位置,可以使用JavaScript的表達式,例如:

  1. <div id="app">
  2. {{html?html:val}}
  3. </div>
  4. <script>
  5. var vm = new Vue({
  6. el: "#app",
  7. data: {
  8. html: "",
  9. val: "11"
  10. }
  11. })
  12. </script>

例如以上示例,

假如有html值,則輸出hmtl值,否則輸出val值;

也可以輸出字符串,例如改為:

  1. {{html?html:"no words"}}

則輸出no words

但是只能輸出表達式,不能輸出比如函數,或者直接放個v-for標簽之類的。

但是我推斷後者應該可以,可能是我寫的方法不對。


(十五)過濾器

①簡單來說,在插值中,加入管道符“|”,然後過濾器會生效。

例如:

capitalize這個過濾器,會將字符串的首字母大寫

  1. <div id="app">
  2. {{{html|capitalize}}}
  3. </div>
  4. <script>
  5. var vm = new Vue({
  6. el: "#app",
  7. data: {
  8. html: "abc",
  9. val: "11"
  10. }
  11. })
  12. </script>

輸出值是Abc

如果是漢字、數字、或者是本身首字母就大寫了,則無反應。

②過濾器不能充當表達式使用,因此不能在表達式內使用過濾器,只能在表達式的後面使用。

例如:

  1. {{html[0]|capitalize}}

是可以的,會輸出html的首個字母並將其大寫;

  1. (html|capitalize)[0]

是會報錯的(不加括號也報錯),說明,不能將過濾器視為表達式的一部分

③過濾器可以加參數。

第一個參數:固定為表達式的值(被過濾目標);

第二個參數,過濾器後面的第一個單詞;

第三個參數,過濾器後面的第二個單詞,依次類推。

參數加引號則視為字符串,參數不加引號則視為表達式,表達式的值作為參數傳遞給過濾器。

官方例子是:

{{ message | filterA ‘arg1‘ arg2 }}

④過濾器可以自己手寫

(十六)指令

①指令(Directives)就是特殊的,以帶有前綴v-的特性。

簡單粗暴來說,標簽裏v-開頭的就是指令(當然,要Vue能支持)。

指令的值限定為 綁定表達式,就是等號後引號裏的。

如:

  1. <div id="app">
  2. <div v-if="html">
  3. {{val}}
  4. </div>
  5. <button onclick="test()">消失上一行</button>
  6. </div>
  7. <script>
  8. var vm = new Vue({
  9. el: "#app",
  10. data: {
  11. html: "abc",
  12. val: "11"
  13. }
  14. })
  15. function test() {
  16. vm.html = "";
  17. }
  18. </script>

輸出11

其中<div v-if=”html”>就是指令,

可以通過點擊按鈕讓那一行消失(因為html的值被設置為空)

②指令後面可以添加參數:

有些指令(例如v-bind)可以在名稱後等號前,添加一個屬性,這個屬性的作用是響應性的更新HTML特性。

例如:

  1. <style>
  2. .white {
  3. white;
  4. }
  5. .black {
  6. black;
  7. }
  8. </style>
  9. <div id="app">
  10. <div v-bind:class="BC">背景顏色變化</div>
  11. <button onclick="test()">消失上一行</button>
  12. </div>
  13. <script>
  14. var vm = new Vue({
  15. el: "#app",
  16. data: {
  17. BC: "black"
  18. }
  19. })
  20. function test() {
  21. vm.BC = "white";
  22. }
  23. </script>

初始情況下,這個div的class和data裏的BC綁定,由於BC的值是black,那麽相當於v-bind所在的標簽的class=”black”,所以初始情況下,背景顏色為黑色。

當點擊按鈕後,BC的值被更改為white,那麽相當於標簽的class=”white”,而類white的背景顏色為白色,所以該div的背景顏色變成了白色。

類似的有v-on:click事件,表示監視的是click事件,也可以改為

  1. <div v-on:mouseup="alert">背景顏色變化</div>

表示該標簽當鼠標彈起的時候,執行methods的alert函數。

③修飾符

修飾符用於表示指令應當以特殊的方式進行綁定。

例如:.literal修飾符告訴指令應當將他的值解析為字符串,而不是表達式

或者是keydown.enter表示按回車鍵時調用函數

  1. <input v-on:keydown.enter="alert"></input>

Vuejs——Vue生命周期,數據,手動掛載,指令,過濾器