VUE-自定義指令

有的情況下徒恋,需要對普通 DOM 元素進行底層操作,這時候就會用到自定義指令欢伏。舉個聚焦輸入框的例子入挣,如下:

<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8" />
    <title>el與data的兩種寫法</title>
    <style></style>
  </head>
  <body>
    <div id="app">
      <h1>
        當前的n值是:
        <span v-text="n"></span>
      </h1>
      <h1>
        當前的n值是:
        <span v-big="n"></span>
      </h1>
      <button @click="n++">點我n+1</button>
      <hr />
      <input type="text" v-fbind:value="n" />
    //通過element.innerText = binding.value * 10改變變n的綁定值,n可以是一個函數(shù)硝拧,默認參數(shù)為binding.value径筏,這樣就可以在該函數(shù)直接處理數(shù)據(jù)如下:divResize當成n
     <div v-resize="divResize" class="header-wrapper"></div>
    </div>
    <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
    <script>
      var app = new Vue({
        data: {
          n: 1,
        },
  methods: {
    divResize(data){
        //data就是binding.value({height: style.height}) 的返回值
           console.log("resizeData:",data)
          },
        }
        //這種寫法寫起來簡單,但是不可以處理細節(jié)
        directives: {
        resize: {
            // 綁定時調用
            bind(el, binding){
                let height = ""
                function isResize(){
                    // 可根據(jù)需求障陶,調整內部代碼滋恬,利用binding.value返回即可
                    const style = document.defaultView.getComputedStyle(el)
                    if(height !== style.height){
                        // 此處關鍵代碼,通過此處代碼將數(shù)據(jù)進行返回,從而做到自適應
                        binding.value({height: style.height}) 
                    }
                    height = style.height
                }
                // 設置調用函數(shù)的延時,間隔過短會消耗過多資源
                el.__vueSetInterval__ = setInterval(isResize, 100)
            },
            unbind(el){
                clearInterval(el.__vueSetInterval__)
            }
        }
          // big函數(shù)合適被調用 1杉辙、指令與元素成功綁定時(綁定時只是建立關系,頁面還沒出現(xiàn))會調用(一上來)勋拟,2、指令所在的模板被重新解析時
          // 1妈候、函數(shù)寫法
          big(element, binding) {
            //第一個參數(shù)返回綁定指令的Dom元素敢靡,第二個參數(shù)為指令的對象
            console.log(element)
            console.log(binding)
            element.innerText = binding.value * 10
            console.log(element instanceof HTMLElement)
            console.dir(element) //打印對象的詳細信息
          },
          //對象寫法,函數(shù)的寫法跟對象的寫法在于函數(shù)的寫法只執(zhí)行了bind苦银,update醋安,inserted是不執(zhí)行的
          fbind: {
            //指令與元素成功綁定時(綁定時只是建立關系,頁面還沒出現(xiàn))會調用(一上來)
            bind(element, binding) {
              console.log('bind')
              element.value = binding.value
            },
            //指令所在元素被插入頁面時調用
            inserted(element, binding) {
              console.log('inserted')
              element.focus()
            },
            //指令所在元素被重新解析頁面時調用
            update(element, binding) {
              console.log('updated')
              element.value = binding.value
              element.focus()
            },
          },
          // bind update一般處理的邏輯都是一致的墓毒,函數(shù)的寫法跟對象的寫法在于函數(shù)的寫法只執(zhí)行了bind,update亲怠,inserted是不執(zhí)行的
          /*注意點:
            1所计、指令名的規(guī)范:<元素 v-big-num> 指令函數(shù)名需要加引號 'big-num'
          */
          //下面寫法focus無效
          // fbind(element, binding) {
          //   //第一個參數(shù)返回綁定指令的Dom元素,第二個參數(shù)為指令的對象
          //   element.value = binding.value
          //   element.focus();//Dom掛載到頁面才能調用团秽,這里的v-fbind只是指令與元素成功綁定時(綁定時只是建立關系主胧,頁面還沒出現(xiàn)),所以這里的focus無效
          // },

          // <button id="btn">點我創(chuàng)建一個input輸入框</button>
          // var btn = document.getElementById("btn")
          // btn.onclick  = ()=>{
          //   const input = document.createdElement("input")
          //   input.focus()
          //   需要等input出來才能focus习勤,因為是操作Dom了踪栋,DOM都還沒出來,添加樣式图毕,添加value等就不受影響
          //   但是項像focus夷都,給input的父元素添加css,如 input.parentElement.style.bg = ""這些就需要放到appendChild后面
          //   console.log(input.parentElement)//null:還沒appendChild呢予颤,所以不知道input的父元素是誰囤官,
          //   document.body.appendChild("input")
          //   input.focus()
          // }
        },
      })
      // 全局指令的函數(shù)寫法
      Vue.directives('big2', function (element, binding) {
        console.log(element)
        console.log(binding)
        element.innerText = binding.value * 10
        console.log(element instanceof HTMLElement)
        console.dir(element) //打印對象的詳細信息
      })
      //全局指令的對象寫法
      Vue.directives('fbind2', {
        //指令與元素成功綁定時(綁定時只是建立關系冬阳,頁面還沒出現(xiàn))會調用(一上來)
        bind(element, binding) {
          console.log('bind')
          element.value = binding.value
        },
        //指令所在元素被插入頁面時調用
        inserted(element, binding) {
          console.log('inserted')
          element.focus()
        },
        //指令所在元素被重新解析頁面時調用
        update(element, binding) {
          console.log('updated')
          element.value = binding.value
          element.focus()
        },
      })
      app.$mount('#app')
    </script>
  </body>
