vue实现鼠标移过出现下拉二级菜单功能

基于Vue.js实现鼠标移过出现下拉二级菜单功能的完整攻略如下:

步骤一:准备数据源

首先,我们需要准备一个数据源来存储菜单信息。数据源可以是一个包含菜单项和对应子菜单的数组对象,也可以是一个JSON文件。在本例中,我们用一个对象数组来存储数据源,对象包含两个属性:

  • text:菜单项的文本内容
  • children:菜单项下的子菜单,是一个包含子菜单项的数组对象

下面是一个数据源的示例:

let menuItems = [
  {
    text: '首页',
    children: []
  },
  {
    text: '产品',
    children: [
      {
        text: '产品1'
      },
      {
        text: '产品2'
      },
      {
        text: '产品3'
      }
    ]
  },
  {
    text: '服务',
    children: [
      {
        text: '服务1'
      },
      {
        text: '服务2'
      }
    ]
  }
]

步骤二:构建Vue组件

接下来,我们需要构建一个Vue组件来渲染菜单。组件包括以下代码:

<template>
  <ul class="menu">
    <li v-for="item in items" :key="item.text" @mouseenter="showSubMenu(item)"
        @mouseleave="hideSubMenu">
      {{ item.text }}
      <ul v-if="item.children" :class="{ 'is-active': subMenuVisible }">
        <li v-for="subItem in item.children" :key="subItem.text">{{ subItem.text }}</li>
      </ul>
    </li>
  </ul>
</template>

<script>
export default {
  props: {
    items: {
      type: Array,
      required: true
    }
  },
  data() {
    return {
      subMenuVisible: false
    }
  },
  methods: {
    showSubMenu(item) {
      this.subMenuVisible = true
    },
    hideSubMenu() {
      this.subMenuVisible = false
    }
  }
}
</script>

<style scoped>
.menu {
  list-style: none;
  margin: 0;
  padding: 0;
}
.menu > li {
  display: inline-block;
  padding: 10px;
  position: relative;
}
.menu > li ul {
  position: absolute;
  left: 0;
  top: 100%;
  display: none;
}
.menu > li ul.is-active {
  display: block;
}
</style>

该组件包含以下部分:

  • template:组件的模板,用于渲染菜单项和子菜单
  • props:组件的输入属性,用于接收数据源
  • data:组件的状态,用于记录当前子菜单的显示状态
  • methods:组件的方法,用于处理菜单项的鼠标事件
  • style:组件的样式,用于布局和美化菜单

步骤三:使用Vue组件

在步骤二中,我们已经完成了一个菜单的Vue组件。现在,我们需要在页面中使用该组件,并传递数据源。我们可以在Vue实例中引入组件,并将菜单数据源传递给组件的items属性。

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Vue Mouseover Dropdown Menu</title>
  <link rel="stylesheet" href="style.css">
</head>
<body>
  <div id="app">
    <menu :items="menuItems"></menu>
  </div>
  <script src="https://cdn.jsdelivr.net/npm/vue"></script>
  <script src="app.js"></script>
</body>
</html>

在这个示例中,我们将Vue实例挂载到#app元素,使用了一个名为menu的组件,并将菜单数据源传递给了items属性。

示例1:使用自定义指令

我们可以使用自定义指令来实现菜单项的事件处理逻辑,代码如下:

<template>
  <ul class="menu">
    <li v-for="item in items" :key="item.text"
        v-hover="{ enter: () => showSubMenu(item), leave: hideSubMenu }">
      {{ item.text }}
      <ul v-if="item.children" :class="{ 'is-active': subMenuVisible }">
        <li v-for="subItem in item.children" :key="subItem.text">{{ subItem.text }}</li>
      </ul>
    </li>
  </ul>
</template>

<script>
export default {
  props: {
    items: {
      type: Array,
      required: true
    }
  },
  data() {
    return {
      subMenuVisible: false
    }
  },
  methods: {
    showSubMenu(item) {
      this.subMenuVisible = true
    },
    hideSubMenu() {
      this.subMenuVisible = false
    }
  },
  directives: {
    hover: {
      bind(el, binding) {
        const callbacks = binding.value
        el.addEventListener('mouseenter', callbacks.enter)
        el.addEventListener('mouseleave', callbacks.leave)
      },
      unbind(el, binding) {
        const callbacks = binding.value
        el.removeEventListener('mouseenter', callbacks.enter)
        el.removeEventListener('mouseleave', callbacks.leave)
      }
    }
  }
}
</script>

在该示例中,我们使用了自定义指令v-hover来监听菜单项的鼠标事件,并使用JavaScript函数作为指令的值传递给指令。具体来说,我们在指令的bindunbind钩子函数中,分别向菜单项元素添加和移除鼠标事件监听器。

以下是使用该自定义指令的示例:

<li v-for="item in items" :key="item.text"
    v-hover="{ enter: () => showSubMenu(item), leave: hideSubMenu }">
  {{ item.text }}
</li>

示例2:使用修饰符和计算属性

在Vue中,我们可以使用修饰符来对指令的行为进行修饰。在本例中,我们可以使用@mouseenter.prevent修饰符,来阻止鼠标事件的默认行为,例如,阻止浏览器自动打开链接。另外,我们还可以使用计算属性来控制子菜单的显示状态。

以下是使用修饰符和计算属性的代码示例:

