VUE中的自定義指令鉤子函數講解
自定義指令鉤子函數
自定義指令
除瞭VUE 內置指令外,VUE也支持我們自定義註冊指令,分為局部和全局註冊 但這些想必大傢都不陌生,其中官方API也是寫的明明白白 官方API點這裡
而且自定義指令也會極大程度上幫助我們日常的編程,但這是很有意思的事情出現瞭,就是鉤子函數,很多老鐵都弄不明白這五個函數的具體區別
先上官方解釋
bind
:隻調用一次,指令第一次綁定到元素時調用。在這裡可以進行一次性的初始化設置。inserted
:被綁定元素插入父節點時調用 (僅保證父節點存在,但不一定已被插入文檔中)。update
:所在組件的 VNode 更新時調用,但是可能發生在其子 VNode 更新之前。指令的值可能發生瞭改變,也可能沒有。但是你可以通過比較更新前後的值來忽略不必要的模板更新 (詳細的鉤子函數參數見下)。componentUpdated
:指令所在組件的 VNode 及其子 VNode 全部更新後調用。unbind
:隻調用一次,指令與元素解綁時調用。
之前有個朋友問我 每個字都認識 連起來就不明白瞭QAQ 因此這裡給大傢結合栗子來演示下 這五個過程
webpack 框架
App.vue
<template> <div class="container"> <div class="row"> <div class="col-xs-12"> <!-局部這側的組件-> <app-test v-if="btn" :text="text"></app-test> <button @click="create">加載</button> <button @click="update">更新</button> <button @click="destory">關閉</button> </div> </div> </div> </template>
<script> export default { data() { return { btn:true, text:'hello', } }, components: { appTest: { // v-test 就是自定義指令 具體在main.js中看 template: '<h1 v-test>{{text}}</h1>', props: { text: String } } }, methods: { //創建的方法 create(){ this.btn=true }, //更新組件內容 update(){ this.text='hi' }, //利用內部指令摧毀組件 destory(){ this.btn=false } }, } </script>
main.js
import Vue from 'vue' import App from './App.vue' //全局註冊自定義指令 在每個鉤子函數輸出相應內容 //其中為瞭區分bind ,inserted 還相應輸出元素的父節點 //為瞭區本update,componentUpdated 還想贏輸出元素內容 Vue.directive('test', { bind: function (el) { console.log('bind'); console.log(el.parentNode) }, inserted: function (el) { console.log('inserted'); console.log(el.parentNode) }, update: function (el) { console.log('update'); console.log(el.innerHTML) }, componentUpdated: function (el) { console.log('componentUpdated') console.log(el.innerHTML) }, unbind: function (el) { console.log('unbind') } }) new Vue({ el: '#app', render: h => h(App) })
OK 運行 首先我們看到控制臺輸出
加載
bind null inserted <div class="col-xs-12">…</div>
這時候我們可以判斷首先加載時會經歷這兩個鉤子函數,分別對應第一次綁定,和父元素加載完畢
按下更新按鈕
updata hello componentUpdated hi
這時候我們可以判斷節點內容更新時會經歷這兩個鉤子函數,分別對應更新前,和更新後
按下關閉
unbind
階段銷毀時經歷unbind鉤子函數
按下加載
bind null inserted <div class="col-xs-12">…</div>
再次看下加載
小貼士
這時我們應該可以弄明白鉤子函數
但其實大多數情況 我們隻希望節點在加載和更新時發生同樣的事情,而忽略其它鉤子函數,可以這麼寫
Vue.directive('color-swatch', function (el, binding) { el.style.backgroundColor = binding.value })
鉤子函數運行順序
在vue中,實例選項和鉤子函數和{{}}表達式都是不需要手動調用就可以直接執行的。
在頁面首次加載執行順序有如下:
beforeCreate
//在實例初始化之後、創建之前執行created
//實例創建後執行beforeMounted
//在掛載開始之前調用filters
//掛載前加載過濾器computed
//計算屬性directives-bind
//隻調用一次,在指令第一次綁定到元素時調用directives-inserted
//被綁定元素插入父節點時調用activated
//keek-alive組件被激活時調用,則在keep-alive包裹的嵌套的子組件中觸發mounted
//掛載完成後調用{{}}
//mustache表達式渲染頁面
修改頁面input時,被自動調用的選項順序如下:
watch
//首先先監聽到瞭改變事件filters
//過濾器沒有添加在該input元素上,但是也被調用瞭beforeUpdate
//數據更新時調用,發生在虛擬dom打補丁前directived-update
//指令所在的組件的vNode更新時調用,但可能發生在其子vNode更新前directives-componentUpdated
//指令所在的組件的vNode及其子組件的vNode全部更新後調用updated
//組件dom已經更新
組件銷毀時,執行順序如下:
beforeDestroy
//實例銷毀之前調用directives-unbind
//指令與元素解綁時調用,隻調用一次deactivated
//keep-alive組件停用時調用destroyed
//實例銷毀之後調用
以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。
推薦閱讀:
- 詳解Vue自定義指令及使用
- vue 自定義指令directives及其常用鉤子函數說明
- vue2.x與vue3.x中自定義指令詳解(最新推薦)
- 詳解Vue進階構造屬性
- 理解Vue2.x和Vue3.x自定義指令用法及鉤子函數原理