一、ViewModel是Vue.js的核心,他是一個Vue實例。Vue實例是做用於摸一個html元素上的,這個元素能夠是html的body元素,也能夠是指定了ID的某個元素。 二、當建立了ViewModel後,雙向綁定時如何的達成的? ViewModel中有兩個在此咱們看作兩個插件(Dom Listeners和Data Bindings)而他們是實現雙向綁定的關鍵 三、從View一側看,viewModel中的DOM Listener會檢測頁面上DOM元素的變化,若是有變化,則更改Model上的數據 四、從Model一側看,當咱們更新Model數據時,Data Binddings會幫咱們更新頁面中的DOM元素
<!DOCTYPE html>
使用Vue的過程就是定義MVVM各個組成部分的過程的過程。 一、定義View 二、定義Model 三、建立一個Vue實例或"ViewModel",它用於鏈接View和Model 四、文本插值{{}} 運行時{{ message }}會被數據對象的message屬性替換
MVVM自己是實現了雙向綁定的,在Vue.js中可使用v-model指令在表單元素上建立雙向數據綁定 <!--這是View--> <div id="app"> <p>{{ message }}</p> <input type="text" v-model="message"/> </div> 將message綁定到文本框,當更改文本框的值時,<p>{{ message }}</p> 中的內容也會被更新。 相反,,若是改變message的值,文本框的值也會被更新
一、什麼是指令? Vue.js的指令是以v-開頭的,它們做用於HTML元素,指令提供了一些特殊的特性,將指令綁定在元素上時,指令會爲綁定的目標元素添加一些特殊的行爲,咱們能夠將指 令看做特殊的HTML特性(attribute)。 二、經常使用的內置指令 v-if指令 v-show指令 v-else指令 v-for指令 v-bind指令 v-on指令 自定義指令
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> </head> <body> <div id="app"> <h1>Hello, Vue.js!</h1> <h1 v-if="yes">Yes!</h1> <h1 v-if="no">No!</h1> <h1 v-if="age >= 25">Age: {{ age }}</h1> <h1 v-if="name.indexOf('jack') >= 0">Name: {{ name }}</h1> </div> </body> <script src="js/vue.js"></script> <script> var vm = new Vue({ el: '#app', data: { yes: true, no: false, age: 28, name: 'keepfool' } }) </script> </html> 運行結果: HELLO,,vue.js yes age:28 分析: 數據的yes屬性爲true,因此"Yes!"會被輸出; 數據的no屬性爲false,因此"No!"不會被輸出; 運算式age >= 25返回true,因此"Age: 28"會被輸出; 運算式name.indexOf('jack') >= 0返回false,因此"Name: keepfool"不會被輸出。
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> </head> <body> <div id="app"> <h1>Hello, Vue.js!</h1> <h1 v-show="yes">Yes!</h1> <h1 v-show="no">No!</h1> <h1 v-show="age >= 25">Age: {{ age }}</h1> <h1 v-show="name.indexOf('jack') >= 0">Name: {{ name }}</h1> </div> </body> <script src="js/vue.js"></script> <script> var vm = new Vue({ el: '#app', data: { yes: true, no: false, age: 28, name: 'keepfool' } }) </script> </html> 運行結果: HELLO,vue.js yes age:28 分析:不符合條件的會自動設置css屬性display:none樣式,可是會顯示在頁面上
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> </head> <body> <div id="app"> <h1 v-if="age >= 25">Age: {{ age }}</h1> <h1 v-else>Name: {{ name }}</h1> <h1>---------------------分割線---------------------</h1> <h1 v-show="name.indexOf('keep') >= 0">Name: {{ name }}</h1> <h1 v-else>Sex: {{ sex }}</h1> </div> </body> <script src="js/vue.js"></script> <script> var vm = new Vue({ el: '#app', data: { age: 28, name: 'keepfool', sex: 'Male' } }) </script> </html> 解析: v-else元素是否渲染在HTML中,取決於前面使用的是v-if仍是v-show指令。 這段代碼中v-if爲true,後面的v-else不會渲染到HTML;v-show爲tue,可是後面的v-else仍然渲染到HTML了。
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> <link rel="stylesheet" href="styles/demo.css" /> </head> <body> <div id="app"> <table> <thead> <tr> <th>Name</th> <th>Age</th> <th>Sex</th> </tr> </thead> <tbody> <tr v-for="person in people"> <td>{{ person.name }}</td> <td>{{ person.age }}</td> <td>{{ person.sex }}</td> </tr> </tbody> </table> </div> </body> <script src="js/vue.js"></script> <script> var vm = new Vue({ el: '#app', data: { people: [{ name: 'Jack', age: 30, sex: 'Male' }, { name: 'Bill', age: 26, sex: 'Male' }, { name: 'Tracy', age: 22, sex: 'Female' }, { name: 'Chris', age: 36, sex: 'Male' }] } }) </script> </html>
下面這段代碼構建了一個簡單的分頁條,v-bind指令做用於元素的class特性上。javascript
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> <link rel="stylesheet" href="styles/demo.css" /> </head> <body> <div id="app"> <ul class="pagination"> <li v-for="n in pageCount"> <a href="javascripit:void(0)" v-bind:class="activeNumber === n + 1 ? 'active' : ''">{{ n + 1 }}</a> </li> </ul> </div> </body> <script src="js/vue.js"></script> <script> var vm = new Vue({ el: '#app', data: { activeNumber: 1, pageCount: 10 } }) </script> </html> 注意v-for="n in pageCount"這行代碼,pageCount是一個整數,遍歷時n從0開始,而後遍歷到pageCount –1結束。
有兩種形式調用方法:綁定一個方法(讓事件指向方法的引用),或者使用內聯語句。 Greet按鈕將它的單擊事件直接綁定到greet()方法,而Hi按鈕則是調用say()方法。 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> </head> <body> <div id="app"> <p><input type="text" v-model="message"></p> <p> <!--click事件直接綁定一個方法--> <button v-on:click="greet">Greet</button> </p> <p> <!--click事件使用內聯語句--> <button v-on:click="say('Hi')">Hi</button> </p> </div> </body> <script src="js/vue.js"></script> <script> var vm = new Vue({ el: '#app', data: { message: 'Hello, Vue.js!' }, // 在 `methods` 對象中定義方法 methods: { greet: function() { // // 方法內 `this` 指向 vm alert(this.message) }, say: function(msg) { alert(msg) } } }) </script> </html>
Vue.js爲最經常使用的兩個指令v-bind和v-on提供了縮寫方式。v-bind指令能夠縮寫爲一個冒號,v-on指令能夠縮寫爲@符號。 <!--完整語法--> <a href="javascripit:;" v-bind:class="activeNumber">{{ n + 1 }}</a> <!--縮寫語法--> <a href="javascripit:;" :class="activeNumber">{{ n + 1 }}</a> <!--完整語法--> <button v-on:click="greet">Greet</button> <!--縮寫語法--> <button @click="greet">Greet</button>