vue如何使用vuedraggable实现不同面板之间的拖拽排序,拖拽复制功能?【vuedraggable】

news2024/11/26 14:39:41

vuedraggable官方文档链接使用说明https://www.itxst.com/vue-draggable/re7vfyfe.htmlicon-default.png?t=N7T8https://www.itxst.com/vue-draggable/re7vfyfe.html

 效果图:

 使用vuedraggable拖动左边的字段和逻辑到右边形成不同的规则校验

<!--
****--@date     2024-02-01 11:34
  ****--@author   MGD
****--@describe 新增 编辑规则
-->
<template>
  <div class="MeetingListAdd">
    <template v-if="$route.name==='meetingListTest'">
      <el-scrollbar>
        <el-container>
          <el-aside width="20%" style="overflow-y: auto;height: calc(100vh - 200px)">
            <div class="col-field-box">
              <el-divider content-position="left">
                <div class="title">字段</div>
              </el-divider>
              <draggable
                  v-model="arr1"
                  :group="dragGroup"
                  :disabled="dragBox"
                  animation="300"
                  drag-class="dragClass"
                  ghost-class="ghostClass"
                  chosen-class="chosenClass"
                  @start="onStart"
                  @end="onEnd"
              >
                <transition-group>
                  <div v-for="(item,key) in arr1" :key="key" class="draggable-item">
                    {{ item.value }}
                  </div>
                </transition-group>
              </draggable>
              <el-divider content-position="left">
                <div class="title">逻辑</div>
              </el-divider>
              <draggable
                  v-model="arr3"
                  :group="dragGroup"
                  :disabled="dragBox"
                  animation="300"
                  drag-class="dragClass"
                  ghost-class="ghostClass"
                  chosen-class="chosenClass"
                  @start="onStart"
                  @end="onEnd"
              >
                <transition-group>
                  <div v-for="(item,key) in arr3" :key="key" class="draggable-item">
                    {{ item.value }}
                  </div>
                </transition-group>
              </draggable>
              <el-divider content-position="left">
                <div class="title">扩展</div>
              </el-divider>
              <draggable
                  v-model="extendVariableArr"
                  :group="dragGroup"
                  :disabled="dragBox"
                  animation="300"
                  drag-class="dragClass"
                  ghost-class="ghostClass"
                  chosen-class="chosenClass"
                  @start="onStart"
                  @end="onEnd"
              >
                <transition-group>
                  <div v-for="(item,key) in extendVariableArr" :key="key" class="draggable-item">
                    {{ item.value }}
                  </div>
                </transition-group>
              </draggable>
              <div style="padding: 20px 0">
                <el-form ref="ruleForm" :model="ruleForm" status-icon :rules="rules" label-width="60px" size="mini">
                  <el-form-item label="key" prop="key">
                    <el-input v-model="ruleForm.key" placeholder="请输入" />
                  </el-form-item>
                  <el-form-item label="value" prop="value">
                    <el-input v-model="ruleForm.value" placeholder="请输入" />
                  </el-form-item>
                  <el-form-item>
                    <el-button size="mini" icon="el-icon-refresh-right" @click="resetForm('ruleForm')">重置</el-button>
                    <el-button type="primary" size="mini" icon="el-icon-plus" @click="submitForm('ruleForm')">保存</el-button>
                  </el-form-item>
                </el-form>
              </div>
            </div>
          </el-aside>
          <el-container>
            <el-main width="80%">
              <div class="rule-field-box">
                <el-divider content-position="left">
                  <div class="title">规则<span>(向左边拖入对应字段进行规则添加)</span></div>
                </el-divider>
                <draggable
                    v-model="saveRuleArr"
                    group="sameDraggable"
                    animation="300"
                    drag-class="dragClass"
                    ghost-class="ghostClass"
                    chosen-class="chosenClass"
                    :scroll="true"
                >
                  <transition-group class="transition-box">
                    <div v-for="(item, index) in saveRuleArr" :key="index" class="rule-item">
                      {{ item.value }}
                      <div class="close-box" @click="handleDel(index)">
                        <i class="el-icon-error" />
                      </div>
                    </div>
                  </transition-group>
                </draggable>
                <div v-if="!saveRuleArr.length" class="empty-box">
                  <el-empty :image-size="150" description="向左边拖入对应字段进行规则添加" />
                </div>
              </div>
            </el-main>
            <el-footer>
              <div class="button-box">
                <el-button class="resetting" type="danger" icon="el-icon-refresh-right" @click="saveRuleArr = []">重置</el-button>
                <el-button class="submit" type="primary" icon="el-icon-edit-outline" :loading="buttonLoading" :disabled="!saveRuleArr.length" @click="handleSave()">保存</el-button>
              </div>
            </el-footer>
          </el-container>
        </el-container>
      </el-scrollbar>
    </template>
    <template v-else>
      <router-view />
    </template>
  </div>
