vuejs2.0 入門總結(jié)

生成vue的實(shí)例

var vm=new vue({

//這里是選項(xiàng)? 他可以包含數(shù)據(jù)骂维、模板、掛載元素贺纲、方法航闺、生命周期鉤子等函數(shù)

})

實(shí)例生命周期(在生命周期里this指向調(diào)用它的vue實(shí)例)

created在實(shí)例被創(chuàng)建后調(diào)用

created(){

? ? this.hello();

}

vue2.0生命周期:

beforeCreate、created猴誊、beforeMount潦刃、mounted、beforeUpdate懈叹、updated乖杠、beforeDestroy、destroyed

模板語法(不使用模板可以使用render函數(shù)使用JSX語法)

底層實(shí)現(xiàn)上Vue將模板編譯成虛擬DOM渲染函數(shù)澄成,在應(yīng)用狀態(tài)改變時胧洒,vue計(jì)算出重新渲染組件的最小代價并應(yīng)用到DOM上。

先看怎么用

插值:雙大括號!!!!!!必須的? 數(shù)據(jù)改變 大括號內(nèi)的值也跟著改變?

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

v-once

如果你想插入一次接下來大括號內(nèi)的數(shù)據(jù)不改變 則添加v-once屬性

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

v-html

<span>{{msg}}</span>效果和<span v-html="msg"></span>相同 ,但是后者是將數(shù)據(jù)轉(zhuǎn)變?yōu)榧兾谋?不是HTML 為了輸出HTML 所以使用v-html

v-bind

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

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

如果msg為false ?移除屬性

<span></span>

使用JS表達(dá)式

{{msg+1}}

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


指令

帶有v-前綴

<div v-if="msg">如果msg為true則插入div標(biāo)簽</div>

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

<div v-on:click="toDo">點(diǎn)擊觸發(fā)函數(shù)</div>

<input v-model="msg"/>//雙向數(shù)據(jù)綁定

.....等等 ?vue還支持自定義指令卫漫。后面說。

指令縮寫

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

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

計(jì)算屬性

computed 計(jì)算屬性會根據(jù)data 的值改變

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

new Vue({

? ? ? el:'#App',

? ? ? data:{

? ? ? ? ? ? msg:'hello'

? ? ? },

? ? ? computed:{

? ? ? ? ? ? getNewMsg:function(){

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

? ? ? ? ? ? }?

? ? ? }

})

上邊代碼計(jì)算屬性只用到了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

函數(shù)

methods也可以實(shí)現(xiàn)剛才computed的效果。

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

new Vue({

? ? ? el:'#App',

? ? ? data:{

? ? ? ? ? ? msg:'hello'

? ? ? },

? ? ? ?methods:{

? ? ? ? ? ? ?getNewMsg:function(){

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

? ? ? ? ? ? }

? ? ? }

})


computed和methods比較

雖然最終的結(jié)果相同通今,但是計(jì)算屬性基于緩存依賴粥谬,只有在他依賴的數(shù)據(jù)發(fā)生改變才會重新計(jì)算取值,而methods 每次都會重新計(jì)算取值辫塌。

wach方法

用于觀察VUE實(shí)例上的數(shù)據(jù)變動

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


new Vue({

? ? ? el:'#App',

? ? ? data:{

? ? ? ? ? ? msg:'hello',

? ? ? ? ? ? text:'word',

? ? ? ? ? ? all:''

? ? ? },

? ? ? watch:{

? ? ? ? ? ? msg:function(){

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

? ? ? ? ? ? }

? ? ? }

})

class與style綁定

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

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

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

class支持三目運(yùn)算符

<div v-bind:class="active?style01:style02"></div>

內(nèi)聯(lián)樣式

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

還可以綁定到一個對象上

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

data(){

? ? ?return{

? ? ? ? ? ? obj:{

? ? ? ? ? ? ? ? ? ? ?color:'red',

? ? ? ? ? ? ? ? ? ? ? fontSize:'12px'

? ? ? ? ? ? }

? ? ?}

}


條件渲染

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內(nèi)容,但是vue是不會重新渲染div標(biāo)簽的感耙。根據(jù)就地復(fù)用策略褂乍,只是替換div里面的內(nèi)容。如果想每次都重新渲染div標(biāo)簽即硼。需要使用key逃片,key不同則每次重新渲染。

v-if 和 v-show

