1. 程式人生 > >vue2.0 入門總結

vue2.0 入門總結

1.生成vue的例項

var vm=new vue({

//這裡是選項  他可以包含資料、模板、掛載元素、方法、生命週期鉤子等函式

})

2.例項生命週期(在生命週期裡this指向呼叫它的vue例項)

created在例項被建立後呼叫

created(){

    this.hello();

}

vue2.0生命週期:

beforeCreate、created、beforeMount、mounted、beforeUpdate、updated、beforeDestroy、destroyed

3.模板語法(不使用模板可以使用render函式使用JSX語法)

底層實現上Vue將模板編譯成虛擬DOM渲染函式,在應用狀態改變時,vue計算出重新渲染元件的最小代價並應用到DOM上。

先看怎麼用

插值:雙大括號!!!!!!必須的  資料改變 大括號內的值也跟著改變 

<span>{{msg}}</span>

v-once

如果你想插入一次接下來大括號內的資料不改變 則新增v-once屬性:

<span v-once>不改變{{msg}}</span>

v-html

<span>{{msg}}</span>效果和<span v-html="msg"></span>相同 ,但是後者是將資料轉變為純文字 不是HTML 為了輸出HTML 所以使用v-html

v-bind

大括號不能在HTML屬性中使用 要使用v-bind

<span v-bind:id="msg"></span>

如果msg為false  移除屬性

<span></span>

使用JS表示式

{{msg+1}}

{{msg==true?0:1}}

4.指令

帶有v-字首

<div v-if="msg">如果msg為true則插入div標籤</div>

<div v-bind:id="msg">如果msg為false則移除屬性,否則顯示</div>

<div v-on:click="toDo">點選觸發函式</div>

<input v-model="msg"/>//雙向資料繫結

.....等等  vue還支援自定義指令。後面說。

指令縮寫

v-bind:href  或者 v-bind:id 可以縮寫為 :href  和:id 就是省略前面的 v-bind

v-on:click  縮寫為@click=""

5.計算屬性

computed 計算屬性會根據data 的值改變

<div>{{getNewMsg}}</div>

new Vue({

      el:'#App',

      data:{

            msg:'hello'

      },

      computed:{

            getNewMsg:function(){

                        return this.msg.split('').reverse().join('');

            } 

      }

})

上邊程式碼計算屬性只用到了get,沒有set。所以我們可以給自己一個set

new Vue({

      el:'#App',

      data:{

            msg:'hello',

            text:'word'

      },

      computed:{

            all:{

                      get:function(){

                                    return this.msg+this.text;

                       },

                     set:function(val){

                                   return val+this.msg+this.text

                      }

            }

      }

})

然後vm.all="你好" 會返回 你好 hello word

 

6.函式(methods)

methods也可以實現剛才computed的效果。

<div>{{getNewMsg}}</div>

new Vue({

      el:'#App',

      data:{

            msg:'hello'

      },

       methods:{

             getNewMsg:function(){

                   return this.msg.split('').reverse().join('');

            }

      }

})

computed和methods比較

雖然最終的結果相同,但是計算屬性基於快取依賴,只有在他依賴的資料發生改變才會重新計算取值,而methods 每次都會重新計算取值。

 

7.wach方法

用於觀察VUE例項上的資料變動

<div>{{msg}}</div>

new Vue({

      el:'#App',

      data:{

            msg:'hello',

            text:'word',

            all:''

      },

      watch:{

            msg:function(){

                  this.all=this.msg+this.text;

            }

      }

})

8.class與style繫結

<div class="boxStyle"  v-bind:class="{active:isActive}"></div>

如果isActive為false 則不顯示 active 這個class,否則相反。

class和v-bind:class可以共同使用。

class支援三目運算子  <div v-bind:class="active?style01:style02"></div>

內聯樣式  <div v-bind:style="{color:red,fontSize:fontSize+'px'}"></div>

還可以繫結到一個物件上

<div v-bind:style="obj"></div>

data(){

     return{

            obj:{

                     color:'red',

                      fontSize:'12px'

            }

     }

}

9.條件渲染

v-if 、 v-else、v-else-if

<div v-if="msg>0">大於0</div>

<div v-else-if="msg==0">等於0</div>

<div v-else>小於0</div>

