2020-08-31 Vue 自定義指令

自定義指令

    1. 語法
//全局指令
    Vue.directive('指令名字',{
        //鉤子函數(shù)(不同時期自動調(diào)用)
        bind(el,binding){
            //el 是綁定元素(dom對象)
            //binding 是對象 name 是指令名字 value 使用指令傳的參數(shù)
            // 只觸發(fā)一次
        },
        inserted(el,binding){
             //el 是綁定元素(dom對象)
            //binding 是對象 name 是指令名字 value 使用指令傳的參數(shù)
            // 當(dāng)前元素 插入到 父節(jié)點中 觸發(fā)
        }
    })


let Home = {
        template:{},
        data(){
            return{}
        },
        directives:{
            "指令名":{
                bind(el,binding){
                    //el 是綁定元素(dom對象)
                    //binding 是對象 name 是指令名字 value 使用指令傳的參數(shù)
                    // 只觸發(fā)一次
                },
                inserted(el,binding){
                    //el 是綁定元素(dom對象)
                    //binding 是對象 name 是指令名字 value 使用指令傳的參數(shù)
                    // 當(dāng)前元素 插入到 父節(jié)點中 觸發(fā)
                }
            }
        }
    }
    1. 自動獲取焦點的小案例
<body>
  <div id="app">
    <input type="text" v-focus="100">
  </div>
</body>
<script src="./js/vue.js"></script>
<script>

  //定義一個指令全局,自動獲取焦點
  Vue.directive('focus',{
    inserted(el,binding){
      //el代指使用該指令的元素
      el.focus();
      //binding 傳入的一些數(shù)據(jù)
    }
  })

  let vm = new Vue({
    el:'#app',
    data:{

    }
  })
</script>
    1. 回到頂部的小案例
  <style>
    body {
      height: 2500px;
    }
    button {
      display: block;
      width: 30px;
      height: 120px;
      text-align: center;
      line-height: 30px;
      border-radius: 10px 10px 0px 0px;
      position: fixed;
      bottom: 70px;
      right: 40px;
      display: none;
    }

  </style>
</head>
<body>
  <div id="app">
    <button v-scroll="500">回到頂部</button>
  </div>
</body>
<script src="./js/vue.js"></script>
<script src="./js/jquery.min.js"></script>
<script>

  //定義一個指令全局,回到頂部案例
  Vue.directive('scroll',{
    inserted(el,binding){
      //el代指使用該指令的元素
      
      //binding 傳入的一些數(shù)據(jù)(這里是500)
      let top = binding.value;

      //綁定滾輪事件
      window.onscroll = function(){
        let scrollTop = document.documentElement.scrollTop || document.body.scrollTop;
        if(scrollTop > top){
          // el.style.display = "block"
          $(el).fadeIn()
        }else {
          $(el).fadeOut()
        }
      }
      //綁定事件回到頂部
      $(el).click(function(){
        window.scrollTo({
          top:0,
          behavior:"smooth"
        })
      })
    },

    //移除事件,提高性能
    unbind(){
      //如果在inserted創(chuàng)建了定時器沒清除,或者綁定了全局的事件,需要清除操作
      window.onscroll = null;
    }
  })


  let vm = new Vue({
    el:'#app',
    data:{

    }
  })
</script>

鉤子函數(shù)

鉤子函數(shù)
一個指令定義對象可以提供如下幾個鉤子函數(shù) (均為可選):

bind:只調(diào)用一次,指令第一次綁定到元素時調(diào)用。在這里可以進行一次性的初始化設(shè)置。

inserted:被綁定元素插入父節(jié)點時調(diào)用 (僅保證父節(jié)點存在,但不一定已被插入文檔中)。

update:所在組件的 VNode 更新時調(diào)用,但是可能發(fā)生在其子 VNode 更新之前。指令的值可能發(fā)生了改變,也可能沒有。但是你可以通過比較更新前后的值來忽略不必要的模板更新 (詳細(xì)的鉤子函數(shù)參數(shù)見下)。

我們會在稍后討論渲染函數(shù)時介紹更多 VNodes 的細(xì)節(jié)。

componentUpdated:指令所在組件的 VNode 及其子 VNode 全部更新后調(diào)用。

unbind:只調(diào)用一次,指令與元素解綁時調(diào)用。

接下來我們來看一下鉤子函數(shù)的參數(shù) (即 el、binding、vnode 和 oldVnode)。

鉤子函數(shù)參數(shù)
指令鉤子函數(shù)會被傳入以下參數(shù):

el:指令所綁定的元素,可以用來直接操作 DOM。
binding:一個對象,包含以下 property:
      name:指令名,不包括 v- 前綴。
      value:指令的綁定值,例如:v-my-directive="1 + 1" 中,綁定值為 2。
      oldValue:指令綁定的前一個值,僅在 update 和 componentUpdated 鉤子中可用。無論值是否改變都可用。
      expression:字符串形式的指令表達(dá)式。例如 v-my-directive="1 + 1" 中,表達(dá)式為 "1 + 1"。
      arg:傳給指令的參數(shù),可選。例如 v-my-directive:foo 中,參數(shù)為 "foo"。
      modifiers:一個包含修飾符的對象。例如:v-my-directive.foo.bar 中,修飾符對象為 { foo: true,         bar: true }。
      vnode:Vue 編譯生成的虛擬節(jié)點。移步 VNode API 來了解更多詳情。
      oldVnode:上一個虛擬節(jié)點,僅在 update 和 componentUpdated 鉤子中可用。

局部指令定義

//局部自定義指令,和局部組件components類似
  let Home = {
    directives:{
      focus:{
        bind(){

        },
        inserted(el,binding){

        }
      }
    }
  }
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容