• 自定义指令下拉菜单隐藏


    1. 基于element-ui dropDown插件进行的下拉菜单隐藏指令,可用于自己自定义的下拉菜单
    const isServer = false;
    /* istanbul ignore next */
    export const on = (function () {
      if (!isServer && document.addEventListener) {
        return function (element, event, handler) {
          if (element && event && handler) {
            element.addEventListener(event, handler, false);
          }
        };
      } else {
        return function (element, event, handler) {
          if (element && event && handler) {
            element.attachEvent('on' + event, handler);
          }
        };
      }
    })();
    
    const nodeList = [];
    const ctx = '@@clickoutsideContext';
    
    let startClick;
    let seed = 0;
    
    on(document, 'mousedown', (e) => (startClick = e));
    on(document, 'mouseup', (e) => {
      nodeList.forEach((node) => node[ctx].documentHandler(e, startClick));
    });
    
    function createDocumentHandler(el, binding, vnode) {
      return function (mouseup = {}, mousedown = {}) {
        if (!vnode || !vnode.context || !mouseup.target || !mousedown.target || el.contains(mouseup.target) || el.contains(mousedown.target) || el === mouseup.target || (vnode.context.popperElm && (vnode.context.popperElm.contains(mouseup.target) || vnode.context.popperElm.contains(mousedown.target))))
          return;
    
        if (binding.expression && el[ctx].methodName && vnode.context[el[ctx].methodName]) {
          vnode.context[el[ctx].methodName]();
        } else {
          el[ctx].bindingFn && el[ctx].bindingFn();
        }
      };
    }
    
    /**
     * v-clickoutside
     * @desc 点击元素外面才会触发的事件
     * @example
     * ```vue
     * 
    * ``` */ export default { bind(el, binding, vnode) { nodeList.push(el); const id = seed++; el[ctx] = { id, documentHandler: createDocumentHandler(el, binding, vnode), methodName: binding.expression, bindingFn: binding.value, }; }, update(el, binding, vnode) { el[ctx].documentHandler = createDocumentHandler(el, binding, vnode); el[ctx].methodName = binding.expression; el[ctx].bindingFn = binding.value; }, unbind(el) { let len = nodeList.length; for (let i = 0; i < len; i++) { if (nodeList[i][ctx].id === el[ctx].id) { nodeList.splice(i, 1); break; } } delete el[ctx]; }, };
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    1. 使用如下
    <template>
        <ul>
        	<li v-for="item in list" :key="item.id" v-clickoutslide="() => this.handleClearMore(item)" ></li>
    		......
    	 <ul>
    </template>
    
    // 也可以的做成全局的自定义指令
    // 指令接受一个改变状态的函数为参数
    import clickoutside from "@/directives/clickoutside.js"
    
    
    
    export default {
        directives:{
            clickoutslide
        },
        
        
        methods:{
             handleClearMore(item) {
                item.more = false;
            },
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
  • 相关阅读:
    k8s--基础--12.5--pod--名称空间,标签,节点名称
    如何应对老板需求?
    Hadoop3:MapReduce源码解读之Map阶段的数据输入过程整体概览(0)
    新手必看!!超详细!STM32-基本定时器
    不要忽视算法最朴素的意义
    SpringBoot新增拦截器详解
    那些年,我们一起发现的Bug
    Vue的路由守卫
    阿里巴巴资深架构师熬几个通宵肛出来的Spark+Hadoop+中台实战pdf
    springboot230基于Spring Boot在线远程考试系统的设计与实现
  • 原文地址:https://blog.csdn.net/weixin_45356397/article/details/126751076