Vue全局API(上)

一斧吐、全局API

何為全局API宵睦? 通俗的說就是在構(gòu)造器之外,Vue提供的一些API函數(shù)杜耙,可以使我們定義新的功能烟勋。

自定義指令 Vue.directive

通過例子來看:定義一個(gè)指令规求,讓num的顏色變成紅色筐付。

    <div id="app">
        <div v-cui="color">{{ num }}</div>
        <button @click = "add">增加</button>
    </div>

傳入一個(gè)函數(shù)

    Vue.directive('cui', function(el, binding, vnode){
            //console.log(el)//綁定了自定義指令‘cui’的節(jié)點(diǎn)
            //console.log(binding)//是一個(gè)對(duì)象,包含指令的很多信息阻肿。
            //console.log(vnode)//編譯生成的虛擬節(jié)點(diǎn)

            el.style.color = binding.value;
    })

    var app = new Vue({
        el: "#app",
         data: {
             num: 10,
             color: 'red'
         },
         methods: {
             add(){
                 this.num++
             }
         }
    })

傳入一個(gè)對(duì)象瓦戚,分別是五個(gè)生命周期鉤子函數(shù)

 <div id="app" v-cloak>
        <div v-cui="color">{{ num }}</div>
        <button @click = "add">增加</button>
       
    </div>
    <button onclick = 'unbind()'>解綁</button>
//五個(gè)生命周期鉤子函數(shù),我們可以在不同周期進(jìn)行相應(yīng)的操作
Vue.directive('cui', {
        bind: function () {
            console.log('第一次被綁定')
        },
        inserted: function(){
            console.log('被綁定元素插入到父節(jié)點(diǎn)')
        },
        update: function(){
            console.log('組件更新')
        },
        componentUpdated: function(){
            console.log('組件更新完成')
        },
        unbind: function(){
            console.log('組件解綁')
        }
    })
    //解綁函數(shù)需要定義在構(gòu)造器之外
    function unbind(){
        app.$destroy()
    }

    var app = new Vue({
        el: "#app",
         data: {
             num: 10,
             color: 'red'
         },
         methods: {
             add(){
                 this.num++
                //  this.color = "green"
             }
         }
    })
  • bind:只調(diào)用一次丛塌,指令第一次綁定到元素時(shí)調(diào)用较解,用這個(gè)鉤子函數(shù)可以定義一個(gè)執(zhí)行一次的初始化操作。
  • inserted:被綁定元素插入父節(jié)點(diǎn)時(shí)調(diào)用赴邻。
  • update:被綁定于元素所在的模板更新時(shí)調(diào)用印衔,而無論綁定值是否變化。通過比較更新前后的綁定值姥敛,可以忽略不必要的模板更新奸焙。
  • componentUpdated:被綁定元素所在模板完成一次更新周期時(shí)調(diào)用。
  • unbind:只調(diào)用一次彤敛,指令與元素解綁時(shí)調(diào)用与帆。

二、extend擴(kuò)張實(shí)例構(gòu)造器

<div id="app">
        <nav-bar id="nav"></nav-bar>
</div>
    //擴(kuò)張構(gòu)造器
    var NavBar = Vue.extend({
        template: "<div><ul><a :href='url'><li>{{msg1}}</li></a><li>{{msg2}}</li></ul></div>",
        data(){
            return {
                msg1: '首頁',
                url: 'https://baidu.com',
                msg2: '關(guān)于我'
            }
        }
    })

    //創(chuàng)建自定義構(gòu)造器實(shí)例墨榄,并掛載
    new NavBar().$mount('#nav')//這里可以是id玄糟,類名,標(biāo)簽名

效果:

三袄秩、Vue.set

Vue.set的作用是在構(gòu)造器外部操作構(gòu)造器內(nèi)部的數(shù)據(jù)阵翎、屬性或方法。比如播揪,在Vue構(gòu)造器內(nèi)部定義一個(gè)數(shù)num為10贮喧,在外部定義一個(gè)方法改變num的值筒狠。

<div>{{ num }}</div>
    //引用構(gòu)造器外部數(shù)據(jù)
    var datas = {
        num: 10,
        stars: ['柳巖', '劉亦菲', '劉詩詩']
    }

    //三種方式改變num的值
    function add() {
        //1猪狈、 直接操作外部數(shù)據(jù)
        datas.num ++ 

        //2、 用Vue對(duì)象的方式添加
        app.num ++ 

        //3辩恼、 用Vue.set的方式改變
        Vue.set(datas, 'num', 20)
    }
    var app = new Vue({
        el: "#app",
        data: datas,
        methods: {
            add(){
                console.log(this.stars)
                this.stars[1] = '高圓圓'
            }
        }
    })

