菜单 vue3 h函数创建组件

news/2024/5/17 10:29:08

目录

 index/.vue

<template><div class="menu_table"><divclass="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"> --><imgv-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.mrgr.cn/p/60515233

相关文章

Redis常用命令

1.String类型 MSET &#xff1a;批量添加多个String类型键值对 MGET&#xff1a;批量获取多个String类型键值对 127.0.0.1:6379> MSET k1 v1 k2 v2 k3 v3 OK 127.0.0.1:6379> MGET k1 k2 k3 1) "v1" 2) "v2" 3) "v3" 127.0.0.1:6379> …

nginx mirror代码分析

实现方式 mirror逻辑的工作阶段&#xff1a; ngx在log phase之后&#xff08;在ngx_http_free_request处调用&#xff09;已完成向client端返回response&#xff0c;在log phase之后完成close connection&#xff08;短链接&#xff09;&#xff0c;在该阶段处理mirror逻辑不…

C语言中的函数(超详细)

C语言中的函数&#xff08;超详细&#xff09; 一、函数概述二、C语言中函数的分类1.库函数2.自定义函数三、函数的参数1.实际参数&#xff08;实参&#xff09;2.形式参数&#xff08;形参&#xff09;四、函数的调用1.传值调用2.传址调用五、函数的嵌套调用和链式访问1.嵌套调…

二叉树(C语言)

文章目录 1.树1.1概念1.2相关定义1.3 表示&#xff08;左孩子右兄弟&#xff09; 2.二叉树2.1概念2.2特殊的二叉树1. 满二叉树&#xff1a;2. 完全二叉树&#xff1a; 2.3二叉树的性质2.4练习 3.二叉树的存储结构1. 顺序存储2. 链式存储 4.完全二叉树的代码实现4.1堆的介绍1.堆…

Android应用开发(23)获取亮灭屏状态

Android应用开发学习笔记——目录索引 在android 应用程序获取亮灭屏状态的常用方法有&#xff1a; 使用PowerManager提供的API函数注册Broadcast监听 一、使用PowerManager提供的API函数 frameworks/base/core/java/android/os/PowerManager.java import android.os.Buil…

ChatGPT与Claude对比分析

一 简介 1、ChatGPT: 访问地址&#xff1a;https://chat.openai.com/ 由OpenAI研发,2022年11月发布。基于 transformer 结构的大规模语言模型,包含1750亿参数。训练数据集主要是网页文本,聚焦于流畅的对话交互。对话风格友好,回复通顺灵活,富有创造性。存在一定的安全性问题,可…

全国大学生数据统计与分析竞赛2021年【本科组】-B题:用户消费行为价值分析

目录 摘 要 1 任务背景与重述 1.1 任务背景 1.2 任务重述 2 任务分析 3 数据假设 4 任务求解 4.1 任务一&#xff1a;数据预处理 4.1.1 数据清洗 4.1.2 数据集成 4.1.3 数据变换 4.2 任务二&#xff1a;对用户城市分布情况与分布情况可视化分析 4.2.1 城市分布情况可视化分析 4…

Day47 算法记录|动态规划14子序列

子序列 1143. 最长公共子序列1035.不相交的线53. 最大子数组和 1143. 最长公共子序列 这道题和718. 最长重复子数组的区别&#xff1a;这道题的子序列可以不连续 这个视频讲解的很好 class Solution {public int longestCommonSubsequence(String text1, String text2) {char…

蓝海卓越计费管理系统任意文件读取下载

……人哪&#xff0c;活着是这么的苦&#xff01;一旦你从幸福的彼岸被抛到苦难的此岸&#xff0c;你真是处处走头无路&#xff1b;而现在你才知道&#xff0c;在天堂与地狱之间原来也只有一步之遥&#xff01; 漏洞描述 蓝海卓越计费管理系统存在任意文件读取漏洞&#xff0…

【Spring Boot】单元测试

单元测试 单元测试在日常项目开发中必不可少&#xff0c;Spring Boot提供了完善的单元测试框架和工具用于测试开发的应用。接下来介绍Spring Boot为单元测试提供了哪些支持&#xff0c;以及如何在Spring Boot项目中进行单元测试。 1.Spring Boot集成单元测试 单元测试主要用…

