Vue.js

朋友,這篇是寫給自己看的。所以你們可以跳過了,不然可能會覺得莫名奇妙 =V= 推薦看這個 Vue.js

Vue.js是當下很火的一個JavaScript MVVM庫,它是以數據驅動和組件化的思想構建的。無需手動操作DOM。它通過一些特殊的HTML語法,將DOM和數據綁定起來。一旦你創建了綁定,DOM將和數據保持同步,每當變更了數據,DOM也會相應地更新。

簡單的Hello World實現:

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title></title>
    </head>

    <body>
        <!--這是我們的View-->
        <div id="app">
            {{ message }}
        </div>
    </body>
    <script src="js/vue.js"></script>
    <script>
        // 這是我們的Model
        var exampleData = {
            message: 'Hello World!'
        }

        // 創建一個 Vue 實例或 "ViewModel"
        // 它連接 View 與 Model
        new Vue({
            el: '#app',
            data: exampleData
        })
    </script>
</html>

Vue.js的常用指令
1 v-if指令是根據條件表達式的值來執行元素的插入或者刪除行爲。就是表達式爲true才輸出,爲false不輸出該HTML

<!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

2 v-show也是條件渲染指令,和v-if指令不同的是,使用v-show指令的元素始終會被渲染到HTML,它只是簡單地爲元素設置CSS的style屬性。就是HTML標籤始終渲染,只不過v-show爲true時渲染CSS的style,爲false時沒有不渲染CSS屬性

3 v-else指令爲v-if或v-show添加一個“else塊”。v-else元素必須立即跟在v-if或v-show元素的後面——否則它不能被識別。

4 v-for指令基於一個數組渲染一個列表,它和JavaScript的遍歷語法相似:
   v-for=”item in items”

<tr v-for="person in people">
         <td>{{ person.name }}</td>
         <td>{{ person.age  }}</td>
         <td>{{ person.sex  }}</td>
</tr>

5 v-bind指令可以在其名稱後面帶一個參數,中間放一個冒號隔開,這個參數通常是HTML元素的屬性,例如:v-bind:class
這個要多看看實例理解一下

6 v-on指令用於給監聽DOM事件,它的用語法和v-bind是類似的,如 <a v-on:click="doSomething"> 有兩種形式調用方法:綁定一個方法(讓事件指向方法的引用),或者使用內聯語句。

<!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>

7 v-model 實現雙向綁定

<!--這是我們的View-->
<div id="app">
    <p>{{ message }}</p>
    <input type="text" v-model="message"/>
</div>

這裏p的值和input的值綁定在了一起,一方改變,另一方跟着改變
這裏寫圖片描述

8 v-bind和v-on的縮寫
Vue.js爲最常用的兩個指令v-bind和v-on提供了縮寫方式。v-bind指令可以縮寫爲一個冒號,v-on指令可以縮寫爲@符號。

<!--完整語法-->
<a href="javascripit:void(0)" v-bind:class="activeNumber === n + 1 ? 'active' : ''">{{ n + 1 }}</a>
<!--縮寫語法-->
<a href="javascripit:void(0)" :class="activeNumber=== n + 1 ? 'active' : ''">{{ n + 1 }}</a>

<!--完整語法-->
<button v-on:click="greet">Greet</button>
<!--縮寫語法-->
<button @click="greet">Greet</button>

9 v-html 用於輸出HTML片段


  <div v-html="message"></div>

  data: {
    message: '<h1>華晨宇</h1>'
  }

綜合示例

<!DOCTYPE html>
<html>

    <head>
        <meta charset="UTF-8">
        <title></title>
        <link rel="stylesheet" href="styles/demo.css" />
    </head>

    <body>
        <div id="app">

            <fieldset>
                <legend>
                    Create New Person
                </legend>
                <div class="form-group">
                    <label>Name:</label>
                    <input type="text" v-model="newPerson.name"/>
                </div>
                <div class="form-group">
                    <label>Age:</label>
                    <input type="text" v-model="newPerson.age"/>
                </div>
                <div class="form-group">
                    <label>Sex:</label>
                    <select v-model="newPerson.sex">
                    <option value="Male">Male</option>
                    <option value="Female">Female</option>
                </select>
                </div>
                <div class="form-group">
                    <label></label>
                    <button @click="createPerson">Create</button>
                </div>
        </fieldset>
        <table>
            <thead>
                <tr>
                    <th>Name</th>
                    <th>Age</th>
                    <th>Sex</th>
                    <th>Delete</th>
                </tr>
            </thead>
            <tbody>
                <tr v-for="person in people">
                    <td>{{ person.name }}</td>
                    <td>{{ person.age }}</td>
                    <td>{{ person.sex }}</td>
                    <td :class="'text-center'"><button @click="deletePerson($index)">Delete</button></td>
                </tr>
            </tbody>
        </table>
        </div>
    </body>
    <script src="js/vue.js"></script>
    <script>
        var vm = new Vue({
            el: '#app',
            data: {
                newPerson: {
                    name: '',
                    age: 0,
                    sex: 'Male'
                },
                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'
                }]
            },
            methods:{
                createPerson: function(){
                    this.people.push(this.newPerson);
                    // 添加完newPerson對象後,重置newPerson對象
                    this.newPerson = {name: '', age: 0, sex: 'Male'}
                },
                deletePerson: function(index){
                    // 刪一個數組元素
                    this.people.splice(index,1);
                }
            }
        })
    </script>

</html>

這裏寫圖片描述

注意,這裏拿索引用了$index,另外一種方法就是

<tr v-for="(index,person) in people">

然後直接用index表示索引



過濾器
過濾器函數接受表達式的值作爲第一個參數,第二個參數是過濾器。用“|”表示。{{ message | capitalize }},message 是參數,capitalize 是過濾方法
在實例中定義過濾方法和參數:

new Vue({
  el: ……,
  data: {
    message: ……
  },
 filters: {
    capitalize: function () {
      ……
    }
  }
})

Vue.js組件

<div id="app">
    // 這裏調用組件時需要傳入相應的message
    <child message="hello!"></child>
</div>

<script>
// 註冊
Vue.component('child', {
  // 聲明 props
  props: ['message'],
  // 因爲組件渲染用到了message,所以需要聲明props
  template: '<span>{{ message }}</span>'
})
// 創建根實例
new Vue({
  el: '#app'
})
</script>

動態prop

<div id="app">
    <div>
      <input v-model="parentMsg">
      <br>
      <child v-bind:message="parentMsg"></child>
      // 這裏message不是一個固定的值,而是一個數據變量
    </div>
</div>

<script>
// 註冊
Vue.component('child', {
  // 聲明 props
  props: ['message'],
  // 同樣也可以在 vm 實例中像 "this.message" 這樣使用
  template: '<span>{{ message }}</span>'
})
// 創建根實例
new Vue({
  el: '#app',
  data: {
    parentMsg: '父組件內容'
  }
})
</script>

自定義指令

<div id="app">
    <p>頁面載入時,input 元素自動獲取焦點:</p>
    <input v-focus>
</div>

<script>
// 註冊一個全局自定義指令 v-focus
Vue.directive('focus', {
  // 當綁定元素插入到 DOM 中。
  inserted: function (el) {
    // 聚焦元素
    el.focus()
  }
})
// 創建根實例
new Vue({
  el: '#app'
})
</script>

路由
VUE路由

發佈了36 篇原創文章 · 獲贊 6 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章