</html>

鉤子函數(shù)

指令定義函數(shù)提供了幾個鉤子函數(shù)(可選):

bind: 只調用一次,指令第一次綁定到元素時調用党饮,用這個鉤子函數(shù)可以定義一個在綁定時執(zhí)行一次的初始化動作肝陪。

inserted: 被綁定元素插入父節(jié)點時調用(父節(jié)點存在即可調用,不必存在于 document 中)刑顺。

update: 被綁定元素所在的模板更新時調用氯窍,而不論綁定值是否變化。通過比較更新前后的綁定值蹲堂,可以忽略不必要的模板更新(詳細的鉤子函數(shù)參數(shù)見下)狼讨。

componentUpdated: 被綁定元素所在模板完成一次更新周期時調用。

unbind: 只調用一次贯城, 指令與元素解綁時調用熊楼。

鉤子函數(shù)的參數(shù)有:

el: 指令所綁定的元素,可以用來直接操作 DOM 能犯。
binding: 一個對象鲫骗,包含以下屬性:
name: 指令名,不包括 v- 前綴踩晶。
value: 指令的綁定值执泰, 例如: v-my-directive="1 + 1", value 的值是 2。
oldValue: 指令綁定的前一個值渡蜻,僅在 update 和 componentUpdated 鉤子中可用术吝。無論值是否改變都可用。
expression: 綁定值的表達式或變量名茸苇。 例如 v-my-directive="1 + 1" 排苍, expression 的值是 "1 + 1"。
arg: 傳給指令的參數(shù)学密。例如 v-my-directive:foo淘衙, arg 的值是 "foo"。
modifiers: 一個包含修飾符的對象腻暮。 例如: v-my-directive.foo.bar, 修飾符對象 modifiers 的值是 { foo: true, bar: true }彤守。
vnode: Vue 編譯生成的虛擬節(jié)點。
oldVnode: 上一個虛擬節(jié)點哭靖,僅在 update 和 componentUpdated 鉤子中可用具垫。

//九、vue-cli如何新增自定義指令试幽?
//1.創(chuàng)建局部指令

var app = new Vue({
    el: '#app',
    data: {    
    },
    // 創(chuàng)建指令(可以多個)
    directives: {
        // 指令名稱
        dir1: {
            inserted(el) {
                // 指令中第一個參數(shù)是當前使用指令的DOM
                console.log(el);
                console.log(arguments);
                // 對DOM進行操作
                el.style.width = '200px';
                el.style.height = '200px';
                el.style.background = '#000';
            }
        }
    }
})
2.全局指令

Vue.directive('dir2', {
    inserted(el) {
        console.log(el);
    }
})
3.指令的使用

<div id="app">
    <div v-dir1></div>
    <div v-dir2></div>
</div>
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末筝蚕,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌饰及,老刑警劉巖蔗坯,帶你破解...
    沈念sama閱讀 211,376評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異燎含,居然都是意外死亡宾濒,警方通過查閱死者的電腦和手機屏箍,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,126評論 2 385
  • 文/潘曉璐 我一進店門绘梦,熙熙樓的掌柜王于貴愁眉苦臉地迎上來卸奉,“玉大人潘拱,你說我怎么就攤上這事禽最∏赫迹” “怎么了?”我有些...
    開封第一講書人閱讀 156,966評論 0 347
  • 文/不壞的土叔 我叫張陵继找,是天一觀的道長假消。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么盯串? 我笑而不...
    開封第一講書人閱讀 56,432評論 1 283
  • 正文 為了忘掉前任河泳,我火速辦了婚禮,結果婚禮上备禀,老公的妹妹穿的比我還像新娘男翰。我一直安慰自己迫淹,他們只是感情好话原,可當我...
    茶點故事閱讀 65,519評論 6 385
  • 文/花漫 我一把揭開白布庸诱。 她就那樣靜靜地躺著钠四,像睡著了一般。 火紅的嫁衣襯著肌膚如雪褥影。 梳的紋絲不亂的頭發(fā)上檐薯,一...
    開封第一講書人閱讀 49,792評論 1 290
  • 那天举户,我揣著相機與錄音,去河邊找鬼。 笑死梧奢,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播洞渤,決...
    沈念sama閱讀 38,933評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼推溃,長吁一口氣:“原來是場噩夢啊……” “哼寒砖!你這毒婦竟也來了漠嵌?” 一聲冷哼從身側響起约炎,我...
    開封第一講書人閱讀 37,701評論 0 266
  • 序言:老撾萬榮一對情侶失蹤俄认,失蹤者是張志新(化名)和其女友劉穎锉屈,沒想到半個月后部念,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,143評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡氨菇,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,488評論 2 327
  • 正文 我和宋清朗相戀三年儡炼,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片查蓉。...
    茶點故事閱讀 38,626評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡乌询,死狀恐怖,靈堂內的尸體忽然破棺而出豌研,到底是詐尸還是另有隱情妹田,我是刑警寧澤,帶...
    沈念sama閱讀 34,292評論 4 329
  • 正文 年R本政府宣布鹃共,位于F島的核電站鬼佣,受9級特大地震影響,放射性物質發(fā)生泄漏霜浴。R本人自食惡果不足惜晶衷,卻給世界環(huán)境...
    茶點故事閱讀 39,896評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧晌纫,春花似錦税迷、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,742評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至哥牍,卻和暖如春毕泌,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背嗅辣。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工撼泛, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人辩诞。 一個月前我還...
    沈念sama閱讀 46,324評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像纺涤,于是被迫代替她去往敵國和親译暂。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,494評論 2 348

推薦閱讀更多精彩內容