vue自定義指令(Directive中的clickoutside.js)的理解


閱讀目錄

vue自定義指令clickoutside.js的理解

vue自定義指令請看如下博客:

vue自定義指令

一般在需要 DOM 操作時我們都需要使用自定義指令的方式去實現,當然一些特殊的事件監聽也可以使用指令,例如監聽外部點擊事件:

我們可以看下 clickoutside.js 如何實現的,如下代碼:

const clickoutsideContext = '@@clickoutsideContext';

export default {
  /*
   @param el 指令所綁定的元素
   @param binding {Object} 
   @param vnode vue編譯生成的虛擬節點
   */
  bind (el, binding, vnode) {
    const documentHandler = function(e) {
      console.log(el)
      console.log(e.target);
      console.log(vnode);
      console.log(binding);
      
      if(!vnode.context || el.contains(e.target)) {
        return false;
      }
      if (binding.expression) {
        vnode.context[el[clickoutsideContext].methodName](e)
      } else {
        el[clickoutsideContext].bindingFn(e);
      }
    }
    el[clickoutsideContext] = {
      documentHandler,
      methodName: binding.expression,
      bindingFn: binding.value
    }
    setTimeout(() => {
      document.addEventListener('click', documentHandler);
    }, 0)
  },
  update (el, binding) {
    el[clickoutsideContext].methodName = binding.expression;
    el[clickoutsideContext].bindingFn = binding.value;
  },
  unbind(el) {
    document.removeEventListener('click', el[clickoutsideContext].documentHandler);
  }
}

在外部調用 clickoutside.vue 代碼如下:

<template>
  <div v-clickoutside="handleClickOutSide">1111111</div>
</template>

<script>
  import clickoutside from '../../directive/clickoutside';
  export default {
    methods: {
      handleClickOutSide(e) {
        // 當外部被點擊時調用
        console.log(e);
        console.log(111)
      }
    },
    directives: {
      clickoutside
    }
  }
</script>

具體效果可以 查看git上的demo

把代碼克隆下來,在本地運行項目 npm run dev 就可以啟動本地項目預覽~ 

下面我們來分下下 如上打印的字段含義:

當我隨便在document點擊一下,會打印console.log() 如下信息的含義:

1. console.log(el);  指被綁定的元素,打印信息如下:

<div>1111111</div>;

2. console.log(e.target); 打印信息如下:

3. console.log(vnode); 打印信息如下:

4. console.log(binding); 打印信息如下:

當我點擊一下,會調用外部的方法:

methods: {
      handleClickOutSide(e) {
        // 當外部被點擊時調用
        console.log(e);
        console.log(111)
      }
 },


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM