当前位置: 首页 > article >正文

vue2拖拉拽做个模拟公式工具

1. 成图

在这里插入图片描述

2. 介绍

就是简单拖拉拽来做个规则运算器,具体运算规则、校验规则自己加。

3. 代码

HTML代码

<template><div class="red-cont"><div class="red-top"><divclass="red-top-left"><div class="red-showarea"><div class="red-showarea-title">公式展示</div><div class="red-showarea-list"><spanv-for="(item, index) in valueList":key="index">{{ item.label }}</span></div></div><div class="red-ctrlarea  user-no-select"><div class="red-ctrlarea-title">公式编辑</div><divclass="red-ctrlarea-list"@drop="handleDrop"@dragleave="handleDragLeave($event)"@dragover.stop.prevent="handleDragOver($event)"><div v-if="valueList.length === 0" class="red-ctrlarea-hint">请拖曳字段、数字或操作符到编辑区域</div><divv-for="(item, index) in valueList":key="item.id":class="['red-ctrl-item',index === draggingOverIndex - 1 ? 'red-ctrl-inject-before' : '',index === draggingOverIndex ? 'red-ctrl-inject-after' : '']"@drop.stop.prevent="handleDrop"@dragover.stop.prevent="handleDragOver($event, index)"><divclass="red-ctrl-item-cont"draggable="true"@dragstart="handleDragStart($event, item, item.type)"><div :alt="item.label">{{ item.label }}</div><iclass="el-icon-circle-close red-ctrl-item-close"@click="removeValueItem(item, index)"/></div></div></div></div></div><div class="red-top-right user-no-select"><div class="red-paramtype"><el-select v-model="paramType"><el-optionv-for="item in paramTypeOptions":key="item.value":label="item.label":disabled="item.disabled":value="item.value"/></el-select></div><div class="red-paramoptions"><divv-for="(item, index) in paramOptions":key="index"class="red-paramoptions-item"draggable="true"@dragstart="handleDragStart($event, item, paramType)">{{ item.label }}</div></div></div></div><div class="red-bottom user-no-select"><div class="red-bottom-left"><divv-for="(item, index) in sourceList":key="index"class="red-source-item"draggable="true"@dragstart="handleDragStart($event, item, 'ctrl')">{{ item.label }}</div></div><divclass="red-clear"@click="clearValueList"><br></div></div></div>
</template>

VUE2的代码

export default {components: {},props: {},data() {return {paramType: 'field',paramTypeOptions: [{ value: 'field', label: '字段' },{ value: 'attribute', label: '机组属性', disabled: true }],paramOptions: [{ value: Math.random(), label: '字段1' },{ value: Math.random(), label: '字段2' },{ value: Math.random(), label: '字段3' },{ value: Math.random(), label: '字段4' },{ value: Math.random(), label: '字段5' }],valueList: [],sourceList: [{ label: '1', value: '1' },{ label: '2', value: '2' },{ label: '3', value: '3' },{ label: '4', value: '4' },{ label: '5', value: '5' },{ label: '6', value: '6' },{ label: '7', value: '7' },{ label: '8', value: '8' },{ label: '9', value: '9' },{ label: '0', value: '0' },{ label: '00', value: '00' },{ label: '(', value: '(' },{ label: ')', value: ')' },{ label: '.', value: '.' },{ label: '+', value: '+' },{ label: '-', value: '-' },{ label: '*', value: '*' },{ label: '/', value: '/' },{ label: '>', value: '>' },{ label: '<', value: '<' },{ label: '==', value: '==' },{ label: '>=', value: '>=' },{ label: '<=', value: '<=' },{ label: '!', value: '!' },{ label: '||', value: '||' },{ label: '&&', value: '&&' }],draggingIndex: null,draggingOverIndex: null};},created() {},methods: {clearValueList() {this.valueList.splice(0, this.valueList.length);},handleDragLeave(e) {console.log('tree drag leave: ', e);this.draggingOverIndex = null;},handleDrop(e) {const data = JSON.parse(e.dataTransfer.getData('text/plain'));const { valueList, draggingOverIndex } = this;const item = Object.assign({}, data, {id: Math.random().toString(36).substr(2, 9)});if (typeof draggingOverIndex === 'number') {valueList.splice(draggingOverIndex, 0, item);const dataIndex = valueList.findIndex(item => item.id === data.id);if (dataIndex !== -1) {valueList.splice(dataIndex, 1);} else {//}} else {const dataIndex = valueList.findIndex(item => item.id === data.id);if (dataIndex !== -1) {valueList.splice(dataIndex, 1);} else {//}valueList.push(item);}this.draggingOverIndex = null;},handleDragOver(e, targetIndex) {console.log('handleDragOver', e, targetIndex);this.draggingOverIndex = targetIndex;},handleDragStart(e, item, type) {e.dataTransfer.setData('text/plain', JSON.stringify(Object.assign({type: type}, item)));},removeValueItem(item, index) {this.valueList.splice(index, 1);}}
};

less/scss代码

.red-cont{display: flex;height: 100%;overflow: hidden;flex-direction: column;
}
.red-top{flex: 1;overflow: hidden;display: flex;align-items: stretch;justify-content: space-between;
}
.red-top-left{flex: 1;overflow: hidden;
}
.red-showarea{display: flex;flex-direction: column;height: 35%;
}
.red-showarea-title{flex-shrink: 0;
}
.red-showarea-list{flex: 1;overflow: auto;padding: 10px;
}
.red-ctrlarea{display: flex;flex-direction: column;height: 65%;
}
.red-ctrlarea-title{flex-shrink: 0;
}
.red-ctrlarea-hint{padding: 10px;color: #ccc;
}
.red-ctrlarea-list{flex: 1;overflow-x: hidden;overflow-y: auto;border: 1px dashed #ccc;display: flex;flex-wrap: wrap;align-content: flex-start;
}
.red-ctrl-item{padding-left: 10px;padding-top: 10px;max-width: 200px;
}
.red-ctrl-inject-before{&>.red-ctrl-item-cont{border-right: 1px dashed #ccc;}
}
.red-ctrl-inject-after{&>.red-ctrl-item-cont{border-left: 1px dashed #ccc;}
}
.red-ctrl-item-cont{padding: 5px;position: relative;cursor: grab;border: 1px solid transparent;&>div{overflow: hidden;text-overflow: ellipsis;white-space: nowrap;}
}
.red-ctrl-item-close{position: absolute;top: -5px;right: -5px;cursor: pointer;
}
.red-paramtype{flex-shrink: 0;padding: 10px;.el-select{width: 100%;}
}
.red-paramoptions{flex: 1;padding: 10px;overflow: auto;
}
.red-paramoptions-item{padding: 5px;cursor: grab;&:hover{background-color: #ccc;}
}
.red-bottom{flex-shrink: 0;height: 200px;display: flex;align-items: center;}
.red-bottom-left{flex: 1;display: flex;flex-wrap: wrap;padding: 1px;
}
.red-clear{padding: 10px;border: 1px solid #fff;cursor: grab;
}
.red-source-item{width: 50px;height: 50px;line-height: 50px;text-align: center;margin: 5px;background-color: #ccc;cursor: grab;
}

相关文章:

vue2拖拉拽做个模拟公式工具

1. 成图 2. 介绍 就是简单拖拉拽来做个规则运算器&#xff0c;具体运算规则、校验规则自己加。 3. 代码 HTML代码 <template><div class"red-cont"><div class"red-top"><divclass"red-top-left"><div class&quo…...

两点与圆(异或神通)

给出 n 个圆&#xff0c;保证任意两个圆都不相交且不相切。 然后给出两个点 (x1​,y1​),(x2​,y2​)&#xff0c;保证均不在某个圆上。现在要从 (x1​,y1​)→(x2​,y2​) 画条曲线&#xff0c;问这条曲线最少穿过多少次圆的边界&#xff1f; 输入格式 第一行为一个整数 n&…...

Windows查重工具,强烈推荐大家收藏!

我大家在用电脑的时候&#xff0c;是不是发现用得越久&#xff0c;电脑里的软件和文件就越多&#xff1f; 今天我给大家带来的这两款重复文件查找神器&#xff0c;简直就是电脑里的“清洁小能手”&#xff0c;能帮你把那些重复的文件和文件夹找出来。 Easy DupLicate Finder 重…...

使用Python快速接入DeepSeek API的步骤指南

使用Python快速接入DeepSeek API的步骤指南 1. 前期准备 注册DeepSeek账号 访问DeepSeek官网注册账号 完成邮箱验证等认证流程 获取API密钥 登录后进入控制台 → API管理 创建新的API Key并妥善保存 安装必要库 pip install requests # 可选&#xff1a;处理复杂场景 pip…...

使用python完成手写数字识别

入门图像识别的第一个案例,看到好多小伙伴分享,也把自己当初的思路捋捋,写成一篇博客,作为记录和分享,也欢迎各位交流讨论。 实现思路 数据集:MNIST(包含60,000个训练样本和10,000个测试样本) 深度学习框架:Keras(基于TensorFlow) 模型架构:卷积神经网络(CNN) 实…...

OpenLayers:如何控制Overlay的层级?

我最近在使用Overlay的时候遇到了一个问题&#xff0c;我向地图中添加了两种不同的Overlay&#xff08;下图中的蓝色标牌和粉色标牌&#xff09;&#xff0c;我希望粉色标牌可以显示在最上层&#xff0c;可偏偏蓝色标牌却将其遮挡住了。于是我对Overlay的层级开始起了兴趣&…...

清晰易懂的 Flutter 卸载和清理教程

以下是为 Flutter 彻底卸载与清理教程&#xff0c;覆盖 Windows、macOS、Linux 系统&#xff0c;步骤清晰无残留&#xff0c;确保完全删除 Flutter SDK、依赖工具及 IDE 配置。 一、通用步骤&#xff1a;确认 Flutter 安装方式 Flutter 通常通过以下方式安装&#xff1a; 手动…...

docker-compose部署以及常用命令

一&#xff1a;常用命令 1.docker compose restart//重启 2.docker compose down// 停止 3.docker compose ps//列出 4.sudo docker-compose up -d 启动并且在后台运行 二:yaml配置文件 version: 3.5 services:etcd:container_name: milvus-etcdimage: quay.io/coreos/etcd:…...

《Golang高性能网络编程:构建低延迟服务器应用》

在本文中&#xff0c;我们将深入探讨Golang高性能网络编程&#xff0c;帮助您构建低延迟服务器应用。我们将介绍Golang的网络编程特性、优化技巧和实际案例&#xff0c;让您更好地理解和应用Golang在网络编程领域的优势。 高性能网络编程简介 什么是Golang高性能网络编程 高性能…...

非对称加密技术深度解析:从数学基础到工程实践

一、密码学范式革命&#xff1a;从对称到非对称 1.1 对称加密的局限性 传统对称加密算法&#xff08;如AES、DES&#xff09;采用共享密钥机制&#xff0c;加解密使用相同密钥。虽然计算效率优异&#xff08;AES-256加密速度可达800MB/s&#xff09;&#xff0c;但在密钥分发环…...

Ubuntu 22.04/24.04 配置apt 源

前言 在 Ubuntu 系统部署与运维中&#xff0c;​APT 源配置是保障软件安装效率与系统稳定性的核心环节。然而&#xff0c;随着 Ubuntu 24.04 LTS&#xff08;Noble&#xff09;的发布&#xff0c;其 APT 源配置格式与 22.04 LTS&#xff08;Jammy&#xff09;存在显著差异。 …...

数据结构C语言练习(设计循环队列)

一、循环队列简介 循环队列是一种线性数据结构&#xff0c;基于 FIFO&#xff08;先进先出&#xff09;原则&#xff0c;将队尾连接到队首形成循环。其核心优势是能复用队列之前用过的空间&#xff0c;避免普通队列 “假溢出” 问题。实现时&#xff0c;通常申请 k1 大小的数组…...

vscode代码片段的设置与使用

在 Visual Studio Code (VS Code) 中&#xff0c;可以通过自定义**代码片段&#xff08;Snippets&#xff09;**快速插入常用代码模板。以下是详细设置步骤&#xff1a; 步骤 1&#xff1a;打开代码片段设置 按下快捷键 Ctrl Shift P&#xff08;Windows/Linux&#xff09;或…...

在Vue中如何高效管理组件状态

在Vue中高效管理组件状态&#xff0c;可以采用以下几种策略&#xff1a; 使用Vuex进行状态管理&#xff1a; 对于复杂的应用&#xff0c;使用Vuex是一个非常有效的状态管理方案。Vuex提供了一个集中存储管理所有组件的状态&#xff0c;并以响应式的方式更新视图。它包括以下几个…...

uniapp -- 列表垂直方向拖拽drag组件

背景 需要在小程序中实现拖拽排序功能,所以就用到了m-drag拖拽组件,在开发的过程中,发现该组件在特殊的场景下会有些问题,并对其进行了拓展。 效果 组件代码 <template><!-- 创建一个垂直滚动视图,类名为m-drag --><scroll...

一款非常小的软件,操作起来非常丝滑!

今天我想给大家分享一款超级实用的小软件&#xff0c;它是一款电脑上用的倒计时和关机助手。 关机助手 帮你自动关机 这款关机助手特别小巧&#xff0c;完全不需要安装&#xff0c;文件大小才60KB&#xff0c;比一个小小的文件还小。你只需要把它下载下来&#xff0c;双击打开…...

FrameWork基础案例解析(四)

文章目录 单独拉取framework开机与开机动画横屏Android.mk语法单独编译SDKmake 忽略warning单独修改和编译Camera2单独编译Launcher3Android Studio 导入、修改、编译Settings导入 Android Studio 导入、修改、编译Launcher3android 开机默认进入指定Launcher植入自己的apk到系…...

嵌入式电量与功耗优化:从理论到实战

目录 一、为什么功耗是个大问题? 电池寿命的命门 效率决定竞争力 运营成本的隐形杀手 环保不是空话 二、功耗从哪来?硬件软件一个都跑不了 硬件:功耗的物理根源 处理器:耗电主力军 存储器:偷偷摸摸的耗电鬼 电源管理单元(PMU):幕后功臣也有损耗 时钟系统:滴…...

通过 C# 提取PDF文档中的图片

当 PDF 文件中包含有价值的图片&#xff0c;如艺术画作、设计素材、报告图表等&#xff0c;提取图片可以将这些图像资源进行单独保存&#xff0c;方便后续在不同的项目中使用&#xff0c;避免每次都要从 PDF 中查找。本文将介绍如何使用C#通过代码从PDF文档中提取图片&#xff…...

国标GB28181视频监控平台EasyCVR保驾护航休闲娱乐“九小场所”安全运营

凭借降低人力资源、节约物资成本的优势&#xff0c;在多个场景得到广泛应用。如今&#xff0c;棋牌室、洗浴中心、酒店这类人员频繁流动和密集的场所&#xff0c;已成为安全管理的重点。​ 尽管部分棋牌室已安装了监控设备&#xff0c;但是设备功能单一&#xff0c;只能实现一…...

GoLand 2024.3 中文 GO语言开发工具

GoLand 2024.3 中文 GO语言开发工具 文章目录 GoLand 2024.3 中文 GO语言开发工具一、介绍二、效果三、下载 一、介绍 JetBrains GoLand 2024 &#xff0c;是一款GO语言开发工具&#xff0c;全行代码补全&#xff1a;能使用本地运行的上下文感知深度学习模型&#xff0c;可以自…...

HTML 音频(Audio)学习笔记

一、HTML 音频概述 在 HTML 中&#xff0c;音频可以通过多种方式播放&#xff0c;但要确保音频在不同浏览器和设备上都能正常播放&#xff0c;需要掌握一些技巧。HTML5 引入了 <audio> 元素&#xff0c;为音频播放提供了一种标准方法&#xff0c;但在 HTML4 中&#xff…...

去中心化交易所(DEX)

核心概念与DEX类型 DEX vs CEX 中心化交易所&#xff08;CEX&#xff09;风险&#xff1a;资产托管风险&#xff08;如2019年超2.9亿美元被盗&#xff09;、隐私泄露&#xff08;如50万用户信息泄漏&#xff09;。 DEX优势&#xff1a;用户自持资产&#xff08;非托管&#x…...

CentOS 7 强制升级Docker 24.x终极指南(解决MySQL8镜像兼容性问题)

CentOS 7 强制升级Docker 24.x终极指南&#xff08;解决MySQL8镜像兼容性问题&#xff09; 旧版本&#xff1a; 新版本docker&#xff1a; 一、问题背景与方案选型 1.1 典型报错分析 The designated data directory /var/lib/mysql/ is unusable根本原因&#xff1a;旧版…...

【区块链安全 | 第十九篇】类型之映射类型

文章目录 映射类型可迭代映射 映射类型 映射类型使用语法 mapping(KeyType KeyName? > ValueType ValueName?)&#xff0c;映射类型的变量声明使用语法 mapping(KeyType KeyName? > ValueType ValueName?) VariableName。 KeyType 可以是任何内置值类型、bytes、st…...

Flask与 FastAPI 对比:哪个更适合你的 Web 开发?

在开发 Web 应用时&#xff0c;Python 中有许多流行的 Web 框架可以选择&#xff0c;其中 Flask 和 FastAPI 是两款广受欢迎的框架。它们各有特色&#xff0c;适用于不同的应用场景。本文将从多个角度对比这两个框架&#xff0c;帮助你更好地选择适合的框架来构建你的 Web 应用…...

QT 中的元对象系统(五):QMetaObject::invokeMethod的使用和实现原理

目录 1.简介 2.原理概述 3.实现分析 3.1.通过方法名调用方法的实现分析 3.2.通过可调用对象调用方法的实现分析 4.使用场景 5.总结 1.简介 QMetaObject::invokeMethod 是 Qt 框架中的一个静态方法&#xff0c;用于在运行时调用对象的成员函数。这个方法提供了一种动态调…...

Linux进程管理与进程间通信

一、进程基础知识 1. 进程的定义与特性 **定义**&#xff1a;进程是程序的一次执行过程&#xff0c;是系统资源分配的基本单位 **特性**&#xff1a; - 动态性&#xff1a;进程是程序的动态执行过程 - 并发性&#xff1a;多个进程可以并发执行 - 独立性&#xff1a;进…...

【无人机】无人机PX4飞控系统高级软件架构

目录 1、概述&#xff08;图解&#xff09; 一、数据存储层&#xff08;Storage&#xff09; 二、外部通信层&#xff08;External Connectivity&#xff09; 三、核心通信枢纽&#xff08;Message Bus&#xff09; 四、硬件驱动层&#xff08;Drivers&#xff09; 五、飞…...

启动arthas-boot.jar端口占用

问题 [rootlocalhost arthas-4.0.4]# java -jar arthas-boot.jar [ERROR] The telnet port 3658 is used by process 7066 instead of target process 6155, you will connect to an unexpected process. [ERROR] 1. Try to restart arthas-boot, select process 7066, shutdow…...