<template>
  <ul class="menu">
    <li v-for="item in items" :key="item.text"
        @mouseenter.prevent="showSubMenu(item)"
        @mouseleave="hideSubMenu">
      {{ item.text }}
      <ul v-if="hasSubMenu(item)" :class="{ 'is-active': isSubMenuVisible(item) }">
        <li v-for="subItem in item.children" :key="subItem.text">{{ subItem.text }}</li>
      </ul>
    </li>
  </ul>
</template>

<script>
export default {
  props: {
    items: {
      type: Array,
      required: true
    }
  },
  methods: {
    showSubMenu(item) {
      this.subMenuVisible = true
    },
    hideSubMenu() {
      this.subMenuVisible = false
    },
    hasSubMenu(item) {
      return item.children && item.children.length > 0
    }
  },
  computed: {
    subMenuVisibleItem() {
      return this.items.find(item => item.subMenuVisible)
    }
  }
}
</script>

在该示例中,我们使用了代替v-hover指令的@mouseenter.prevent修饰符,同时使用了计算属性subMenuVisibleItem来获取当前显示子菜单的菜单项。

以上两个示例演示了使用不同的方式来实现Vue鼠标移过出现下拉二级菜单的功能,您可以根据自己的需求选择相应的实现方式。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:vue实现鼠标移过出现下拉二级菜单功能 - Python技术站

(0)
上一篇 2023年6月10日
下一篇 2023年6月10日

相关文章

  • CSS实现body背景层高于块元素的方法

    将body的背景层设置为高于块元素,可以使用以下两种方法: 方法一:使用伪元素 伪元素可以在body前面添加一层覆盖层,从而实现body背景层高于其他块元素。 首先,需要在CSS中添加以下样式: body { position: relative; z-index: 1; /* 将body的层级设为1,确保该元素在页面中的层级最高 */ } body::be…

    css 2023年6月10日
    00
  • 前端十几道含答案的大厂面试题总结

    下面是关于“前端十几道含答案的大厂面试题总结”的完整攻略: 一、准备工作 了解面试的内容和流程。 在参加前端面试之前,首先需要了解面试的具体内容和流程。可以通过相关的文章、视频或书籍等多种途径进行学习和了解,以便更好地应对面试。 学习面试所需的知识和技能。 针对此次面试题目总结,需要掌握 HTML、CSS、JavaScript、Vue、React 等前端技能…

    css 2023年6月9日
    00
  • js获取及修改网页背景色和字体色的方法

    获取及修改网页背景色和字体颜色是web前端开发常见操作。下面是如何使用JS获取及修改网页背景色和字体色的攻略。 获取网页背景色和字体颜色 获取背景色 方法一:通过document.body.style.backgroundColor获取网页背景色 console.log(document.body.style.backgroundColor); // 输出网…

    css 2023年6月9日
    00
  • CSS中理解层叠性及权重如何分配

    CSS中的层叠性和权重是很重要的概念,它们影响着样式的表现和优先级,下面为你详细讲解。 什么是层叠性 层叠性指的是当多个CSS样式作用在同一个HTML元素上时,它们之间的优先级及表现方式。当同一元素上出现了多个CSS规则,浏览器会根据规则来确定其最终表现形式。 如何理解层叠性 我们可以理解为,一个元素的样式可以由多条规则共同定义,不同规则可能会对同一个样式属…

    css 2023年6月9日
    00
  • CSS3制作日历实现代码

    下面我将为您详细讲解“CSS3制作日历实现代码”的完整攻略。 1. 概述 在制作日历时,我们可以使用HTML和CSS技术结合实现,其中CSS3的强大效果能够让我们的日历更加美观、炫酷。在这个过程中我们需要使用到CSS3属性及相关的样式设置,同时还需要使用HTML标签结构来实现日历。 2. HTML标签结构 日历的核心是一个个日期格子,因此我们可以使用HTML…

    css 2023年6月10日
    00
  • 移动端前端适配方案(总结)

    移动端前端适配方案(总结) 1. 为什么需要移动端适配? 在PC端开发中,我们通常使用px做为长度单位进行开发,因为PC端屏幕大小不会随着设备变化而变化,因此使用固定的像素单位长度并不会影响网站的显示效果。然而在移动端,因为移动设备的屏幕尺寸各异,因此使用固定像素的方式进行设计和开发,可能会导致在不同设备上出现内容偏大或偏小,影响用户体验。 因此,为了在移动…

    css 2023年6月10日
    00
  • ANT 压缩(去掉空格/注释)JS文件可提高js运行速度

    对于前端项目,JavaScript文件往往是最大的一个个体文件,优化他的运行速度对整个网站性能的提升是极为重要的。使用ANT工具可以压缩JavaScript文件,去掉一些不必要的空格和注释,并且经过压缩后的文件不会对原有的代码结构和逻辑产生任何影响。 以下是使用ANT压缩JavaScript文件的完整攻略: 1、安装ANT 首先你需要安装ANT工具,可在官网…

    css 2023年6月9日
    00
  • css按坐标取背景图示例代码

    下面就详细讲解一下“CSS按坐标取背景图示例代码”的攻略。 什么是按坐标取背景图? 按坐标取背景图就是从一张大背景图中,通过CSS样式取出背景图中的一个小块。常见的应用场景是利用一张大图,按照需求不同的坐标,显示出不同的图案或区域。 实现方法 CSS的background-position属性可以让我们非常方便地实现按坐标取背景图。该属性用于设置背景图片的起…

    css 2023年6月9日
    00
合作推广
合作推广
分享本页
返回顶部