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日

相关文章

  • 一步一步教你写带图片注释的淡入淡出插件(四)

    本文主要讲解如何编写一个带有图片注释的淡入淡出插件,一步一步地实现它。这是第四篇文章,下面我将详细介绍实现该插件所需的步骤。 步骤1:编写HTML结构 首先,我们需要编写HTML结构。在HTML中,我们需要一个父容器和多个子容器,每个子容器都包含一张图片和对应的注释。代码如下: <!– 父容器 –> <div class="f…

    css 2023年6月11日
    00
  • jQuery常见的选择器及用法介绍

    jQuery常见的选择器及用法介绍 jQuery是一个流行的JavaScript库,它广泛用于Web开发中。在jQuery中,选择器对于处理和操作DOM元素非常重要。以下是一些常见的jQuery选择器及其用法介绍。 基本选择器 ID选择器 使用ID选择器,可以根据元素的id属性值来选择元素。可以使用#符号来指定ID选择器。 $("#myDiv&qu…

    css 2023年6月10日
    00
  • DIV背景半透明文字不半透明的样式

    当需要在网页上实现背景半透明、且文字不半透明的效果时,一种解决方案是使用CSS3的RGBA色彩模式,将背景色中的alpha值(透明度)调整为小于1的值。 我们可以采用以下步骤来实现这个效果: 1. 创建HTML元素 首先需要在HTML中创建一个元素,并为其添加唯一的class或id属性,用于在CSS中引用。例如,我们创建了一个div元素,其class属性为“…

    css 2023年6月11日
    00
  • Javascript Bootstrap的网格系统,导航栏和轮播详解

    关于Javascript Bootstrap的网格系统、导航栏和轮播的完整攻略,我将从以下几个方面进行详细讲解: 什么是Bootstrap Bootstrap网格系统 Bootstrap导航栏 Bootstrap轮播 1. 什么是Bootstrap Bootstrap是Twitter开源的用于前端开发的HTML、CSS和JS框架,它的主要目标是让开发人员快速…

    css 2023年6月10日
    00
  • CSS 网页布局中的图文列表实现代码

    下面我会详细讲解“CSS 网页布局中的图文列表实现代码”的完整攻略。 标题 图文列表的基本实现思路 通过CSS实现图文列表主要涉及两个方面的布局: 图片和文字的横向布局 多个图文列表的纵向布局 下面我将分别讲解这两个方面的实现方式和代码。 图片和文字的横向布局 首先让我们来看一下图片与文字横向布局的示例代码: /* 图片与文字的横向布局 */ .img-te…

    css 2023年6月10日
    00
  • vue 路由切换过渡动效滑入滑出效果的实例代码

    下面是关于vue路由切换过渡动效滑入滑出效果的示例代码及攻略,分别从以下两个方面进行说明: 在vue-router中配置过渡动效的方法 实现滑入滑出效果的代码示例 1. 在vue-router中配置过渡动效的方法 在vue-router中,可以通过<transition>标签嵌套页面组件,来为页面组件配置过渡动效。 具体配置方法如下: (1)在&…

    css 2023年6月10日
    00
  • asp中去除html中style,javascript,css代码

    针对ASP中去除HTML中style、javascript、css代码的问题,可以采用以下方式: 方法一:正则表达式 可以使用正则表达式去除HTML中的style、javascript、css代码,具体步骤如下: 1.导入正则表达式命名空间 using System.Text.RegularExpressions; 2.编写正则表达式 string patt…

    css 2023年6月9日
    00
  • JavaScript类型转换方法大全

    JavaScript类型转换是指将一个数据类型的值转换成另一种数据类型的值。在JavaScript中,类型转换是非常重要的,因为它能够帮助我们将不同的数据类型进行比较、运算和合并。 JavaScript中主要的类型转换有以下几种: 1. 字符串转换 可以通过toString()方法将一个非字符串类型的值转换为字符串类型。 let num = 42; let …

    Web开发基础 2023年3月30日
    00
合作推广
合作推广
分享本页
返回顶部