還可以使用template

<template v-if="msg>0">

          <div>1111</div>

</template>

<template v-else>

        <div>2222</div>

</template>

上邊的程式碼修改msg切換不同的div內容,但是vue是不會重新渲染div標籤的。根據就地複用策略,只是替換div裡面的內容。如果想每次都重新渲染div標籤。需要使用key,key不同則每次重新渲染。

v-if 和 v-show

v-show只是控制display。

v-if有更高的切換消耗,v-show有更高的初始化消耗。

10.列表渲染

v-for

data(){

     return{

            parents:"我是",

            msg:[

                    {name:'foo'},

                    {name:'bar'},

             ]

      }

}

<div>

       <div v-for="{data,index} in msg">

              {{parents}}-{{index}}-{{data.name}}

       </div>

</div>

渲染結果: 我是-0-foo  我是-1-bar

 

11.事件處理器

使用template的好處

1。通過HTML模板就可以輕鬆定位JS對應方法

2。不需要JS手動繫結事件,易於測試

3。當viewmodel銷燬 所有的事件處理器自動刪除,無需手動刪除

<div v-on:click="msg">點選</div>

new Vue({

          el:'app',

          methods:{

          say:function(name,event){

                     alert(name+'我是vue')

                    if(event){event.preventDefault}

                    }

           }

})

如果要獲取原生DOM事件,需要傳入event

12.事件修飾符

.stop 元件單擊事件冒泡

.prevent   提交事件不在過載頁面

.capture   使用事件捕獲模式

.self          只當在本元素才發生

.once       新增

使用方式:

<div v-on:click.stop></div>

修飾符可以串聯

<div v-on:click.stop.prevent="todo"></div>

13.表單控制元件

v-model 實現雙向資料繫結

<span>{{msg}}</span>

<input v-model="msg"/>

new Vue({

    el:'#app',

   data:{

          msg:'我是預設'

   }

})

無論是複選框  單選框  下拉列表   基本上獲取到使用者選中的值的方式,就是使用v-model到一個數組

<input type="checkbox" id="jack" value="jack" v-model="checkedName"/>

<label for="jack">jack</label>

<input type="checkbox" id="mini" value="mini" v-model="checkedName"/>

<label for="mini">mini</label>

如果使用者選中,則陣列會把選中物件的value值存入陣列中。

14.修飾符

.lazy   取消input事件轉為change事件同步

.number   將使用者輸入的值轉為number型別,如果返回NAN,則返回原值

.trim      取消前後空格

使用方式:

<input v-model.lazy="msg"/>

15.元件

註冊全域性元件

Vue.component('my-component',{

    //選項

    data:function(){

              //在元件裡 data 必須是函式,並且不能使用箭頭函式

    }

})

註冊區域性元件

通過使用元件例項選項註冊,可以使元件在另一個元件中使用

var child={

template:'<div>我是元件</div>'

}

new Vue({

          components:{

                    'my-components ':child

           }

})

16.元件通訊

思想:父元件通訊子元件,使用props。子元件通訊父元件使用自定義事件,通過$on('事件名稱')監聽事件 和 $emit('事件名稱') 觸發事件。

如果使用vuex,在根元件註冊,我們在任意元件中都可以通過$store拿到store物件。如果子元件想要獲取到父元件的資料,或者說非父子元件想要拿到彼此的資料,最高效的方式是使用vuex。

但是,還是要說下基本的props用法。

props

Vue.components('child',{

          props :['msg'],

          template:'<div>{{msg}}</div>'

})

<child msg="hello"></child>

注意:因為HTML不區分大小寫,所以在傳遞props時,駝峰寫法要通過短橫線隔開

<div my-props="hello"></div>

Vue.components('child',{

        props:['myProps'],

        template:'<div>{{myProps}}</div>'

})

動態props

傳遞props使用 v-bind,這樣父元件修改子元件也得到修改

<div>

        <input  v-model="msg"/>

        <child v-bind:msg="msg"></child>

</div>

Vue.components('child',{

              props:['msg'],

              template:'<div>{{msg}}</div>'

})

字面量語法和動態語法

字面量:<child msg="1"></child>        props為   "1"

動態語法: <child v-bind:msg="1"></child>      props為   1

單向資料流

