导出下拉菜单的指令:(让元素显示/隐藏)

1). 导出下拉指令对象

在 src/directives 下新建 dropdown.js 文件,复制贴入以下代码:

src/directives/dropdown.js

 1 xport default {
 2   bind(el, binding, vnode) {
 3     const handler = () => {// 当前元素的事件处理器
 4       el.parentElement.classList.toggle('open')// 找到当前元素的父元素,切换它的 open 类
 5     }
 6 
 7     const documentHandler = (e) => {// document 的事件处理器
 8       const target = e.target// 当前点击的目标
 9 
10       if (target.isSameNode(el) || el.contains(target)) return// 如果点击的是当前元素,或者是当前元素的后代节点,就不处理
11       el.parentElement.classList.remove('open')// 找到当前元素的父元素,移除 open 类
12     }
13 
14     el.addEventListener('click', handler, false)
15     document.addEventListener('click', documentHandler, false)
16 
17     el.destroy = () => {
18       el.removeEventListener('click', handler, false)
19       document.removeEventListener('click', documentHandler, false)
20       el.destroy = null
21     }
22   },
23   unbind(el) {
24     el.destroy()
25   }
26 }

2). 注册全局下拉指令

打开 src/directives/index.js 文件,复制贴入以下代码:

src/directives/index.js

 1 import Vue from 'vue'
 2 import validator from './validator'
 3 import dropdown from './dropdown'
 4 
 5 const directives = {
 6   validator,
 7   dropdown
 8 }
 9 
10 for (const [key, value] of Object.entries(directives)) {
11   Vue.directive(key, value)
12 }

我们这里使用一个循环,来注册我们的所有指令,Object.entries 返回给定对象的键值对数组,以 Object.entries(directives) 的返回为例:

[['validator', {...}], ['dropdown', {...}]]

3). 使用下拉菜单指令

打开 TheEntry.vue 文件,查找 <a href="javascript:;">,添加 v-dropdown

src/components/layouts/TheEntry.vue

1 <a v-dropdown href="javascript:;">
2   <span v-if="user">
3     <img v-if="user.avatar" :src="user.avatar" class="avatar-topnav">
4     <span v-if="user.name">{{ user.name }}</span>
5   </span>
6   <span v-else>佚名</span>
7   <span class="caret"></span>
8 </a>
原文地址:https://www.cnblogs.com/yangguoe/p/9309945.html