菜单 vue3 h函数创建组件

news2024/11/16 21:48:17

目录

 index/.vue

<template>
  <div class="menu_table">
    <div
      class="table_row"
      v-for="(item, index) in menuList"
      @click="item.disabled !== true && itemClick(item)"
    >
      <!-- :style="{
             'border-top':item.line ===true?'solid 1px rgb(44, 44, 44)':'none'
        }" -->
      <div class="item_line" v-if="item.line === true"></div>
      <div
        :class="{
          item_disabled: item.disabled === true,
          item_denydisabled: item.disabled === false,
        }"
      >
        <!-- {{item.icon.value}} -->
        <!-- &nbsp&nbsp -->

        <div class="item_label"></div>
        <!-- <div class="icon_border"> -->
        <img
          v-if="item.icon && item.icon.show === true && item.icon.type === 'img'"
          :src="item.icon.value"
        />
        <div class="no_icon" v-if="item.icon === undefined" />
        <!-- </div> -->

        <div class="icon_blank"></div>
        <div class="icon_label" id="menu_item">{{ item.label }}</div>
      </div>
    </div>
  </div>
</template>

<script>
import { removeMenu } from "./menu";
export default {
  data() {
    return {
      clientX: "0px",
      clientY: "0px",
    };
  },
  mounted() {
    this.init(this.locat.clientX, this.locat.clientY);
    window.onmousedown = (event) => {
      // event.button===2||

      if (event.button === 0) {
        if (event.target.id === "menu_item") {
          window.onmousedown = null;
        } else {
          removeMenu();
        }
      } else if (event.button === 2) {
        if ($store().state.window.isContext) {
          this.init(event.clientX, event.clientY);
          $store().state.window.isContext = false;
        }

        // this.clientX = event.clientX + "px";
        // this.clientY = event.clientY + "px";
      }
    };
  },
  props: {
    locat: {
      type: Object,
      default() {
        return {};
      },
    },
    params: {
      type: Object,
      default() {
        return {};
      },
    },
    menuList: {
      type: Array,
      default() {
        return [];
      },
    },
  },
  methods: {
    itemClick(item) {
      console.log(item);
      item.fn();

      removeMenu();
    },

    init(clientX, clientY) {
      const width = document.body.clientWidth;
      const height = document.body.clientHeight;
      const boxHeight = this.menuList.length * 25;
      const boxWidth = 130;
      if (clientY + boxHeight > height) {
        if (clientY - boxHeight > 0) {
          this.clientY = clientY - boxHeight + "px";
        } else {
          this.clientY = clientY - boxHeight / 2 + "px";
        }
      } else {
        this.clientY = clientY + "px";
      }
      if (clientX + boxWidth > width) {
        if (clientX - boxWidth > 0) {
          this.clientX = clientX - boxWidth + "px";
        } else {
          this.clientX = clientX - boxWidth / 2 + "px";
        }
      } else {
        this.clientX = clientX + "px";
      }
    },
  },
  unmounted() {
    window.onmousedown = null;
  },
};
</script>

<style scoped>
.table_row {
  /* border: solid 1px rgb(44, 44, 44); */
  width: 130px;
  height: 25px;
  background: white;
  line-height: 25px;
}
/* :hover {
  background: #4791db;
  color: white;
} */

.item_denydisabled:hover > .icon_label {
  background: #4791db;
  color: white;
}
.item_denydisabled:hover > .icon_border {
  /* border: ridge 1px #4791db;
  box-shadow: 0px 0px 5px 2px rgb(0 0 0 / 8%); */
}
.menu_table {
  position: absolute;
  top: v-bind(clientY);
  left: v-bind(clientX);
  z-index: 9999999;
  overflow: hidden;
  /* border: solid 1px #d7d7d7; */
  border-radius: 5px;
  box-shadow: 0px 0px 5px 2px rgb(0 0 0 / 8%);
}
.item_disabled {
  color: #bbcccc;
  width: 100%;
  height: 100%;
}
.item_denydisabled {
  /* text-align: left; */
  /* color: red; */
  width: 100%;
  height: 100%;
}
.item_label {
  height: 1px;
  display: inline-block;
  width: 9px;
  vertical-align: bottom;
}
.item_line {
  height: 1px;
  width: 100px;
  /* position:absolute;
  top:0; */
  /* margin-top:-1px; */
  margin-left: 15px;
  display: block;
  background-color: #e4e7ed;

  /* box-shadow: 0px 0px 10px #b9b9b9; */
}
img,
.no_icon {
  width: 14px;
  height: 14px;
  display: inline-block;
  vertical-align: middle;
  /* margin-top: -5px;
  margin-left: 3px; */
}
.icon_border {
  width: 17px;
  height: 17px;
  display: inline-block;
  /* border: groove  1px #4791db; */
  vertical-align: middle;
}
.icon_blank {
  height: 100%;
  display: inline-block;
  width: 5px;
  vertical-align: bottom;
}
.icon_label {
  height: 100%;
  display: inline-block;
  width: 95px;
  vertical-align: middle;
}
</style>

