閱讀目錄
vue自定義指令clickoutside.js的理解
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) } },
