关于标题弹出指令

简介

写这个目的是便于自己整理知识点, 首先我本来就对js了解不多,看到这部分让我很难受。 这人一看到从上到下一个都不认识的东西就很不想看这个,虽然教程说五遍大法,但是敲过去都不知道这步是干嘛的,说实话这部分我手看了一波劝退了一波,今天不知道是学习欲望来了还是什么,竟然非常有耐心的看下去了。废话就不多少了,写这部分就是想吐槽下(难受这竟然才是基础教程!!!!)

开始对于代码刨析

首先我先贴一个完整的代码(看看就行别被劝退!)

/* jshint esversion: 6 */
// 在 el 元素的上方显示或隐藏一个内容为 title 的提示框
function showTitle(el, title) {
    const popover = getPopover();
    const popoverStyle = popover.style;


    if (title === undefined) {
        popoverStyle.display = 'none';
    } else {
        const elRect = el.getBoundingClientRect();
        const elComputedStyle = window.getComputedStyle(el, null);
        const rightOffset = parseInt(elComputedStyle.getPropertyValue('padding-right')) || 0;
        const topOffset = parseInt(elComputedStyle.getPropertyValue('padding-top')) || 0;

        popoverStyle.visibility = 'hidden';
        popoverStyle.display = 'block';
        popover.querySelector('.popover-content').textContent = title;
        popoverStyle.left = elRect.left - popover.offsetWidth / 2 + (el.offsetWidth - rightOffset) / 2 + 'px';
        popoverStyle.top = elRect.top - popover.offsetHeight + topOffset + 'px';
        popoverStyle.display = 'block';
        popoverStyle.visibility = 'visible';
    }
}
// 创建或者返回一个提示框
function getPopover() {
    let popover = document.querySelector('.title-popover');

    if (!popover) {
        const tpl = `
      <div class="popover title-popover top fade in" style="position:fixed;">
        <div class="arrow"></div>
        <div class="popover-content"></div>
      </div>
    `;
        const fragment = document.createRange().createContextualFragment(tpl);
        document.body.appendChild(fragment);
        popover = document.querySelector('.title-popover');
    }

    return popover;
}

export default {
    bind(el, binding, vnode) {
        // 使用 const 声明一个只读的常量,其值是需要监听的事件类型列表
        const events = ['mouseenter', 'mouseleave', 'click'];
        // 声明一个处理器,以根据不同的事件类型传不同的参数
        const handler = (event) => {
            if (event.type === 'mouseenter') {
                // 显示一个提示框
                showTitle(el, binding.value);
            } else {
                // 隐藏一个提示框
                showTitle();
            }
        }
        // 在 el 元素上添加事件监听
        events.forEach((event) => {
            el.addEventListener(event, handler, false);
        })
        // 在 el 元素上添加一个属性,以在其他钩子进行访问
        el.destroy = () => {
            // 移除 el 元素上的事件监听
            events.forEach((event) => {
                el.removeEventListener(event, handler, false);
            })
            // 移除 el 元素上的 destroy
            el.destroy = null;
        }
    },
    unbind(el) {
        // 移除事件监听和数据绑定
        el.destroy();
    }
}

看到这里先不要慌(反正我是从上到下除了汉字其他都不认识)

看到这里首先要理解一下观看顺序(为了方便理解,我对下面代码做了一点简略处理)

export default {
    bind(el, binding, vnode) {
    // bind:只调用一次,指令第一次绑定到元素时调用,在这里可以进行一次性的初始化设置
    //先忽略部分具体逻辑
}
  },
  unbind(el){
        el.destroy();//下面详细介绍
  }
};

destroy方法

首先我要说下destroy()方法 这个是自己定义的
引用大佬原话

el是啥,又不是vnode,怎么会有 destroy这个方法 el只是一个dom,dom不是vue组件,它是原生的dom节点
—pigzzz

具体逻辑如下

el.destroy = () => {
    // 移除 el 元素上的事件监听
      events.forEach((event) => {
        el.removeEventListener(event, handler, false)
    })
    // 移除 el 元素上的 destroy  
    el.destroy = null

forEach()这里就不用在讲解了这只是一个简单的数据遍历中的数组event

 // 使用 const 声明一个只读的常量,其值是需要监听的事件类型列表
        const events = ['mouseenter', 'mouseleave', 'click']
        //事件类型分别是 
        //mouseenter:当鼠标指针进入(穿过)元素时触发
        //mouseleave : 鼠标指针离开时触发
        //click : 点击时触发

[removeEventListener() 不知道这个方法的戳一下!!!!

本作品采用《CC 协议》,转载必须注明作者和本文链接
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!