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 Gird布局教程指南

    当谈到网页布局技术时,CSS Grid应该是最流行的之一。下面是一个CSS Grid布局教程指南,让您了解如何使用CSS Grid来构建现代、响应式的网站布局。 什么是CSS Grid? CSS Grid是一个网页布局技术,它允许您创建复杂的网格结构,以更好地控制您的网页上的元素排列。使用CSS Grid,您可以轻松地创建响应式布局,以满足不同屏幕尺寸的需求…

    css 2023年6月10日
    00
  • CSS学习之五 定位布局

    我来详细讲解一下“CSS学习之五 定位布局”的完整攻略。 一、什么是定位布局 在CSS中,定位布局是通过设置元素的定位属性,来改变元素在文档中的位置和大小。常用的定位属性有:position,top,right,bottom和left。 二、定位属性的介绍 1. position属性 该属性被用来指定一个元素在文档中的定位方式,其取值可以是absolute、…

    css 2023年6月9日
    00
  • firefox下有滚动条时页面抖动问题的解决方法

    针对“firefox下有滚动条时页面抖动问题”的解决方法,我整理了以下完整攻略: 问题背景 在firefox浏览器中,当页面内容高度大于窗口高度,并且出现纵向滚动条时,滚动条会挤占页面宽度,从而导致页面宽度变化,进而导致页面抖动。 解决方法 为了解决这个问题,我们可以采用CSS属性来限制纵向滚动条的出现,从而避免宽度变化,进而避免页面抖动。 CSS中的ove…

    css 2023年6月10日
    00
  • 深入挖掘Windows脚本技术第2/2页

    “深入挖掘Windows脚本技术”是一本深入讲解Windows脚本技术的书籍。其第2/2页主要讲述了如何利用Windows脚本技术进行网络编程、系统管理和编写自定义错误处理程序等方面的内容。 网络编程 在网络编程方面,通过使用Windows脚本技术,可以轻松地创建TCP/IP和UDP协议的网络应用程序。其具体示例如下: ‘ TCP连接客户端 Set objC…

    css 2023年6月10日
    00
  • css设置多列等高布局的方法示例

    下面是CSS设置多列等高布局的攻略: 1. 使用flexbox布局 flexbox是一种强大的CSS布局模式,可以帮助实现多列等高布局。 首先需要在容器上设置display: flex;属性,然后对子元素设置flex-grow: 1;属性,这样就可以让所有子元素高度相等。如果需要控制子元素高度不会无限增长,可以设置flex-basis属性来限制子元素的基础尺…

    css 2023年6月9日
    00
  • 浅析微信小程序自定义日历组件及flex布局最后一行对齐问题

    下面我将详细讲解如何自定义微信小程序日历组件以及如何解决Flex布局最后一行对齐问题。 一、微信小程序自定义日历组件的开发 1. 组件需求与功能 日历组件是一个比较常见的组件,尤其在需要显示多个日期或者时间的场景中使用较多。在微信小程序中,可以通过自定义组件的形式来开发日历组件,下面是该组件的实现需求与功能: 实现可以选择年、月、日的日历组件 可以显示指定月…

    css 2023年6月11日
    00
  • css中转换为行内样式的解决方案(css-inline)

    下面是详细讲解 “css中转换为行内样式的解决方案(css-inline)” 的攻略: 什么是 “css中转换为行内样式的解决方案 (css-inline)”? 在开发网站或发送邮件等场合,我们需要将css文件中的样式转换为行内样式,这可以帮助我们避免引用外部样式表,从而达到控制网站或邮件结构和样式的目的。 “css中转换为行内样式的解决方案 (css-in…

    css 2023年6月9日
    00
  • 详解css外边距折叠(margin collapsing)

    详解CSS外边距折叠 什么是外边距折叠? 在 CSS 中,相邻的两个块级元素垂直方向的外边距会发生重叠,这种行为叫做外边距折叠。当发生外边距折叠时,相邻两个元素之间将会只有一个外边距,而不是两个外边距之和。 外边距折叠只会发生在块级元素上,行内元素没有外边距,不会发生外边距折叠。 哪些情况会发生外边距折叠? 相邻兄弟元素之间的外边距会发生折叠。 父元素和第一…

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