element-ui二次封装(下拉菜单el-dropdown)

2023-11-06

样式效果

效果1

在这里插入图片描述

效果2

在这里插入图片描述

效果1组件调用

<template>
  <div>
    <div v-for="item in tableArr" :key="item">
      <Dropdown
        :propObj="item" 
        @change="menuChange"
        :selectData="menuSelect.menuSelectData"
        :buttonIcon="menuSelect.buttonIcon"
      ></Dropdown>
    </div>

  </div>
</template>

<script>
import Dropdown from "@/components/selectMenu/index.vue"

export default {
  data () {
    return {
      tableArr: [],
      menuSelect: {
        menuSelectData: [
          { id: "Open", defaultIcon: require("@/views/Home/imgs/open.svg"), hoverIcon: require("@/views/Home/imgs/open_hover.svg") },
          { id: "Rename", defaultIcon: require("@/views/Home/imgs/Rename.png"), hoverIcon: require("@/views/Home/imgs/Rename_hover.svg") },
          { id: "copy", defaultIcon: require("@/views/Home/imgs/copy.png"), hoverIcon: require("@/views/Home/imgs/copy_hover.svg") },
          { id: "Export", defaultIcon: require("@/views/Home/imgs/Export.png"), hoverIcon: require("@/views/Home/imgs/Export_hover.svg") },
          { id: "Delete", defaultIcon: require("@/views/Home/imgs/Delete.png"), hoverIcon: require("@/views/Home/imgs/Delete_hover.svg") },
        ],
        buttonIcon: require('@/views/Home/imgs/btn.svg'),
      }
    }
  },
  methods: {
    // 菜单选择
    menuChange (item, row) {
      // item : 菜单按钮key  row:tableArr中的选中对象
      if (item === 'Open') {
        // 打开
        console.log(item);
      } else if (item === 'Rename') {
        this.openReName(row)
      } else if (item === 'copy') {
        // 复制
      } else if (item === 'Export') {
        // 导出
      } else if (item === 'Delete') {
        // 删除
        this.openDele(row)
      }
    },
  },
  components: {
    Dropdown
  }
}
</script>


效果2组件调用

<template>
  <div>
    <Dropdown
      @change="menuChange"
      :selectData="menuSelect.menuSelectData"
      :buttonIcon="menuSelect.buttonIcon"
      mouseLeaveHidden
      :buttonStyle="{width:'40px'}"
      :styleItem="{lineHeight:`48px`, marginBottom:`8px`}"
    >
      <template v-slot:header>
        <div class="setIcon">
          <img
            src="../../imgs/header.svg"
            alt=""
          >
          <div class="name">
            gongliming@xxxxxxxxxxxxxxxxxxxxxxxxx.cn
          </div>
        </div>
      </template>
    </Dropdown>

  </div>
</template>

<script>
import Dropdown from "@/components/selectMenu/index.vue"

export default {
  data () {
    return {
      loginStatus: false,
      menuSelect: {
        menuSelectData: [
          { id: "My Mindmap", defaultIcon: require("@/views/Home/imgs/headerIcon.png"), hoverIcon: require("@/views/Home/imgs/headerIcon.png") },
          { id: "Logout", defaultIcon: require("@/views/Home/imgs/log-out.svg"), hoverIcon: require("@/views/Home/imgs/log-out.svg") },
        ],
        buttonIcon: require('@/views/Home/imgs/header.svg'),
      },
    }
  },
  methods: {
    // 菜单选择
    menuChange (item) {
      // item : 菜单按钮key  row:当前选中对象
      if (item === 'Logout') {
        this.toLoginOut()
      }
    },
  },
  components: {
    Dropdown
  }
}
</script>

<style lang="less" scoped>
.setIcon {
  display: flex;
  align-items: center;
  justify-content: center;
  flex-direction: column;
  word-wrap: break-word;
  padding: 0 13px;
  box-sizing: border-box;
  .name {
    font-weight: 500;
    font-size: 14px;
    line-height: 17px;
    margin-top: 12px;
    margin-bottom: 20px;
    width: 251px;
    word-wrap: break-word;
    text-align: center;
    height: 30px;
  }
}
</style>


下拉菜单组件

传参props :

  1. propObj :数据类型(对象),如果作用再v-for中,可能需要获取传递过来的数据(非必须)
  2. selectData:数据类型(数组),格式为[{id,hoverIcon,defaultIcon}] (非必须)
  3. buttonIcon:数据类型(字符串),激活按钮图片url,或者使用插槽,v-slot:triggerButton(非必须)
  4. mouseLeaveHidden : 数据类型(布尔),是否需要移出下拉菜单后下拉菜单不会立即消息(非必须)
  5. buttonStyle:数据类型(对象),当传入buttonIcon后可控制激活按钮图片样式(非必须)
  6. styleItem:数据类型(对象),控制下拉菜单单个样式(非必须)