這時(shí)候你可能會(huì)產(chǎn)生疑問雇庙,為什么要用這么復(fù)雜的方式去改變num的值,當(dāng)然了灶伊,單純的去改變數(shù)的值疆前,自然是沒必要這么做的,不妨看下面的例子聘萨,我們通過問題來引入:

假設(shè)我們通過一個(gè)事件去改變數(shù)組中的某個(gè)元素竹椒,你會(huì)發(fā)現(xiàn),值改變了米辐,但是并沒有更新視圖胸完。

<div id="#app">
    <ul>
        <li v-for = "star in stars">{{ star }}</li>
    </ul>
    <button @click = 'add()'>add</button>
</div>

通過點(diǎn)擊事件书释,將‘劉亦菲’改成‘高圓圓’

//引用構(gòu)造器外部數(shù)據(jù)
    var app = new Vue({
        el: "#app",
        data: {
            stars: ['柳巖', '劉亦菲', '劉詩詩']
        },
        methods: {
            add(){
                console.log(this.stars)
                this.stars[1] = '高圓圓'
                
            }
        }
    })

結(jié)果是數(shù)組的值變了,但是并沒有更新視圖赊窥。

這種問題是由于Javascript的限制爆惧,Vue不能自動(dòng)檢測(cè)以下方式變動(dòng)的數(shù)組。

  • 當(dāng)你利用索引直接設(shè)置一個(gè)項(xiàng)時(shí)锨能,vue不會(huì)為我們自動(dòng)更新扯再。

但是,當(dāng)我們?cè)谝粋€(gè)事件中同時(shí)改變一個(gè)數(shù)的值和數(shù)組中的某個(gè)元素址遇,那么此時(shí)數(shù)組中的值也會(huì)相應(yīng)的改變熄阻。原因是虛擬DOM,當(dāng)我們通過事件改變num的值時(shí)倔约,會(huì)改變虛擬DOM饺律,觸發(fā)視圖的更新。如下:

    data: {
        num: 10,
        stars: ['柳巖', '劉亦菲', '劉詩詩']
    },
    methods: {
        add(){
            this.num ++ 
            this.stars[1] = '高圓圓'
            console.log(this.stars)
            //this.stars.push('趙麗穎')
        }
    }

但是我們?cè)趯?shí)際項(xiàng)目開發(fā)中跺株,只需要改變數(shù)組中的某個(gè)元素复濒,那么就需要Vue.set()了。

var datas = {
    stars: ['柳巖', '劉亦菲', '劉詩詩']
}

function add() {
        //改變數(shù)組中的元素
        Vue.set(app.stars, 1, '高圓圓')
}

var app = new Vue({
    el: "#app",
    data: datas
})

也可以在構(gòu)造器實(shí)例中通過Vue.set()去改變乒省,效果也是一樣的巧颈。

<ul>
   <li v-for = "star in stars">{{ star }}</li>
</ul>
<button @click = 'add()'>add</button>
var app = new Vue({
    el: "#app",
    // data: datas,
    data: {
        stars: ['柳巖', '劉亦菲', '劉詩詩']
    },
    methods: {
    add(){
        // this.stars[1] = '高圓圓'
        // console.log(this.stars)
        Vue.set(app.stars, 1, "高圓圓")
        }
    }
})

四、生命周期

何為生命周期袖扛?對(duì)一個(gè)生物來說砸泛,生命周期便是從出生到死亡的過程,那中間一定還有很多的時(shí)間點(diǎn)蛆封,比如唇礁,少年、青年惨篱、中年盏筐、老年等,不同階段可以做不同的事情砸讳。Vue中的生命周期也是如此琢融,它包括從Vue實(shí)例的創(chuàng)建到銷毀,以及中間經(jīng)歷的不同時(shí)間點(diǎn)簿寂。

Vue所有的生命周期鉤子自動(dòng)綁定在this上下文到實(shí)例中漾抬,因此可以訪問數(shù)據(jù),并對(duì)屬性和方法進(jìn)行運(yùn)算常遂。同時(shí)意味著不能使用箭頭函數(shù)來定義一個(gè)生命周期方法纳令。因?yàn)榧^函數(shù)綁定了父上下文,因此this與你期待的Vue實(shí)例不同。