</template>

<script>
import Draggable from 'vuedraggable'
export default {
  name: 'MeetingListAdd',
  components: { Draggable },
  mixins: [],
  data() {
    return {
      buttonLoading: false,
      dragBox: false,
      dragGroup: {
        name: 'sameDraggable',
        put: false, // true|false|array|function,//是否允许拖入当前组
        pull: 'clone'// true|false| 'clone'|array|function,//是否允许拖出当前组
      },
      ruleForm: {
        value: '',
        key: ''
      },
      rules: {
        value: [{ required: true, message: '请输入', trigger: 'blur' }],
        key: [{ required: true, message: '请输入', trigger: 'blur' }]
      },
      // 定义要被拖拽对象的数组
      arr1: [
        { key: 1, value: '字段1' },
        { key: 2, value: '字段2' },
        { key: 3, value: '字段3' },
        { key: 4, value: '字段4' },
        { key: 5, value: '字段5' }
      ],
      arr3: [
        { key: 1, value: '且' },
        { key: 2, value: '或' },
        { key: 3, value: '非' },
        { key: 4, value: '>' },
        { key: 5, value: '<' },
        { key: 6, value: '=' },
        { key: 7, value: '包含' },
        { key: 8, value: '不包含' }
      ],
      extendVariableArr: [], // 扩展变量
      saveRuleArr: [] // 规则空数组
    }
  },
  computed: {},
  watch: {},
  created() {},
  mounted() {},
  methods: {
    // 开始拖拽事件
    onStart() {
      console.log('=========拖拽开始========')
      this.dragBox = true
    },
    // 拖拽结束事件
    onEnd() {
      console.log('=======拖拽结束==========')
      this.dragBox = false
    },
    // 删除
    handleDel(index) {
      this.saveRuleArr.splice(index, 1)
    },
    submitForm(formName) {
      this.$refs[formName].validate((valid) => {
        if (valid) {
          const submitInfo = JSON.parse(JSON.stringify(this.ruleForm))
          this.extendVariableArr.push(submitInfo)
          this.resetForm(formName)
        } else {
          console.log('error submit!!')
          return false
        }
      })
    },
    resetForm(formName) {
      this.$refs[formName].resetFields()
    },
    // 保存
    handleSave() {
      console.log(this.saveRuleArr, '==============================规则数据')
    }
  }
}
</script>

<style lang="scss">
.MeetingListAdd {
  height: 100%;
  padding: 20px;
  .el-scrollbar {
    height: 100%;
    width: 100%;
    overflow-x: hidden;

    .el-scrollbar__view {
      overflow-x: hidden;
    }
    .el-scrollbar__wrap {
      overflow-x: hidden;
    }
  }
  /*定义要拖拽元素的样式*/
  .ghostClass {
    display: inline-block;
    background-color: #CCE4FF !important;
  }

  .chosenClass {
    padding: 12px;
    color: #fff;
    display: inline-block;
    background-color: #7eb8ff !important;
    opacity: 1 !important;
  }

  .dragClass {
    padding: 6px 12px !important;
    display: inline-block;
    background-color: #CCE4FF !important;
    opacity: 1 !important;
    box-shadow: none !important;
    outline: none !important;
    background-image: none !important;
    border-radius: 0 !important;
  }

  .col-field-box {
    .title {
      padding: 12px 0;
      font-size: 18px;
      font-weight: bold;
      color: #333;
    }
    .draggable-item {
      min-width: 60px;
      text-align: center;
      margin: 0 8px 8px;
      padding: 6px 12px;
      display: inline-block;
      border-radius: 20px;
      color: #fff;
      font-size: 14px;
      cursor: pointer;
      background: linear-gradient(180deg, rgb(107, 145, 218) 0%, rgba(24, 144, 242, 1) 100%);
      box-shadow:inset 2px 0 18px  rgba(107, 145, 218, 1),inset 0 5px 10px  rgba(247, 247, 247, 1);
    }
    .draggable-item:hover {
      background-color: #fdfdfd;
      cursor: move;
    }

    .draggable-item+.draggable-item {
      border-top: none;
      margin-top: 6px;
    }
  }

  .rule-field-box {
    position: relative;
    height: calc(100vh - 300px);
    padding: 0 12px;
    border-radius: 20px;
    .title {
      padding: 12px 0;
      font-size: 18px;
      font-weight: bold;
      color: #333;
      span {
        font-weight: normal;
        font-size: 14px;
        color: #FA8C1E;
      }
    }
    .transition-box {
      padding: 12px;
      display: block;
      height: 60vh;
      background: #2b2b2b;
      border-radius: 12px;
      overflow-y: auto;
    }
    .empty-box {
      position: absolute;
      top: 0;
      left: 0;
      bottom: 0;
      right: 0;
      margin: auto;
      display: flex;
      justify-content: center;
      align-items: center;
      .el-empty__description p {
        color: #eee;
        font-size: 16px;
      }
    }
    .rule-item {
      min-width: 35px;
      text-align: center;
      position: relative;
      font-size: 16px;
      display: inline-block;
      padding: 12px 4px;
      color: #fff;
      background: #323232;
      flex-wrap: wrap;
      .close-box {
        display: none;
        position: absolute;
        top: -5px;
        right: -5px;
        cursor: pointer;
      }
    }
    .rule-item:hover .close-box {
      display: inline-block;
      z-index: 1;
    }
    .rule-item:hover {
      background-color: #6b6b6b;
      cursor: move;
    }
    .rule-item+.rule-item {
      border-top: none;
      margin-top: 6px;
    }
  }
  .button-box {
    display: flex;
    justify-content: center;
    align-items: center;
    margin-top: 10px;
    .resetting,.submit {
      padding: 12px 0;
      font-size: 18px;
      width: 160px;
      border-radius: 6px;
      border: none;
      background: #2482ED;
    }
    .resetting {
      background: #fff;
      color: #2482ED;
      border: 1px solid #2482ED;
    }
  }
}
</style>

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

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