插槽slot:

  1. triggerButton:自定义激活按钮
  2. header:自定义下拉菜单头部样式

事件event:

  1. change :选中菜单执行, 参数:(选中id,传入的propObj ):参数2可选

组件代码:

<template>
  <div>
    <el-dropdown
      trigger="click"
      :ref="`dropdown_${propObj.id}`"
      @command="dropdownSelect($event, propObj)"
    >
      <!-- 激活按钮 -->
      <img
        v-if="buttonIcon"
        class="buttonImg"
        :style="{...buttonStyle}"
        :src="buttonIcon"
      >
      <slot
        v-else
        name="triggerButton"
      ></slot>

      <el-dropdown-menu
        slot="dropdown"
        :style="{...boxStyle}"
        @mouseenter.native="singleEnter(propObj)"
        @mouseleave.native="singleNativeLeave(propObj)"
      >
        <slot name="header"></slot>
        <el-dropdown-item
          :command="item.id"
          v-for="item in lists"
          :key="item.id"
          :style="{...styleItem}"
        >
          <div
            class="setDropdownSingle"
            @mouseleave="changImgByLeave(item)"
            @mouseenter="changImgByEnter(item)"
          > <img :src="item.status? item.hoverIcon:item.defaultIcon">
            <span>{{item.id}}</span>
          </div>
        </el-dropdown-item>
      </el-dropdown-menu>
    </el-dropdown>
  </div>
</template>

<script>
import _ from "lodash"
export default {
  data () {
    return {
      lists: [],
      timer:null
    }
  },
  props: {
    // 可能有v-for遍历需要存储当前的遍历值
    propObj: {
      type: Object,
      default: () => {
        return {
          id: 1
        }
      }
    },
    // 下拉选择菜单
    selectData: {
      type: Array,
      default: () => {
        return []
      }
    },
    // 按钮图片
    buttonIcon: {
      type: String,
      default: ''
    },
    // 移出modal是否需要隐藏下拉菜单
    mouseLeaveHidden: {
      type: Boolean,
      default: false
    },
    // 激活按钮样式
    buttonStyle: {
      type: Object,
      default: () => {
        return {}
      }
    },
    // 单行样式
    styleItem: {
      default: () => {
        return {}
      }
    },
    // 盒子样式
    boxStyle: {
      default: () => {
        return {}
      }
    }
  },

  methods: {
    dropdownSelect (item, row) {
      // item : 菜单按钮key  row:当前选中对象
      this.$emit('change', item, row)
    },
    singleEnter (row) {
      row.menuShow = true
      clearTimeout(this.timer)
    },
    singleLeave (row) {
      row.menuShow = false

    },
    singleNativeLeave (row) {
      if (this.mouseLeaveHidden) {
        this.timer = setTimeout(() => {
          row.menuShow = false
          this.$refs['dropdown_' + row.id].visible = false
        },300)

      }
    },
    changImgByEnter (row) {
      row.status = true
    },
    changImgByLeave (row) {
      row.status = false
    }

  },
  created () {

    this.lists = _.cloneDeep(this.$props.selectData) || []
    this.lists.forEach(item => {
      this.$set(item, 'status', false)
    })

  }
}
</script>

<style scoped lang="less">
.setDropdownSingle {
  display: flex;
  align-items: center;
  border-radius: 8px;
  padding: 0 8px;
  > img {
    margin-right: 12px;
  }
  &:hover {
    background-color: #5452f6;
    color: #fff;
  }
}
.buttonImg {
  cursor: pointer;
}
/deep/ .el-dropdown-menu__item:not(.is-disabled):hover {
  background-color: transparent;
  color: #606266;
}
/deep/ .el-tooltip__popper {
  max-width: 180px;
  max-height: 94px;
  overflow: hidden;
}
.el-dropdown-menu__item {
  padding: 0 10px;
}
</style>

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

element-ui二次封装(下拉菜单el-dropdown) 的相关文章

