当前位置:首页 > 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 实现查询替换功能 在 Vue 中实现查询替换功能,可以通过数据绑定和字符串操作方法结合实现。以下是具体实现方式: 基础实现 <template> <div>…

vue实现签章

vue实现签章

Vue 实现签章功能 签章功能通常包括手写签名、电子印章等。以下是基于 Vue 的实现方法: 使用 canvas 实现手写签名 安装依赖(如需要): npm install signature_p…

vue实现popup

vue实现popup

Vue 实现 Popup 弹窗 使用 Vue 原生组件 创建一个基本的 Vue 组件作为弹窗,通过 v-if 或 v-show 控制显示隐藏。 <template> <div&…

vue实现接口

vue实现接口

在 Vue 中实现接口请求 Vue 本身不直接提供 HTTP 请求功能,通常需要借助第三方库如 axios 或 fetch 来实现接口请求。以下是几种常见方法: 使用 axios 发送请求 安装 a…

vue实现表单

vue实现表单

Vue 表单实现方法 双向数据绑定 使用 v-model 指令实现表单元素与数据的双向绑定。适用于 input、textarea、select 等元素。 <template> <…

vue实现展开

vue实现展开

展开功能的实现方法 在Vue中实现展开功能可以通过多种方式完成,常见的有使用v-show、v-if指令,结合CSS过渡动画或第三方组件库。 使用v-show控制显示隐藏 通过v-show指令可以简单…