相关文章

私募证券基金动态-23年12月报

成交量&#xff1a;12月日均7,696.93亿元 2023年12月A股两市日均成交7,696.93亿元&#xff0c;环比下降12.39%、同比下降2.26%。12月整体21个交易日&#xff0c;无单日交易日成交金额过万亿&#xff0c;单日交易日最低成交金额为6,122.84亿元&#xff08;12月25日&#xff09;…

GPT-4 Vision调试任何应用,即使缺少文本日志 升级Streamlit七

GPT-4 Vision 系列: 翻译: GPT-4 with Vision 升级 Streamlit 应用程序的 7 种方式一翻译: GPT-4 with Vision 升级 Streamlit 应用程序的 7 种方式二翻译: GPT-4 Vision静态图表转换为动态数据可视化 升级Streamlit 三翻译: GPT-4 Vision从图像转换为完全可编辑的表格 升级St…

【C/Python】GtkApplicationWindow

一、C语言 GtkApplicationWindow 是 GTK 库中用于创建应用程序主窗口的一个控件。 首先&#xff0c;需要确保环境安装了GTK开发库。然后&#xff0c;以下是一个简单的使用 GtkApplicationWindow 创建一个 GTK 应用程序的示例&#xff1a; #include <gtk/gtk.h>static …

前端JavaScript篇之let、const、var的区别

目录 let、const、var的区别 let、const、var的区别 let、const和var是JavaScript中用于声明变量的关键字&#xff0c;它们之间有一些区别。 首先&#xff0c;var是在ES5中引入的关键字&#xff0c;而let和const是在ES6中引入的。在ES6之前&#xff0c;我们只能使用var来声明…

Thinkphp5.0.23远程代码执行漏洞复现

★★免责声明★★ 文章中涉及的程序(方法)可能带有攻击性&#xff0c;仅供安全研究与学习之用&#xff0c;读者将信息做其他用途&#xff0c;由Ta承担全部法律及连带责任&#xff0c;文章作者不承担任何法律及连带责任。 1、漏洞介绍 使用Thinkphp5.x远程代码执行漏洞&#xf…

操作系统--进程、线程基础知识

一、进程 我们编写的代码只是一个存储在硬盘的静态文件&#xff0c;通过编译后就会生成二进制可执行文件&#xff0c;当我们运行这个可执行文件后&#xff0c;它会被装载到内存中&#xff0c;接着 CPU 会执行程序中的每一条指令&#xff0c;那么这个运行中的程序&#xff0c;就…

python爬虫-多线程-数据库——WB用户

数据库database的包&#xff1a; Python操作Mysql数据库-CSDN博客 效果&#xff1a; 控制台输出&#xff1a; 数据库记录&#xff1a; 全部代码&#xff1a; import json import os import threading import tracebackimport requests import urllib.request from utils im…

博客文章质量分数列表【分页、排序、搜索】