props是單向繫結的,父元件修改影響子元件,但是不能反過來,這是為了防止子元件修改父元件的狀態,讓資料流難以理解。

可以通過Vuex管理state,這樣子就避免了繁瑣的props傳遞。後面會發布VUEX講解的文章,請關注~

props驗證

只用於new建立的例項中,建立例項時傳遞 props。主要作用是方便測試。

支援型別:string  number  boolean  function  object   array

props:{

     msg:Number,//只檢測型別

    //檢測型別+其他驗證

    call:{

       type:Number,

        default:0,

        requiredLtrue,

        validator:function(val){

            return val>=0

        }

     }

}

自定義事件

使用 v-on 繫結事件

父元件在使用子元件的地方直接用v-on監聽子元件觸發的事件,  子元件觸發事件會觸發父元件事件

子元件中要使用this.$emit('事件',引數)

父元件就可以使用 $on去監聽

 例如 在父元件中:

<child v-on:子元件$emit的事件名稱="父元件事件名稱"></child>

非父子元件通訊

使用一個空的vue例項作為中央事件總棧

var bus=new Vue()

在A元件中觸發事件

bus.$emit('a',1);

在B元件建立的鉤子中監聽事件

bus.$on('a',function(id){

})

17.slot

在子元件中

<div>

           <h1>我是子元件標題</h1>

           <slot>只有在沒分發的內容才顯示</slot>

</div>

在父元件中

<div>

      <child>

             <p>這裡的內容會替換掉子元件中的slot</p>

     </child>

</div>

渲染結果為

<div>

        <div>

                <h1>我是子元件標題</h1>

              <p>這裡的內容會替換掉子元件中的slot</p>

       </div>

</div>

具名slot

給slot新增name屬性

在子元件中

<div>

           <h1>我是子元件標題</h1>

            <slot name="body">我是具名slot</slot>

</div>

在父元件中

<div>

           <child>

                   <div slot="body">這裡替換掉 name為body的slot</div>

           </child>

</div>

18.Render函式

不想使用template,也可以用render寫JSX。例如根據判斷自動生成DOM結構,如果大量的判斷用template會有大量的程式碼,這時候可以用render,使用createElement去建立標籤。

這裡只寫個小用法。

new Vue({

      el:"#app",

     render:h=>h(App)

})

如果不使用render我們可以這樣

new Vue({

          el:'#app',

          components:{App},

          template:'<App/>'

})

19.自定義指令

有時候我們需要對DOM元素進行底層操作,所以需要自定義事件。

全域性註冊

例如我們建立v-focus

Vue.directive('focus',{

     inserted:function(el){

          el.focus();

     }

})

區域性註冊

元件接收一個選項

directives:{

         focus:{

                   //指定的定義

         }

 }

使用:<div v-focus></div>

20.自定義指令鉤子函式

剛才我們全域性定義 用到了 inserted函式,這就是鉤子函式。

bind:function(){} //只調用一次,指令第一次繫結到元素時呼叫。

inserted:function(){} //被繫結元素插入到父節點 呼叫

update:function(){}  //更新時呼叫

componentUpdated:function(){}   //被繫結元素所在模板完成一次更新週期時呼叫

unbind:function(){}  //指令與元素解綁呼叫

20.自定義指令鉤子函式

剛才我們全域性定義 用到了 inserted函式,這就是鉤子函式。

bind:function(){} //只調用一次,指令第一次繫結到元素時呼叫。

inserted:function(){} //被繫結元素插入到父節點 呼叫

update:function(){}  //更新時呼叫

componentUpdated:function(){}   //被繫結元素所在模板完成一次更新週期時呼叫

unbind:function(){}  //指令與元素解綁呼叫

鉤子函式引數

el:指令繫結的元素物件

binding:一個obj物件,他包括以下屬性:

               name:指令名稱

               value:繫結的值

               oldValue:前一個值 只能在update函式和componentUpdate函式中使用

               expression:繫結的值是字串形式 例如  v-demo="1"  為1

               arg: 傳給指令的值  v-demo:foo   arg值為foo

               modifiers: 修飾符物件 只能在update函式和componentUpdate函式中使用

vnode:vue編譯生成的虛擬節點

oldVnode:上一個虛擬節點