C语言指针详解

C语言指针详解 字符指针1.如何定义2.类型和指向的内容3.代码例子 指针数组1.如何定义2.类型和内容 数组指针1.如何定义2.类型和指向类型3.数组名vs&数组名数组指针运用 数组参数&指针参数一维数组传参二维数组传参一级指针传参二级指针传参 函数指针1.如何定义2.类型和…

MySQL(一)基本架构、SQL语句操作、试图

MySQL系列文章 MySQL&#xff08;一&#xff09;基本架构、SQL语句操作、试图 MySQL&#xff08;二&#xff09;索引原理以及优化 MySQL&#xff08;三&#xff09;SQL优化、Buffer pool、Change buffer MySQL&#xff08;四&#xff09;事务原理及分析 MySQL&#xff08;五&a…

LangChain大型语言模型(LLM)应用开发(五):评估

LangChain是一个基于大语言模型&#xff08;如ChatGPT&#xff09;用于构建端到端语言模型应用的 Python 框架。它提供了一套工具、组件和接口&#xff0c;可简化创建由大型语言模型 (LLM) 和聊天模型提供支持的应用程序的过程。LangChain 可以轻松管理与语言模型的交互&#x…

NLP实验案例100个(1-5)

实验一 array数组&#xff08;01&#xff09; 一、实验目的及要求 1.安装numpy环境&#xff0c;掌握基本的数组知识以及操作。 二、实验设备&#xff08;环境&#xff09;及要求 开发环境&#xff1a;jupyter notebook 开发语言以及相关的库&#xff1a;python开发语言、nu…

【计算机视觉 | 目标检测 | 图像分割】arxiv 计算机视觉关于目标检测和图像分割的学术速递(7 月 17 日论文合集)

文章目录 一、检测相关(5篇)1.1 TALL: Thumbnail Layout for Deepfake Video Detection1.2 Cloud Detection in Multispectral Satellite Images Using Support Vector Machines With Quantum Kernels1.3 Multimodal Motion Conditioned Diffusion Model for Skeleton-based Vi…

iOS开发-NotificationServiceExtension实现实时音视频呼叫通知响铃与震动

iOS开发-NotificationServiceExtension实现实时音视频呼叫通知响铃与震动 在之前的开发中&#xff0c;遇到了实时音视频呼叫通知&#xff0c;当App未打开或者App在后台时候&#xff0c;需要通知到用户&#xff0c;用户点击通知栏后是否接入实时音视频的视频或者音频通话。 在…

计算机网络 day7 扫描IP脚本 - 路由器 - ping某网址的过程

目录 network 和 NetworkManager关系&#xff1a; 实验&#xff1a;编写一个扫描脚本&#xff0c;知道本局域网里哪些ip在使用&#xff0c;哪些没有使用&#xff1f; 使用的ip对应的mac地址都要显示出来 计算机程序执行的两种不同方式&#xff1a; shell语言编写扫描脚本 …

如何维护你的电脑:提升性能和延长使用寿命

如何维护你的电脑&#xff1a;提升性能和延长使用寿命 &#x1f607;博主简介&#xff1a;我是一名正在攻读研究生学位的人工智能专业学生&#xff0c;我可以为计算机、人工智能相关本科生和研究生提供排忧解惑的服务。如果您有任何问题或困惑&#xff0c;欢迎随时来交流哦&…

在自定义数据集上微调Alpaca和LLaMA

本文将介绍使用LoRa在本地机器上微调Alpaca和LLaMA&#xff0c;我们将介绍在特定数据集上对Alpaca LoRa进行微调的整个过程&#xff0c;本文将涵盖数据处理、模型训练和使用流行的自然语言处理库(如Transformers和hugs Face)进行评估。此外还将介绍如何使用grado应用程序部署和…

高算力AI模组前沿应用:基于ARM架构的SoC阵列式服务器

本期我们带来高算力AI模组前沿应用&#xff0c;基于ARM架构的SoC阵列式服务器相关内容。澎湃算力、创新架构、异构计算&#xff0c;有望成为未来信息化社会的智能算力底座。 ▌性能优势AI驱动&#xff0c;ARM架构服务器加速渗透 一直以来&#xff0c;基于ARM架构的各类处理器…