文章目录 一、分析二、代码1、前端代码2、后端代码 三、实现效果四、总结1、出现安全验证2、401 Unauthorized: [no body] 一、分析 官方提供的质量分查询入口&#xff1a;CSDN质量分 输入我们要查的文章即可&#xff0c;比如&#xff1a;https://blog.csdn.net/qq_36433289/a…

开发板——X210开发板的SD卡启动方式

以下内容源于朱有鹏嵌入式课程的学习与整理&#xff0c;如有侵权请告知删除。 参考博客&#xff1a; S5PV210 SD卡启动 - 简书 关于存储器的相关基础知识&#xff0c;见博文&#xff1a; 外存——SD卡/iNand芯片与S5PV210的SD/MMC/iNand控制器-CSDN博客 RAM、ROM和FLASH三…

了解WPF控件:TreeView常用属性与用法(十五)

引言 TreeView控件是WPF&#xff08;Windows Presentation Foundation&#xff09;中用于显示分层数据的常用控件。这个控件允许用户以树形结构展示数据&#xff0c;使得数据更加清晰易懂。在创建文件浏览器、组织结构图等应用程序时&#xff0c;TreeView控件非常有用。 Tree…

R语言入门笔记2.0

1.创建数据框 在R语言中&#xff0c;可以使用data.frame函数来创建数据框。以下是一个简单的示例&#xff0c;这段R语言代码创建了一个名为student的数据框&#xff0c;其中包含了学生的ID、性别、姓名和出生日期&#xff0c;首先创建一个包含学生出生日期的向量&#xff0c;再…

探秘本庄村果园预售系统的技术之旅

✍✍计算机编程指导师 ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡ Java实战 |…

【MCAL】TC397+EB-tresos之GPT配置实战 - 定时器

本篇文章介绍了在TC397平台使用EB-tresos对GPT驱动模块进行配置的实战过程,不仅介绍了使用GTM来实现定时器的方案&#xff0c;还介绍了基于GPT12来实现连续定时器的实例。因为GTM是德国博世公司开发的IP&#xff0c;而英飞凌的芯片集成了这个IP&#xff0c;并在这个基础上搭建了…

Pytest 与allure测试报告集成

通过Feature, story, step 记录测试的功能&#xff0c;场景及测试步骤 # login.pylogin_func函数 传入参数是name 和 password 当输入的name和password与数据库db_data中数据一致时&#xff0c;返回“XXX成功登录系统&#xff01;” 当输入的name存在于数据库db_data但密码不正…

双非本科准备秋招(13.1)—— 力扣 栈、队列与堆

1、103. 二叉树的锯齿形层序遍历 昨天做的二叉树的层序遍历&#xff0c;把代码直接拿过来。 这个题要求的是一个Z型遍历&#xff0c;如下图。 用一个变量f记录正反顺序&#xff0c;然后使用LinkedList记录答案&#xff0c;下图可以看到LinkedList继承了Deque&#xff0c;所以…

【知识图谱--第一讲概论】

深度学习–连接主义 知识图谱–符号主义 表示 有属性图和RDF图两种 RDF由三元组表示&#xff1a;Subject - Predicate - Object 存储 图数据库 抽取 融合 推理 问答 图算法

Linux:进程信号的概念与产生原理

文章目录 信号的概念实践信号关于前台和后台进程的操作 操作系统与外设信号的产生signal系统调用 前面的篇章结束了信号量的话题&#xff0c;那么接下来引入的是信号的话题&#xff0c;信号和信号量之间没有任何关系&#xff0c;只是名字比较像 信号的概念 在生活中存在各种各…

linux麒麟系统安装mongodb7.0

1.mogedb下载 下载的是他tar包 https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel80-7.0.5.tgz wget -o https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel80-7.0.5.tgz 也可以下载rpm包 2.将包上传至服务器并解压 #进入目录 并解压 cd /opt/ tar…

Linux ---- Shell编程之免交互

一、Here Document 多行重定向 1、Here Document定义 使用I/O重定向的方式将命令列表提供给交互式程序标准输入的一种替代品Here Document 是标准输 入的一种替代品&#xff0c;可以帮助脚本开发人员不必使用临时文件来构建输入信息&#xff0c;而是直接就地生产出一个文件…

技术科普 | 机器视觉5大关键技术及其常见应用

计算机视觉是指&#xff1a;让机器通过数字图像或视频等视觉信息来模拟人类视觉的过程&#xff0c;以达到对物体的理解、识别、分类、跟踪、重建等目的的技术。它是人工智能领域中的一个分支&#xff0c;涉及图像处理、模式识别、机器学习、深度学习等多个领域。 随着人工智能和…