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


    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
  • 相关阅读:
    【会议资源】2022年第三届自动化科学与工程国际会议(JCASE 2022)
    解决远程视频会议卡顿问题,优化企业网络办公体验
    常用运维命令
    家谱文化④:江苏百岁老人多达8375人,健康长寿的秘密都写在家谱
    Redis实战篇(三)秒杀
    vscode自定义代码提示
    MySQL性能优化之buffer pool配置优化
    Spring Boot(一)
    第三方代开的微信小程序更换管理员
    ShardingSphere-proxy-5.0.0企业级分库分表、读写分离、负载均衡、雪花算法、取模算法整合(八)
  • 原文地址:https://blog.csdn.net/weixin_45356397/article/details/126751076