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


 

目錄(?)[+]

 

原教程:

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.   
  20.     th, td {  
  21.         border-right: 1px solid #888;  
  22.         border-bottom: 1px solid #888;  
  23.         padding: 5px 15px;  
  24.     }  
  25.   
  26.     th {  
  27.         font-weight: bold;  
  28.         background: #ccc;  
  29.     }  
  30. </style>  
  31. <script>  
  32.     var obj = {  
  33.         grid: [  
  34.             {id: "ID", name: "名字", description: "描述", clickButton: "點擊事件"},  
  35.             {id: "1", name: "a", description: "amorous", clickButton: "點擊彈窗"},  
  36.             {id: "2", name: "b", description: "beautiful", clickButton: "點擊彈窗"},  
  37.             {id: "3", name: "c", description: "clever", clickButton: "點擊彈窗"},  
  38.             {id: "4", name: "d", description: "delicious", clickButton: "點擊彈窗"},  
  39.         ]  
  40.     }  
  41.     var vm = new Vue({  
  42.         data: obj,  
  43.         template: '<table><tr v-for="row in grid">' +  
  44.         '<td>{{row.id}}</td>' +  
  45.         '<td>{{row.name}}</td>' +  
  46.         '<td>{{row.description}}</td>' +  
  47.         '<td><button v-on:click="alert($index)">{{row.clickButton}}</button></td>' +  
  48.         '</tr></table>',  
  49.         methods: {  
  50.             alert: function (index) {  
  51.                 alert("該行是第" + index + "行")  
  52.             }  
  53.         }  
  54.     })  
  55.     function load() {  
  56.         vm.$mount("#app");  
  57.     }  
  58. </script>  
  59. </body>  
  60. </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.   
  6.     .black {  
  7.         black;  
  8.     }  
  9. </style>  
  10. <div id="app">  
  11.     <div v-bind:class="BC">背景顏色變化</div>  
  12.     <button onclick="test()">消失上一行</button>  
  13. </div>  
  14. <script>  
  15.     var vm = new Vue({  
  16.         el: "#app",  
  17.         data: {  
  18.             BC: "black"  
  19.         }  
  20.     })  
  21.     function test() {  
  22.         vm.BC = "white";  
  23.     }  
  24. </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>  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM