1. 程式人生 > >Vue.js的學習筆記

Vue.js的學習筆記

Vue.js

1.簡介

vue介紹:vue是一個興起的前端js庫,是一個精簡的MVVM。從技術角度講,Vue.js 專注於 MVVM 模型的 ViewModel 層。它通過雙向資料繫結把 View 層和 Model 層連線了起來,通過對資料的操作就可以完成對頁面檢視的渲染。當然還有很多其他的mvmm框架如Angular,React都是大同小異,本質上都是基於MVVM的理念。 然而vue以他獨特的優勢簡單,快速,組合,緊湊,強大而迅速崛起 

 

官方線上文件:https://cn.vuejs.org/v2/guide/index.html

瞭解Vue.js :https://www.cnblogs.com/Renyi-Fan/p/9419742.html#_label0_18

 

作為興起的框架,Vue.js拋棄了對IE8的支援,移動端支援安卓4.2+  和IOS7+

在使用之前首先需要匯入Vue.js的庫:<script src="js/vue.js"></script>

 

Vue.js的Hell word:  

記住一點,寫有Vue語句的script放在html程式碼的下面,否則不會實現效果

<div id="app">{{message}}</div>

<script>
    new Vue({


        el: '#app',
        data: {
            message: 'Hello world'
        }
    });
</script>

將js中message的值替換到了HTML模版中{{message}}中

 

特性1:資料繫結

H1顯示的內容繫結你文字框中內容   v-model為資料繫結元件

一切使用vue從 new Vue開始,這一步不可缺少

<div id="app">
  <h1>Your input is {{message}}</h1>
    <input type="text" v-model="message">
</div>

<script>
    var vm = new Vue({
        el: '#app',
        data: {
            message: 'Hello world'
        }
    });
</script>

 

特性2:元件化(自定義HTML標籤)

<div id="app">
    <message content="Hello World"></message>
</div>
<script>
    var Message = Vue.extend({

        props: ['content'],
        template: '<h1>{{content}}</h1>'
    });

    Vue.component('message', Message);
    var vm = new Vue({
        el: '#app',
    });
</script>

 

  1. 基礎特性

2.1例項及選項

Vue.js的使用都是通過建構函式Vue{{option}}建立一個Vue的例項:

Var vm=new Vue({}).一個Vue例項相當於一個MVVM模式中的ViewModel,如圖:

在例項化時我們可以傳入一個選項物件,包含資料,模版,掛載元素,方法,生命週期鉤子等選項.

 

2.1.1模版

選項中主要影響模版或DOM的選項有el和template,屬性replace和template需要一起使用

el:型別為字串,DOM元素或函式,例如el:’#app’ 在初始項中指定了el,例項將立即進入編譯過程

template:型別為字串.預設將template值替換掛載元素(el值對應的元素).例子如下:

<div id="app">
    <p>123</p>
</div>
<script id="tpl" type="x-template">
<div class="tpl">
    <a>This</a>
</div>
</script>
<script type="text/javascript">
    var vm=new Vue({
        el:'#app',
        template:'#tpl'
    })
</script>

頁面顯示的只有This,原因就是因為用#tpl的內容把#app給代替了.

 

2.1.2 資料

Vue.js通過data屬性定義資料   使用data的注意事項:1.data的值必須是一個函式,並且返回值是原始物件

2.data中的屬性和props中的不能重名.

var data={a:1}
var vm=new Vue({
    data:data
})
    vm.$data===data//true
    vm.a===data.a//true
    //設定屬性會影響到原始資料
    vm.a=2
    data.a//2
    //反之亦然
    data.a=3
    vm.a//3

 

自定義一個標籤,然後給標籤定義屬性 解析:

My-component是標籤名 ,props用來繫結屬性,data定義資料,給desc賦值為123,template為模版,具體表名標籤的內容.

<div id="app">
    <my-component title="myTitle" content="myContent"> </my-component>
</div>
<script>
    var Mycomponent = Vue.component('my-component', {
        props: ['title', 'content'],
        data: function () {
            return {
                desc: '123'
            }
        },
        template: '<div><h1>{{title}}</h1><p>{{content}}</p><p>{{desc}}</p></div>'
    })
    new Vue({
        el:'#app'
    })
</script>

 

2.1.3方法

我們可以通過屬性methods物件來定義方法,並且使用v-on指令來監聽DOM事件,例如:

<div id="app">
<button v-on:click="alert">alert</button>
</div>
<script>
new Vue({
    el:'#app',
    data:{a:1},
    methods:{
        alert:function () {
            alert(this.a)
        }
    }
})
</script>

 

2.1.4生命週期

2.2資料繫結

Vue.js的核心是一個響應式的資料繫結系統,建立繫結後,DOM將和資料保持同步,無需手動維護DOM,是程式碼簡潔易懂.

2.2.1資料繫結語法

v-bind:id可以簡寫為:id,這時中間的div的id為id-1,span標籤顯示的值為names的數值

<div id="app">
<span v-once="name">{{names}}</span>
    <div v-bind:id="'id-'+id"></div>
</div>

var vm = new Vue({
    el: '#app',
    data: {
        id: 1,
        index: 0,
        name: 'vue',
        avatar: 'http://...',
        count: [1, 2, 3, 4, 5],
        names: ['vuel.0', 'vue2.0'],
        items: [
            {name: 'vue1.0', version: '1.0'},
            {name: 'vue1.0', version: '1.0'}
        ]
    }
});

 

在{{}}中的資料能使用表示式,但是每個繫結值只能使用單個表示式,不支援正則表示式

{{index==0?'a':'b'}}<br>
{{index+1}}<br>
{{name.split('').join('|')}}

 

指令

格式:v-

  1. 引數

<img v-bind:src=”avatar”/>
指令v-bind可以在後面帶一個引數,用冒號(:)隔開,src即引數.此時img標籤中的src會與vm例項中的acatar繫結,等同於<img src=”{{acatar}}”>

  1. 修飾符

以半形句號.開始的特殊字尾,用於表示指令應該以特殊方式繫結.
<button v-on:click.stop=”doClick”></button>
v-on的作用是在對應的DOM元素上繫結事件監聽器doClick為函式名,stop為修飾符,作用是停止冒泡,相等於呼叫了e.stopPropagation()

 

2.2.2計算屬性

1.computed為計算,它生產了一個物件 fullname的物件,這個物件將 vm這個Vue物件中的data中的兩個數值相加,this指的是當前的Vue物件.

<div id="app">
    <p>{{firstname}}</p>
    <p>{{lastname}}</p>
    <p>{{fullname}}</p>
</div>
<script>
    var vm = new Vue({
        el: '#app',
        data: {
            firstname: 'Gavin',
            lastname: 'GLY'
        },
        computed: {
            fullname: function () {
                return this.firstname + '' + this.lastname
            }
        }
    });
</script>

當你在瀏覽器中的控制檯輸出vm.firstname=’xxx’的時候,將會把fullname和firstname的值都改變

 

2.Setter

頁面顯示為1.00,這種方式能處理價格能避免前後端資料型別轉換產生的問題

在更改vm.price=2,vm.cents會更新為200,傳給後端就無需轉換資料

 

<div id="app">
    <p>{{price}}</p>
</div>
<script>
    var vm = new Vue({
        el: '#app',
        data: {
            cents: 100,
        },
        computed: {
            price: {
                set: function (newValue) {
                    this.cents = newValue * 100;
                }, get: function () {
                    return (this.cents/100).toFixed(2);
                }
            }
        }
    })
</script>

 

2.2.3表單控制元件

v-model代表當前標籤繫結一個值,繫結的值顯示的就是這個標籤當前的狀態

<div id="app">
    <!--text 使用者輸入和顯示一致-->
    <input type="text" v-model="message">
    <span>輸入為:{{message}}</span>
    <!--Radio 單選框--><br>
    <label><input type="radio" value="male" v-model="gender"></label>
    <label><input type="radio" value="female" v-model="gender"></label>
    <p>{{gender}}</p>
    <!--Checkbox 單選--><br>
    <input type="checkbox" v-model="checked">
    <span>checked:{{checked}}</span>
    <!--多選--><br>
    <label><input type="checkbox" value="1" v-model="multiChecked">1</label>
    <label><input type="checkbox" value="2" v-model="multiChecked">2</label>
    <label><input type="checkbox" value="3" v-model="multiChecked">3</label>
    <p>multiChecked:{{multiChecked.join('|')}}</p>
    <!--select 單選--><br>
    <select v-model="selected">
        <option >A</option>
        <option >B</option>
        <option >C</option>
    </select>
    <span>selected:{{selected}}</span>
    <!--多選--><br>
    <select v-model="multiselected" multiple>
        <option>A</option>
        <option>B</option>
        <option>C</option>
    </select><br>
    <span>multiselected:{{multiselected}}</span>
    <!--繫結value 選中的話checked的值為a,未選中的話就是b-->
    <input type="checkbox" v-model="checked" v-bind:true-value="a" v-bind:false-value="b">
</div>
<script>
    var vm = new Vue({
        el: '#app',
        data: {
            a:'123',
            b:'321',
            message: '',
            gender: '',
 &nbs