v-show只是控制display只酥。

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

列表渲染

v-for

data(){

? ? ?return{

? ? ? ? ? ? parents:"我是",

? ? ? ? ? ? msg:[

? ? ? ? ? ? ? ? ? ? {name:'foo'},

? ? ? ? ? ? ? ? ? ? {name:'bar'},

? ? ? ? ? ? ?]

? ? ? }

}

<div>

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

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

? ? ? ?</div>

</div>

渲染結(jié)果: 我是-0-foo? 我是-1-bar

事件處理器

使用template的好處

1裂允。通過HTML模板就可以輕松定位JS對應(yīng)方法

2损离。不需要JS手動綁定事件,易于測試

3绝编。當(dāng)viewmodel銷毀 所有的事件處理器自動刪除僻澎,無需手動刪除

<div v-on:click="msg">點(diǎn)擊</div>

new Vue({

? ? ? ? ? el:'app',

? ? ? ? ? methods:{

? ? ? ? ? say:function(name,event){

? ? ? ? ? ? ? ? ? ? ?alert(name+'我是vue')

? ? ? ? ? ? ? ? ? ? if(event){event.preventDefault}

? ? ? ? ? ? ? ? ? ? }

? ? ? ? ? ?}

})

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

事件修飾符

.stop 組件單擊事件冒泡

.prevent ? 提交事件不在重載頁面

.capture ? 使用事件捕獲模式

.self ? ? ? ? ?只當(dāng)在本元素才發(fā)生

.once ? ? ? 新增

使用方式:

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

修飾符可以串聯(lián)

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

表單控件

v-model 實(shí)現(xiàn)雙向數(shù)據(jù)綁定

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

<input v-model="msg"/>

new Vue({

? ? el:'#app',

? ?data:{

? ? ? ? ? msg:'我是默認(rèn)'

? ?}

})


無論是復(fù)選框 ?單選框 ?下拉列表 ? 基本上獲取到用戶選中的值的方式十饥,就是使用v-model到一個數(shù)組

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

如果用戶選中窟勃,則數(shù)組會把選中對象的value值存入數(shù)組中。

修飾符

.lazy ? 取消input事件轉(zhuǎn)為change事件同步

.number ? 將用戶輸入的值轉(zhuǎn)為number類型逗堵,如果返回NAN拳恋,則返回原值

.trim ? ? ?取消前后空格

使用方式:

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

組件

注冊全局組件

Vue.component('my-component',{

? ? //選項(xiàng)

? ? data:function(){

? ? ? ? ? ? ? //在組件里 data 必須是函數(shù),并且不能使用箭頭函數(shù)

? ? }

})

注冊局部組件

通過使用組件實(shí)例選項(xiàng)注冊砸捏,可以使組件在另一個組件中使用

var child={

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

}

new Vue({

? ? ? ? ? components:{

? ? ? ? ? ? ? ? ? ? 'my-components ':child

? ? ? ? ? ?}

})

組件通信

思想:父組件通信子組件,使用props隙赁。子組件通信父組件使用自定義事件垦藏,通過$on('事件名稱')監(jiān)聽事件 和 $emit('事件名稱') 觸發(fā)事件。

如果使用vuex伞访,在根組件注冊掂骏,我們在任意組件中都可以通過$store拿到store對象。如果子組件想要獲取到父組件的數(shù)據(jù)厚掷,或者說非父子組件想要拿到彼此的數(shù)據(jù)弟灼,最高效的方式是使用vuex。

但是冒黑,還是要說下基本的props用法田绑。

props

Vue.components('child',{

? ? ? ? ? props :['msg'],

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

})

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

注意:因?yàn)镠TML不區(qū)分大小寫,所以在傳遞props時抡爹,駝峰寫法要通過短橫線隔開

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

Vue.components('child',{

? ? ? ? props:['myProps'],

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

})

動態(tài)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>'

})

字面量語法和動態(tài)語法

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

動態(tài)語法: <child v-bind:msg="1"></child> ? ? ?props為 ? 1

單向數(shù)據(jù)流

props是單向綁定的掩驱,父組件修改影響子組件,但是不能反過來,這是為了防止子組件修改父組件的狀態(tài)欧穴,讓數(shù)據(jù)流難以理解民逼。