還是通過代碼來看吧:

<div id="app">
    <div>{{ num }}</div>
    <button @click = "add">add</button>
    <button onclick="app.$destroy()">銷毀</button>
</div>
var app = new Vue({
    el: "#app",
    data: {
        num : 10
    },
    methods: {
        add(){
            this.num ++
        }
    },
    // 實(shí)例初始化之后平绩,數(shù)據(jù)觀測(cè)(data observer) 和 event/watcher 事件配置之前被調(diào)用
    beforeCreate:function(){
        console.log('1-beforeCreate 實(shí)例初始化之后');
    },
    created:function(){
        console.log('2-created 創(chuàng)建完成');
    },
    beforeMount:function(){
        console.log('3-beforeMount 掛載之前');
    },
    mounted:function(){
        console.log('4-mounted 被創(chuàng)建');
    },
    beforeUpdate:function(){
        console.log('5-beforeUpdate 數(shù)據(jù)更新前');
    },
    updated:function(){
        console.log('6-updated 被更新后');
    },
    activated:function(){
        console.log('7-activated');
    },
    deactivated:function(){
        console.log('8-deactivated');
    },
    beforeDestroy:function(){
        console.log('9-beforeDestroy 銷毀之前');
    },
    destroyed:function(){
        console.log('10-destroyed 銷毀之后')
    }

})

初次打開頁面

點(diǎn)擊按鈕坤按,更新組件

點(diǎn)擊銷毀按鈕

Vue組件的生命周期這篇文章對(duì)生命周期鉤子的解釋還是比較通俗的。

1馒过、beforeCreate

在實(shí)例初始化之后臭脓,數(shù)據(jù)觀測(cè)和event/watcher時(shí)間配置之前被調(diào)用。

2腹忽、created

實(shí)例已經(jīng)創(chuàng)建完成之后被調(diào)用来累。在這一步,實(shí)例已經(jīng)完成以下的配置:數(shù)據(jù)觀測(cè)窘奏,屬性和方法的運(yùn)算嘹锁,watch/event事件回調(diào)。然而着裹,掛載階段還沒開始领猾,$el屬性目前不可見。

3骇扇、beforeMount

在掛載開始之前被調(diào)用:相關(guān)的render函數(shù)首次被調(diào)用摔竿。

該鉤子在服務(wù)器端渲染期間不被調(diào)用。

4少孝、mounted

el被新創(chuàng)建的vm.$el替換继低,并掛在到實(shí)例上去之后調(diào)用該鉤子函數(shù)。如果root實(shí)例掛載了一個(gè)文檔內(nèi)元素稍走,當(dāng)mounted被調(diào)用時(shí)vm.$el也在文檔內(nèi)袁翁。

該鉤子在服務(wù)端渲染期間不被調(diào)用。

5婿脸、beforeUpdate

數(shù)據(jù)更新時(shí)調(diào)用粱胜,發(fā)生在虛擬DOM重新渲染和打補(bǔ)丁之前。

你可以在這個(gè)鉤子中進(jìn)一步第更改狀態(tài)狐树,這不會(huì)觸發(fā)附加的重渲染過程焙压。

該鉤子在服務(wù)端渲染期間不被調(diào)用。

6褪迟、updated

由于數(shù)據(jù)更改導(dǎo)致的虛擬DOM重新渲染和打補(bǔ)丁冗恨,在這之后會(huì)調(diào)用該鉤子答憔。

當(dāng)這個(gè)鉤子被調(diào)用時(shí)味赃,組件DOM已經(jīng)更新,所以你現(xiàn)在可以執(zhí)行依賴于DOM的操作虐拓。然而在大多數(shù)情況下心俗,你應(yīng)該避免在此期間更改狀態(tài),因?yàn)檫@可能會(huì)導(dǎo)致更新無限循環(huán)。

該鉤子在服務(wù)端渲染期間不被調(diào)用城榛。

7揪利、activated

keep-alive組件激活時(shí)調(diào)用。

該鉤子在服務(wù)器端渲染期間不被調(diào)用狠持。

8疟位、deactivated

keep-alive組件停用時(shí)調(diào)用。

該鉤子在服務(wù)端渲染期間不被調(diào)用喘垂。

9甜刻、beforeDestroy 【類似于React生命周期的componentWillUnmount】