随机推荐

  • Linux服务器系统内存监控方法详解

    Linux服务器系统内存监控方法详解 内存是Linux内核所管理的最重要的资源之一 内存管理系统是操作系统中最为重要的部分 因为系统的物理内存总是少于系统所需要的内存数量 虚拟内存就是为了克服这个矛盾而采用的策略 系统的虚拟内存通过在各个进
  • js 实现php md5加密,js实现md5加密插件代码分享

    本文主要和大家分享js实现md5加密插件代码 希望能帮助到大家 使用方法 引入文件 var MD5 MD5 createMD5String yourSrting function globle factory 判断执行环境是否为浏览器 ty
  • RF 浏览器与浏览器驱动 浏览器与驱动

    历史版本的火狐 http ftp mozilla org pub firefox releases 火狐驱动 https github com mozilla geckodriver releases IE驱动 iedriverserver
  • 【深度学习】在学习pytorch时,一些不会的python语法总结(1)

    文章目录 一 builtin function or method object has no attribute size 二 获取张量的四个维度 torch里的size 函数 三 改变tensor形状的函数view 一 builtin
  • 并发编程JMM系列之重排序和顺序一致性

    前言 昨天我们接触到了什么是Java内存模型以及两种Java并发模型 并对JMM有了一些初步的认识和了解 我们在上节有提到JMM的重排序规则 但是讲的不详细 今天我们再重点聊下重排序这个东西 以及顺序一致性内存模型 OK 开始我们今天的并发
  • RP9-3 事件 情形

    事件 1 元件的鼠标事件10种 也包括两种触屏 单击和长按 单击 Click or Tap 双击 Double Click or Double Tap 右击 Context Meuu Right Click 按下 Mouse Button
  • 解决Windows 组件存储已损坏,0x80073712错误

    在 Windows 8 与 Windows Server 2012 当系统组件有损毁时 我们可以在不影响目前系统状况下来检查与修复系统组件 如下 当我添加功能组件时报如下错误 明显可以看出我的组件存储已损坏 那今天就让我告诉大家解决方案 我
  • 算法、数据结构可视化

    算法 数据结构可视化 一 总结 一句话总结 比如算法 数据结构 很多都有可视化 学习要知道用可视化更好的学习 1 可视化数据结构 http www cs usfca edu galles visualization Algorithms h
  • ffmpeg的使用

    目录 ffmpeg的下载 配置 下载 版本说明 环境变量配置 ffmpeg处理m3u8 ts的常用命令 ffmpeg是一个十分强大的音视频处理工具 提供转码 播放等基础功能 功能十分全面 强大 但命令繁多复杂 通常不直接使用 而是集成在带G
  • vue门户网站,滚动到可视化区域展示动画效果方案

    1 准备两个工具库 1 1 animate css 动画库 动画效果展示 Animate css A cross browser library of CSS animations 1 2 wowjs 负责滚动到可视化区域 展示animat
  • 各种正交以及正交和

    20200924 笛卡尔积里面选取交集为空或者交集等于恒值 自己定义其他条件 的 相乘之和 https www 59baike com a 365039 35 i 正交和 编程中 经常出现正交这个词 正交指相互独立 不可替代 并且组合起来可
  • openwrt上nginx扩展模块的支持

    在固件开发过程中 上层业务层需要用到nginx的一些扩展模块 比如ngx devel kit master set misc nginx module master nginx push stream module master ngx c
  • 幸运数的划分

    题目描述 判断一个正整数n是否能被一个 幸运数 整除 幸运数是指一个只包含4或7的正整数 如 7 47 477等都是幸运数 17 42则不是幸运数 输入 一行一个正整数n 1 n 1000 输出 一行一个字符串 如果能被幸运数整除输出 YE
  • ArgumentError: Python argument types in ****** did not match C++ signature:

    这种错误一般是由于数据类型错误 我是这样的 ArgumentError Traceback most recent call last tmp ipykernel 2665 3113553009 py in 26 27 filename c
  • 三极管的三种状态

    三极管的三种状态也叫三个工作区域 即 截止区 放大区和饱和区 1 截止区 三极管工作在截至状态 当发射结电压Ube小于0 6 0 7V的导通电压 发射结没有导通 集电结处于方向偏执 没有放大作用 2 放大区 三极管的发射极加正向电压 集电极
  • 斗图网斗图全站爬取(用正则表达式re)

    import re import requests import os class doutu spyder first url first name headers User Agent Mozilla 5 0 Windows NT 10
  • python安装pywin32出现DLL load failed的解决办法

    在安装pywin32最后一步时会提示DLL load failed 安装完成后import win32com client也会出现同样的问题 解决办法 把 Lib site packages pywin32 system32下的三个dll文
  • 如何用计算机发匿名短信,电脑如何给手机发信息_电脑匿名给手机发短信

    2017 01 09 08 24 27 腾讯应用宝 手机和电脑都安装好应用宝后 手机打开USB调试模式 电脑运行应用宝 无线连接手机后 就可以在电脑上发手机信息了 不过信息费扣的是你手机卡上的 无非就是借用电脑的键盘打字 2017 01 1
  • anaconda中如何安装tflearn?

    1 打开anaconda prompt 2 activate tensorflow 环境名 3 pip install tflearn 4 如何安装tflearn
  • element-ui二次封装(下拉菜单el-dropdown)

    样式效果 效果1 效果2 效果1组件调用