可以通過Vuex管理state,這樣子就避免了繁瑣的props傳遞涮帘。后面會發(fā)布VUEX講解的文章拼苍,請關(guān)注~

props驗(yàn)證

只用于new創(chuàng)建的實(shí)例中,創(chuàng)建實(shí)例時傳遞 props调缨。主要作用是方便測試疮鲫。

支持類型:string ?number ?boolean ?function ?object ? array

props:{

? ? ?msg:Number,//只檢測類型

? ? //檢測類型+其他驗(yàn)證

? ? call:{

? ? ? ?type:Number,

? ? ? ? default:0,

? ? ? ? requiredLtrue,

? ? ? ? validator:function(val){

? ? ? ? ? ? return val>=0

? ? ? ? }

? ? ?}

}

自定義事件

使用 v-on 綁定事件

父組件在使用子組件的地方直接用v-on監(jiān)聽子組件觸發(fā)的事件同蜻, ?子組件觸發(fā)事件會觸發(fā)父組件事件

子組件中要使用this.$emit('事件',參數(shù))

父組件就可以使用 $on去監(jiān)聽

?例如 在父組件中:

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

非父子組件通信

使用一個空的vue實(shí)例作為中央事件總棧

var bus=new Vue()

在A組件中觸發(fā)事件

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

在B組件創(chuàng)建的鉤子中監(jiān)聽事件

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

})

slot

在子組件中

<div>

? ? ? ? ? ?<h1>我是子組件標(biāo)題</h1>

? ? ? ? ? ?<slot>只有在沒分發(fā)的內(nèi)容才顯示</slot>

</div>

在父組件中

<div>

? ? ? <child>

? ? ? ? ? ? ?<p>這里的內(nèi)容會替換掉子組件中的slot</p>

? ? ?</child>

</div>

渲染結(jié)果為

<div>

? ? ? ? <div>

? ? ? ? ? ? ? ? <h1>我是子組件標(biāo)題</h1>

? ? ? ? ? ? ? <p>這里的內(nèi)容會替換掉子組件中的slot</p>

? ? ? ?</div>

</div>

具名slot

給slot添加name屬性

在子組件中

<div>

? ? ? ? ? ?<h1>我是子組件標(biāo)題</h1>

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

</div>

在父組件中

<div>

? ? ? ? ? ?<child>

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

? ? ? ? ? ?</child>

</div>

Render函數(shù)

不想使用template棚点,也可以用render寫JSX。例如根據(jù)判斷自動生成DOM結(jié)構(gòu)湾蔓,如果大量的判斷用template會有大量的代碼瘫析,這時候可以用render,使用createElement去創(chuàng)建標(biāo)簽默责。

這里只寫個小用法贬循。

new Vue({

? ? ? el:"#app",

? ? ?render:h=>h(App)

})

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

new Vue({

? ? ? ? ? el:'#app',

? ? ? ? ? components:{App},

? ? ? ? ? template:'<App/>'

})

總之JSX可以使用JS的完全編程能力。詳細(xì):http://cn.vuejs.org/v2/guide/render-function.html

自定義指令

有時候我們需要對DOM元素進(jìn)行底層操作桃序,所以需要自定義事件杖虾。

全局注冊

例如我們創(chuàng)建v-focus

Vue.directive('focus',{

? ? ?inserted:function(el){

? ? ? ? ? el.focus();

? ? ?}

})

局部注冊

組件接收一個選項(xiàng)

directives:{

? ? ? ? ?focus:{

? ? ? ? ? ? ? ? ? ?//指定的定義

? ? ? ? ?}

?}

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

自定義指令鉤子函數(shù)

剛才我們?nèi)侄x 用到了 inserted函數(shù),這就是鉤子函數(shù)媒熊。

bind:function(){} //只調(diào)用一次奇适,指令第一次綁定到元素時調(diào)用。

inserted:function(){} //被綁定元素插入到父節(jié)點(diǎn) 調(diào)用

update:function(){} ?//更新時調(diào)用

componentUpdated:function(){} ? //被綁定元素所在模板完成一次更新周期時調(diào)用

unbind:function(){} ?//指令與元素解綁調(diào)用

鉤子函數(shù)參數(shù)

el:指令綁定的元素對象

binding:一個obj對象芦鳍,他包括以下屬性:

? ? ? ? ? ? ? ?name:指令名稱

? ? ? ? ? ? ? ?value:綁定的值