實(shí)例銷毀之間調(diào)用。在這一步正勒,實(shí)例仍然完全可用得院。

該鉤子在服務(wù)端渲染期間不被調(diào)用。

10章贞、destroyed

Vue實(shí)例銷毀后調(diào)用祥绞。調(diào)用后,Vue實(shí)例指示的所有東西都會(huì)解綁定鸭限,所有的事件監(jiān)聽器會(huì)被移除蜕径,所有的子實(shí)例也會(huì)被銷毀。

該鉤子在服務(wù)端渲染不會(huì)被調(diào)用败京。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末丧荐,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子喧枷,更是在濱河造成了極大的恐慌虹统,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,525評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件隧甚,死亡現(xiàn)場(chǎng)離奇詭異车荔,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)戚扳,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,203評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門忧便,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人帽借,你說我怎么就攤上這事珠增。” “怎么了砍艾?”我有些...
    開封第一講書人閱讀 164,862評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵蒂教,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我脆荷,道長(zhǎng)凝垛,這世上最難降的妖魔是什么懊悯? 我笑而不...
    開封第一講書人閱讀 58,728評(píng)論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮梦皮,結(jié)果婚禮上炭分,老公的妹妹穿的比我還像新娘。我一直安慰自己剑肯,他們只是感情好捧毛,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,743評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著让网,像睡著了一般岖妄。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上寂祥,一...
    開封第一講書人閱讀 51,590評(píng)論 1 305
  • 那天荐虐,我揣著相機(jī)與錄音,去河邊找鬼丸凭。 笑死福扬,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的惜犀。 我是一名探鬼主播铛碑,決...
    沈念sama閱讀 40,330評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼虽界!你這毒婦竟也來了汽烦?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,244評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤莉御,失蹤者是張志新(化名)和其女友劉穎撇吞,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體礁叔,經(jīng)...
    沈念sama閱讀 45,693評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡牍颈,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,885評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了琅关。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片煮岁。...
    茶點(diǎn)故事閱讀 40,001評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖涣易,靈堂內(nèi)的尸體忽然破棺而出画机,到底是詐尸還是另有隱情,我是刑警寧澤新症,帶...
    沈念sama閱讀 35,723評(píng)論 5 346
  • 正文 年R本政府宣布步氏,位于F島的核電站,受9級(jí)特大地震影響账劲,放射性物質(zhì)發(fā)生泄漏戳护。R本人自食惡果不足惜金抡,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,343評(píng)論 3 330
  • 文/蒙蒙 一瀑焦、第九天 我趴在偏房一處隱蔽的房頂上張望腌且。 院中可真熱鬧,春花似錦榛瓮、人聲如沸铺董。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,919評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽精续。三九已至,卻和暖如春粹懒,著一層夾襖步出監(jiān)牢的瞬間重付,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,042評(píng)論 1 270
  • 我被黑心中介騙來泰國打工凫乖, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留确垫,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,191評(píng)論 3 370
  • 正文 我出身青樓帽芽,卻偏偏與公主長(zhǎng)得像删掀,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子导街,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,955評(píng)論 2 355

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

  • 這篇筆記主要包含 Vue 2 不同于 Vue 1 或者特有的內(nèi)容披泪,還有我對(duì)于 Vue 1.0 印象不深的內(nèi)容。關(guān)于...
    云之外閱讀 5,050評(píng)論 0 29
  • 1.安裝 可以簡(jiǎn)單地在頁面引入Vue.js作為獨(dú)立版本搬瑰,Vue即被注冊(cè)為全局變量款票,可以在頁面使用了。 如果希望搭建...
    Awey閱讀 11,024評(píng)論 4 129
  • Vue 實(shí)例 屬性和方法 每個(gè) Vue 實(shí)例都會(huì)代理其 data 對(duì)象里所有的屬性:var data = { a:...
    云之外閱讀 2,214評(píng)論 0 6
  • 柏奚 ■閉路襤褸 靈翮十一年泽论,南羽驟發(fā)毒瘴徽职,一夜死傷百里。生還者稱夜見青色碩大蓮花佩厚,蓬勃開放姆钉。 春末多雨,帝王車駕...
    閉路藍(lán)縷閱讀 1,909評(píng)論 0 1
  • MySQL AB提供了幾種類型的程序: MYSQL服務(wù)器和服務(wù)器啟動(dòng)腳本:1: mysqld是MySQL服務(wù)器2:...
    笑Skr人啊閱讀 491評(píng)論 0 0