menu.js

import { createVNode, render } from "vue";
import menuElement from "./index.vue";

//      定义一个div容器
const div = document.createElement("div");
document.body.appendChild(div);
export default {
  addMenu(locat, menuList, params) {
    const vnode = createVNode(menuElement, { locat, menuList, params });
    //      调用渲染方法:将虚拟节点渲染到dom中
    render(vnode, div);
  },
};
export const removeMenu = function () {
  render(null, div);
};

menuData.js

export default {
    viewArr :  [
        {
          label: "左对齐",
          tips: "Stop",
          disabled: value >= 2 ? false : true,
          icon: {
            show: true,
            type: "img",
            value:
              value >= 2
                ? "statics/icons/proicons/alignLeft_active.svg"
                : "statics/icons/proicons/alignLeft.svg",
          },
          line: false,
          fn: (row) => {
            this.alignLeft();
          },
        },
        {
          label: "水平居中对齐",
          tips: "Add",
          disabled: value >= 2 ? false : true,
          icon: {
            show: true,
            type: "img",
            value:
              value >= 2
                ? "statics/icons/proicons/alignHorizontalCenter_active.svg"
                : "statics/icons/proicons/alignHorizontalCenter.svg",
          },
          line: false,
          fn: (row) => {
            this.horizontalCenter();
          },
        },
        {
          label: "右对齐",
          disabled: value >= 2 ? false : true,
          icon: {
            show: true,
            type: "img",
            value:
              value >= 2
                ? "statics/icons/proicons/alignRight_active.svg"
                : "statics/icons/proicons/alignRight.svg",
          },
          tips: "Edit",
          line: false,
          fn: (row) => {
            this.alignRight();
          },
        },
        {
          label: "上对齐",
          tips: "Delete",
          disabled: value >= 2 ? false : true,
          icon: {
            show: true,
            type: "img",
            value:
              value >= 2
                ? "statics/icons/proicons/alignTop_active.svg"
                : "statics/icons/proicons/alignTop.svg",
          },
          line: false,
          fn: (row) => {
            this.alignTop();
          },
        },
        {
          label: "垂直居中对齐",
          tips: "Stop",
          disabled: value >= 2 ? false : true,
          icon: {
            show: true,
            type: "img",
            value:
              value >= 2
                ? "statics/icons/proicons/alignVerticalCenter_active.svg"
                : "statics/icons/proicons/alignVerticalCenter.svg",
          },
          line: false,
          fn: (row) => {
            this.verticalCenter();
          },
        },
        {
          label: "下对齐",
          tips: "Add",
          disabled: value >= 2 ? false : true,
          icon: {
            show: true,
            type: "img",
            value:
              value >= 2
                ? "statics/icons/proicons/alignBottom_active.svg"
                : "statics/icons/proicons/alignBottom.svg",
          },
          line: false,
          fn: (row) => {
            this.alignBottom();
          },
        },
        {
          label: "中心对齐",
          disabled: value >= 2 ? false : true,
          icon: {
            show: true,
            type: "img",
            value:
              value >= 2
                ? "statics/icons/proicons/centerAlignment_active.svg"
                : "statics/icons/proicons/centerAlignment.svg",
          },
          tips: "Edit",
          line: false,
          fn: (row) => {
            this.controlCenter();
          },
        },

        {
          label: "垂直等间距",
          tips: "Stop",
          disabled: value >= 3 ? false : true,
          icon: {
            show: true,
            type: "img",
            value:
              value >= 3
                ? "statics/icons/proicons/verticalEqualSpacing_active.svg"
                : "statics/icons/proicons/verticalEqualSpacing.svg",
          },
          line: true,
          fn: (row) => {
            this.verticallyEquallySpaced();
          },
        },
        {
          label: "水平等间距",
          tips: "Add",
          disabled: value >= 3 ? false : true,
          icon: {
            show: true,
            type: "img",
            value:
              value >= 3
                ? "statics/icons/proicons/horizontalEqualSpacing_active.svg"
                : "statics/icons/proicons/horizontalEqualSpacing.svg",
          },
          line: false,
          fn: (row) => {
            this.horizontallEquidistant();
          },
        },
        {
          label: "垂直无间距",
          disabled: value >= 2 ? false : true,
          icon: {
            show: true,
            type: "img",
            value:
              value >= 2
                ? "statics/icons/proicons/verticalNoSpace_active.svg"
                : "statics/icons/proicons/verticalNoSpace.svg",
          },
          tips: "Edit",
          line: false,
          fn: (row) => {
            this.nohorizontallEquidistant();
          },
        },
        {
          label: "水平无间距",
          tips: "Delete",
          disabled: value >= 2 ? false : true,
          icon: {
            show: true,
            type: "img",
            value:
              value >= 2
                ? "statics/icons/proicons/horizontalNoSpace_active.svg"
                : "statics/icons/proicons/horizontalNoSpace.svg",
          },
          line: false,
          fn: (row) => {
            this.noverticallyEquallySpaced();
          },
        },
        {
          label: "等宽",
          tips: "Add",
          disabled: value >= 2 ? false : true,
          icon: {
            show: true,
            type: "img",
            value:
              value >= 2
                ? "statics/icons/proicons/sameWidth_active.svg"
                : "statics/icons/proicons/sameWidth.svg",
          },
          line: true,
          fn: (row) => {
            this.sameHeight();
          },
        },
        {
          label: "等高",
          disabled: value >= 2 ? false : true,
          icon: {
            show: true,
            type: "img",
            value:
              value >= 2
                ? "statics/icons/proicons/sameHeight_active.svg"
                : "statics/icons/proicons/sameHeight.svg",
          },
          tips: "Edit",
          line: false,
          fn: (row) => {
            this.sameWidth();
          },
        },
        {
          label: "等大小",
          tips: "Delete",
          disabled: value >= 2 ? false : true,
          icon: {
            show: true,
            type: "img",
            value:
              value >= 2
                ? "statics/icons/proicons/sameSize_active.svg"
                : "statics/icons/proicons/sameSize.svg",
          },
          line: false,
          fn: (row) => {
            this.sameSize();
          },
        },
        {
          label: "上移一层",
          tips: "Stop",
          disabled: value >= 1 ? false : true,
          icon: {
            show: true,
            type: "img",
            value:
              value >= 1
                ? "statics/icons/proicons/bringForward_active.svg"
                : "statics/icons/proicons/bringForward.svg",
          },
          line: true,
          fn: (row) => {
            this.putOnTop();
          },
        },
        {
          label: "下移一层",
          tips: "Add",
          disabled: value >= 1 ? false : true,
          icon: {
            show: true,
            type: "img",
            value:
              value >= 1
                ? "statics/icons/proicons/bringBackward_active.svg"
                : "statics/icons/proicons/bringBackward.svg",
          },
          line: false,
          fn: (row) => {
            this.putOnBottom();
          },
        },
        {
          label: "移到最上层",
          disabled: value === 1 ? false : true,
          icon: {
            show: true,
            type: "img",
            value:
              value === 1
                ? "statics/icons/proicons/bringToTop_active.svg"
                : "statics/icons/proicons/bringToTop.svg",
          },
          tips: "Edit",
          line: false,
          fn: (row) => {
            this.moveUpOneLevel();
          },
        },
        {
          label: "移到最下层",
          tips: "Delete",
          disabled: value === 1 ? false : true,
          icon: {
            show: true,
            type: "img",
            value:
              value === 1
                ? "statics/icons/proicons/bringToBack_active.svg"
                : "statics/icons/proicons/bringToBack.svg",
          },
          line: false,
          fn: (row) => {
            this.moveDownOneLevel();
          },
        },
        {
          label: "编辑",
          disabled: spValue ? false : true,
          icon: {
            show: true,
            type: "img",
            value: spValue
              ? "statics/icons/proicons/edit_active.svg"
              : "statics/icons/proicons/edit.svg",
          },
          tips: "Edit",
          line: true,
          fn: (row) => {
            this.changeNone();
          },
        },
        {
          label: "打组",
          disabled: value >= 2 ? false : true,
          icon: {
            show: true,
            type: "img",
            value:
              value >= 2
                ? "statics/icons/proicons/group_active.svg"
                : "statics/icons/proicons/group.svg",
          },
          tips: "Edit",
          line: false,
          fn: (row) => {
            this.packGroup();
          },
        },
        {
          label: "解组",
          tips: "Delete",
          disabled: spValue ? false : true,
          icon: {
            show: true,
            type: "img",
            value: spValue
              ? "statics/icons/proicons/ungroup_active.svg"
              : "statics/icons/proicons/ungroup.svg",
          },
          line: false,
          fn: (row) => {
            this.unpackGroup();
          },
        },
      ]
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/814671.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

一文了解DMX512透明屏的工作原理

DMX512透明屏是一种新型的显示屏技术&#xff0c;它采用了DMX512控制协议&#xff0c;可以实现透明显示效果。 DMX512是一种数字控制协议&#xff0c;常用于舞台灯光和音响设备的控制&#xff0c;通过DMX512控制器可以实现对透明屏的亮度、颜色、动画等参数的调节。 DMX512透明…

泛微最新漏洞汇总

泛微 e-cology 前台SQL注入漏洞 app.name"泛微 e-cology 9.0 OA" 验证poc: POST /weaver/weaver.file.FileDownloadForOutDoc HTTP/1.1 Host: {{Hostname}} Accept: */* Accept-Encoding: gzip, deflate Accept-Language: zh-CN,zh;q0.9 Connection: close …

探索前端图片如何携带token进行验证

前言 图片在前端开发中扮演了重要的角色&#xff0c;它们不仅仅是美观的元素&#xff0c;还可以传递信息和激发用户的兴趣。随着应用场景的增多&#xff0c;前端开发人员就需要在图片加载过程中携带验证的信息。如 token&#xff0c;用于身份验证、权限控制等方面。通过在图片的…

揭示C语言中CPU对register变量分配的决策过程

揭示C语言中CPU对register变量分配的决策过程 博主简介一、引言1.1、register变量的定义和用途1.2、CPU对register变量分配的重要性 二、CPU寄存器分配的概述2.1、CPU寄存器的作用和程序执行过程中的角色2.2、不同类型的CPU寄存器&#xff08;通用寄存器、特殊寄存器等&#xf…

redis基础总结(数据类型)

Redis十大数据类型 String String 是redis最基本数据类型,一个key对应一个value. String类型是二进制安全的,意思是Redis的string类型可以包含任何数据,比如jpg图片或者序列化的对象; String类型是最基本的数据类型,一个redis中字符串value最多是512M; String类型在redis底层…

【已解决】span的宽度与高度如何设置

本博文源于笔者基础不扎实的情况下遇到的一个问题&#xff0c;问题是我有三个span&#xff0c;想让它们宽度与高度再大点&#xff0c;结果发现怎样设置都设置不了。最后不经意间解决问题 文章目录 1、问题再现2、解决方案3、解决效果 1、问题再现 <span>1</span>…

邪恶版ChatGPT来了!

「邪恶版」ChatGPT 出现&#xff1a;每月 60 欧元&#xff0c;毫无道德限制&#xff0c;专为“网络罪犯”而生。 WormGPT 并不是一个人工智能聊天机器人&#xff0c;它的开发目的不是为了有趣地提供无脊椎动物的人工智能帮助&#xff0c;就像专注于猫科动物的CatGPT一样。相反&…

一份热乎乎的字节面试真题

一份热乎乎的字节面试真题 说说Redis为什么快 基于内存存储实现 内存读写是比在磁盘快很多的&#xff0c;Redis基于内存存储实现的数据库&#xff0c;相对于数据存在磁盘的MySQL数据库&#xff0c;省去磁盘I/O的消耗。 高效的数据结构 Mysql索引为了提高效率&#xff0c;选…

【unity】Pico VR 开发笔记(基础篇)

Pico VR 开发笔记(基础篇) XR Interaction Tooikit 版本 2.3.2 一、环境搭建 其实官方文档已经写的很详细了&#xff0c;这里只是不废话快速搭建&#xff0c;另外有一项官方说明有误的&#xff0c;补充说明一下&#xff0c;在开发工具部分说明 插件安装——安装pico的sdk和XR…

为什么定时器,串口这些东西被称之为外设

前言 &#xff08;1&#xff09;我们常常说定时器&#xff0c;串口是外设&#xff0c;但是很多人肯定有疑惑。定时器&#xff0c;串口不明明是存储在芯片里面的吗&#xff1f; &#xff08;2&#xff09;为了弄明白这个&#xff0c;就需要追溯到上个世纪了。 上个世纪的CPU与串…

【玩转Python系列【小白必看】Python多线程爬虫:下载表情包网站的图片

文章目录 前言1. 导入模块和库2. 定义函数 download_image(url, filepath)3. 定义函数 get_page()4. 主程序入口 完整代码运行效果 结束语 前言 本文主要介绍了使用Python编写的多线程爬虫程序&#xff0c;用于下载表情包网站上的图片。通过解析网页内容和使用XPath定位&#x…

Spring优雅的在事务提交/回滚前后插入业务逻辑

业务背景 业务那边想要统计下我们这边每天注册商户成功和失败的数量&#xff0c;你看看怎么给他弄下这个功能 功能实现 TransactionSynchronizationManager.registerSynchronization&#xff0c;发现这是spring事务提供的注册回调接口的方法。 在事务注解方法中&#xff0c…

Java 版 spring cloud + spring boot 工程系统管理 工程项目管理系统源码 工程项目各模块及其功能点清单

工程项目各模块及其功能点清单 一、系统管理 1、数据字典&#xff1a;实现对数据字典标签的增删改查操作 2、编码管理&#xff1a;实现对系统编码的增删改查操作 3、用户管理&#xff1a;管理和查看用户角色 4、菜单管理&#xff1a;实现对系统菜单的增删改查操…

python中有哪些比较运算符

目录 python中有哪些比较运算符 使用比较运算符需要注意什么 总结 python中有哪些比较运算符 在Python中&#xff0c;有以下比较运算符可以用于比较两个值之间的关系&#xff1a; 1. 等于 ()&#xff1a;检查两个值是否相等。 x y 2. 不等于 (!)&#xff1a;检查两个…

2024考研408-计算机网络 第一章-计算机网络体系结构学习笔记

文章目录 前言一、计算机网络概述1.1、概念及功能1.1.1、计算机网络的概念1.1.2、计算机网络的功能功能1、数据通信功能2、资源共享功能3、分布式处理功能4、提高可靠性&#xff08;分布式处理引申功能&#xff09;功能5、负载均衡&#xff08;也是分布式处理引申功能&#xff…

23 张图详解路由协议

路由的概念 在 TCP/IP 通信中&#xff0c;网络层的作用是实现终端的点对点通信。IP 协议通过 IP 地址将数据包发送给目的主机&#xff0c;能够让互联网上任何两台主机进行通信。IP 地址可以识别主机和路由器&#xff0c;路由器可以把全世界的网络连接起来。 什么是路由器 路由…

使用Flutter的image_picker插件实现设备的相册的访问和拍照

文章目录 需求描述Flutter插件image_picker的介绍使用步骤1、添加依赖2、导入 例子完整的代码效果 总结 需求描述 在应用开发时&#xff0c;我们有很多场景要使用到更换图片的功能&#xff0c;即将原本的图像替换设置成其他的图像&#xff0c;从设备的相册或相机中选择图片或拍…

【LeetCode 75】第十五题(1456)定长子串中元音的最大数目

目录 题目&#xff1a; 示例&#xff1a; 分析&#xff1a; 代码运行结果&#xff1a; 题目&#xff1a; 示例&#xff1a; 分析&#xff1a; 就难度而言&#xff0c;我觉得算不上中等&#xff0c;因为和上一题基本一致&#xff0c;只不过上一题是求最大平均数&#xff0c…

基于Django美食分享交流网站-计算机毕设 附源码10913

美食分享交流网站 摘 要 大数据时代下&#xff0c;数据呈爆炸式地增长。为了迎合信息化时代的潮流和信息化安全的要求&#xff0c;利用互联网服务于其他行业&#xff0c;促进生产&#xff0c;已经是成为一种势不可挡的趋势。在美食分享的要求下&#xff0c;开发一款整体式结构的…

为什么计算机对浮点型数字计算存在误差

我们输入的十进制小数在计算机中都是以二进制进行存储。比如&#xff1a; 我们把0.25转换为二进制 0.25 * 2 0.5 取0 0.50 * 2 1.0 取1 所以十进制0.25的二进制应当为0.01但是我们把0.3转换为二进制存储 0.3 * 2 0.6 取0 0.6 * 2 1.2 取1 0.2 * 2 0.4 取0 0.4 * …