? ? ? ? ? ? ? ?oldValue:前一個值 只能在update函數(shù)和componentUpdate函數(shù)中使用

? ? ? ? ? ? ? ?expression:綁定的值是字符串形式 例如 ?v-demo="1" ?為1

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

? ? ? ? ? ? ? ?modifiers: 修飾符對象 只能在update函數(shù)和componentUpdate函數(shù)中使用

vnode:vue編譯生成的虛擬節(jié)點(diǎn)

oldVnode:上一個虛擬節(jié)點(diǎn)

混合mixin

var mixin={

? ? ? ? ? ? created:function(){

? ? ? ? ? ? ? ? ? ?this.hello();

? ? ? ? ? ? ?},

? ? ? ? ? ? methods:{

? ? ? ? ? ? ? ? ? hello:function(){

? ? ? ? ? ? ? ? ? ?console.log("Hello");

? ? ? ? ? ? ? ? ? ?}

? ? ? ? ? ?}

}

var Component=Vue.extend({

? ? ? ? mixins:[mixin]

})

如果相同的屬性嚷往,都會被調(diào)用,只是混合對象的鉤子將在組件自身鉤子之前調(diào)用

如果 例如 方法的名字相同柠衅,就取組件自身的方法



以上就是vue2.0常用的小點(diǎn)皮仁,省略了一些內(nèi)容。包括像是vue-router菲宴、vuex贷祈、編寫插件等等。

本篇只是總結(jié)基礎(chǔ)知識點(diǎn)喝峦,希望能幫到你势誊。

-by 麥浪XPEKI

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市愈犹,隨后出現(xiàn)的幾起案子键科,更是在濱河造成了極大的恐慌闻丑,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,194評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件勋颖,死亡現(xiàn)場離奇詭異嗦嗡,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)饭玲,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評論 2 385
  • 文/潘曉璐 我一進(jìn)店門侥祭,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人茄厘,你說我怎么就攤上這事矮冬。” “怎么了次哈?”我有些...
    開封第一講書人閱讀 156,780評論 0 346
  • 文/不壞的土叔 我叫張陵胎署,是天一觀的道長。 經(jīng)常有香客問我窑滞,道長琼牧,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,388評論 1 283
  • 正文 為了忘掉前任哀卫,我火速辦了婚禮巨坊,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘此改。我一直安慰自己趾撵,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,430評論 5 384
  • 文/花漫 我一把揭開白布共啃。 她就那樣靜靜地躺著占调,像睡著了一般。 火紅的嫁衣襯著肌膚如雪移剪。 梳的紋絲不亂的頭發(fā)上妈候,一...
    開封第一講書人閱讀 49,764評論 1 290
  • 那天,我揣著相機(jī)與錄音挂滓,去河邊找鬼。 笑死啸胧,一個胖子當(dāng)著我的面吹牛赶站,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播纺念,決...
    沈念sama閱讀 38,907評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼贝椿,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了陷谱?” 一聲冷哼從身側(cè)響起烙博,我...
    開封第一講書人閱讀 37,679評論 0 266
  • 序言:老撾萬榮一對情侶失蹤瑟蜈,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后渣窜,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體铺根,經(jīng)...
    沈念sama閱讀 44,122評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,459評論 2 325
  • 正文 我和宋清朗相戀三年乔宿,在試婚紗的時候發(fā)現(xiàn)自己被綠了位迂。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,605評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡详瑞,死狀恐怖掂林,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情坝橡,我是刑警寧澤泻帮,帶...
    沈念sama閱讀 34,270評論 4 329
  • 正文 年R本政府宣布,位于F島的核電站计寇,受9級特大地震影響锣杂,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜饲常,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,867評論 3 312
  • 文/蒙蒙 一蹲堂、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧贝淤,春花似錦柒竞、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,734評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至离陶,卻和暖如春稼虎,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背招刨。 一陣腳步聲響...
    開封第一講書人閱讀 31,961評論 1 265
  • 我被黑心中介騙來泰國打工霎俩, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人沉眶。 一個月前我還...
    沈念sama閱讀 46,297評論 2 360
  • 正文 我出身青樓打却,卻偏偏與公主長得像,于是被迫代替她去往敵國和親谎倔。 傳聞我的和親對象是個殘疾皇子柳击,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,472評論 2 348

推薦閱讀更多精彩內(nèi)容