当前位置:首页 > VUE

vue实现下拉菜单

2026-03-26 18:34:50VUE

实现下拉菜单的基本结构

使用 Vue 的 v-showv-if 控制下拉菜单的显示与隐藏。通过点击按钮触发状态切换。

vue实现下拉菜单

<template>
  <div class="dropdown">
    <button @click="toggleDropdown">点击展开</button>
    <ul v-show="isOpen">
      <li>选项1</li>
      <li>选项2</li>
      <li>选项3</li>
    </ul>
  </div>
</template>

<script>
export default {
  data() {
    return {
      isOpen: false
    };
  },
  methods: {
    toggleDropdown() {
      this.isOpen = !this.isOpen;
    }
  }
};
</script>

<style>
.dropdown {
  position: relative;
  display: inline-block;
}
.dropdown ul {
  position: absolute;
  list-style: none;
  padding: 0;
  margin: 0;
  border: 1px solid #ccc;
}
.dropdown li {
  padding: 8px 16px;
  cursor: pointer;
}
.dropdown li:hover {
  background-color: #f5f5f5;
}
</style>

添加点击外部关闭功能

通过监听全局点击事件,判断点击目标是否在下拉菜单外部,实现自动关闭。

vue实现下拉菜单

<template>
  <div class="dropdown" ref="dropdown">
    <button @click.stop="toggleDropdown">点击展开</button>
    <ul v-show="isOpen">
      <li>选项1</li>
      <li>选项2</li>
    </ul>
  </div>
</template>

<script>
export default {
  data() {
    return {
      isOpen: false
    };
  },
  methods: {
    toggleDropdown() {
      this.isOpen = !this.isOpen;
    },
    closeDropdown(event) {
      if (!this.$refs.dropdown.contains(event.target)) {
        this.isOpen = false;
      }
    }
  },
  mounted() {
    document.addEventListener('click', this.closeDropdown);
  },
  beforeDestroy() {
    document.removeEventListener('click', this.closeDropdown);
  }
};
</script>

使用 Vue 组件封装

将下拉菜单封装为可复用的组件,通过插槽(slot)支持自定义内容。

<!-- Dropdown.vue -->
<template>
  <div class="dropdown" ref="dropdown">
    <div @click.stop="toggleDropdown">
      <slot name="trigger"></slot>
    </div>
    <div v-show="isOpen" class="dropdown-content">
      <slot name="content"></slot>
    </div>
  </div>
</template>

<script>
export default {
  data() {
    return {
      isOpen: false
    };
  },
  methods: {
    toggleDropdown() {
      this.isOpen = !this.isOpen;
    },
    closeDropdown(event) {
      if (!this.$refs.dropdown.contains(event.target)) {
        this.isOpen = false;
      }
    }
  },
  mounted() {
    document.addEventListener('click', this.closeDropdown);
  },
  beforeDestroy() {
    document.removeEventListener('click', this.closeDropdown);
  }
};
</script>

调用封装组件

在父组件中传入自定义的触发器和下拉内容。

<template>
  <Dropdown>
    <template v-slot:trigger>
      <button>自定义触发器</button>
    </template>
    <template v-slot:content>
      <ul>
        <li>自定义选项1</li>
        <li>自定义选项2</li>
      </ul>
    </template>
  </Dropdown>
</template>

<script>
import Dropdown from './Dropdown.vue';
export default {
  components: { Dropdown }
};
</script>

注意事项

  • 事件冒泡处理:使用 @click.stop 阻止触发器点击事件冒泡,避免触发外部关闭逻辑。
  • 性能优化:在组件销毁时移除全局事件监听,避免内存泄漏。
  • 无障碍支持:为下拉菜单添加 aria-expanded 属性,增强屏幕阅读器兼容性。

标签: 菜单vue
分享给朋友:

相关文章

vue实现横向导航

vue实现横向导航

vue实现横向导航的方法 使用Flex布局实现横向导航 在Vue中可以通过Flex布局快速实现横向导航。创建一个组件,使用display: flex和flex-direction: row属性使导航项…

vue SSG实现

vue SSG实现

Vue SSG 实现方法 Vue 的静态站点生成(SSG)可以通过多种工具和框架实现,以下是几种常见的方法: 使用 VuePress VuePress 是一个基于 Vue 的静态站点生成器,适合文档…

vue实现粘贴

vue实现粘贴

Vue 实现粘贴功能的方法 在 Vue 中实现粘贴功能通常涉及监听粘贴事件并处理剪贴板数据。以下是几种常见的实现方式: 监听原生粘贴事件 通过 @paste 指令或原生 addEventListen…

vue实现slot

vue实现slot

Vue 中的 Slot 实现方法 Vue 的 slot 是一种内容分发机制,允许父组件向子组件插入内容。以下是几种常见的 Slot 实现方式: 默认 Slot 子组件通过 <slot>…

vue实现录像

vue实现录像

Vue 实现录像功能 在 Vue 中实现录像功能通常需要借助浏览器的 MediaDevices API 和 MediaRecorder API。以下是实现步骤: 获取用户摄像头和麦克风权限 使用 n…

vue实现 hover

vue实现 hover

实现 Vue 中的 hover 效果 在 Vue 中实现 hover 效果可以通过多种方式完成,以下是常见的几种方法: 使用 CSS 伪类 最简单的方式是直接使用 CSS 的 :hover 伪类,无…