vue拖拉拽动态表单

Vue表单拖拽排序 Vue table表单拖拽排序 业务需求: 因为数据展示使用的是 elementUI的 Table进行数据展示的,现在的需求是通过拖拽表单进行表单排序。同时,动态修改表单中的数据排列顺序。查阅了好多资料,也翻看了好多github上别人封装好的表单插件,但是最终都不是自己想要的,其中主要原因就是,后台管理系统页面中,同一个窗口可能涉及到多个表单拖拽排序,与此同时,使用部分插件就有可能导致数据更新不及时,或者下次在使用的时候,数据无论如何赋值就是更新不成功,导致最终渲染的要拖拽的表单一会有数据,一会无数据的,体 阅读详情

 

<template>

  <div class="box">
    <h4>这是发布页面</h4>
    <el-row :gutter="10">
      <el-col :span="8">
        <div class="grid-content bg-purple-light">
          <div id="ComponentFactory">
            <el-form ref="form" :model="form" label-width="80px">

              <div class="item" draggable="true" id="item1"  @dragstart='copydrop($event)'>
                <el-form-item label="输入框">
                  <el-input v-model="form.name"></el-input>
                </el-form-item>
              </div>

              <div class="item"  draggable="true" id="item2"   @dragstart='copydrop($event)'>
                <!-- 复选框 -->
                <!--<el-form-item label="复选框">
                  <el-checkbox-group v-model="form.type">
                    <el-checkbox label="美食" name="type"></el-checkbox>
                    <el-checkbox label="活动" name="type"></el-checkbox>
                    <el-checkbox label="线下" name="type"></el-checkbox>
                    <el-checkbox label="单纯" name="type"></el-checkbox>
                  </el-checkbox-group>
                </el-form-item>-->
                <el-form-item label="日期时间">
                  <el-date-picker
                    v-model="datetimevalue"
                    type="datetime"
                    placeholder="选择日期时间"
                    align="right"
                    :picker-options="pickerOptions1">
                  </el-date-picker>
                </el-form-item>

              </div>

              <div class="item" id="item4" draggable="true"  @dragstart='copydrop($event)'>
                <!-- 单选框 -->
                <el-form-item label="单选框">
                  <el-radio-group v-model="form.resource">
                    <el-radio label="线上"></el-radio>
                    <el-radio label="线下"></el-radio>
                  </el-radio-group>
                </el-form-item>
              </div>

              <div class="item" id="item5" draggable="true"  @dragstart='copydrop($event)'>
                <!-- 下拉列表框 -->
                <el-form-item label="下拉框">
                  <el-select v-model="form.region" placeholder="请选择活动区域">
                    <el-option label="区域一" value="shanghai"></el-option>
                    <el-option label="区域二" value="beijing"></el-option>
                  </el-select>
                </el-form-item>
              </div>

              <div class="item" id="item7" draggable="true"  @dragstart='copydrop($event)'>
                <!-- (一般信息)Info -->
                <el-form-item label="按钮">
                  <el-button type="primary">主要按钮</el-button>
                </el-form-item>
              </div>

              <div class="item" id="item8" draggable="true"  @dragstart='copydrop($event)'>
                <!-- (成功)Success -->
                <el-form-item label="按钮">
                  <el-button type="success">成功按钮</el-button>
                </el-form-item>
              </div>

              <div class="item" id="item9" draggable="true"  @dragstart='copydrop($event)'>
                <!-- (危险)Danger-->
                <el-form-item label="按钮">
                  <el-button type="danger">危险按钮</el-button>
                </el-form-item>
              </div>

              <div class="item" id="item11" draggable="true"  @dragstart='copydrop($event)'>
                <!-- 按钮组 -->
                <el-form-item label="按钮">
                  <el-button type="success">成功按钮</el-button>
                  <el-button type="danger">危险按钮</el-button>
                </el-form-item>
              </div>

              <div class="item2" id="item10" draggable="true"  @dragstart='copydrop($event)'>
                <!-- 文本域 -->
                <el-form-item label="活动形式">
                  <el-input type="textarea" v-model="form.desc"></el-input>
                </el-form-item>
              </div>
            </el-form>
          </div>

        </div>
      </el-col>
      <el-col :span="8" class="flxed">
        <!--视图区-->
        <div class="grid-content">

        <!--选项卡-->
          <el-tabs v-model="editableTabsValue" type="card" editable @edit="handleTabsEdit">
            <el-tab-pane :key="item.name" v-for="(item, index) in editableTabs" :label="item.title" :name="item.name">
              <!--视图区-->
              <div class="tab-content" id="box" v-model="htmlcode" @dragstart='removedrop($event)' @drop='copydrap($event)' @dragover='allowDrop($event)'>

              {{item.content}}


              </div>

            </el-tab-pane>
          </el-tabs>
        </div>
        <!--移除区-->
        <div class="bg-purple-light" id="removeBox" @drop='removedrap($event)' @dragover='allowDrop($event)'>
        </div>
      </el-col>
      <el-col :span="8" class="flxed">
        <!--查看源码-->
        <div class="grid-content bg-purple-light" id="codeBox" >{{ htmlcode }}</div>
      </el-col>
    </el-row>
    <!--模态框-->
    <el-dialog title="修改名称" :visible.sync="dialogFormVisible" width="20%">
      <el-form :model="form">
        <el-form-item label="名称" >
          <el-input v-model="labelname"></el-input>
        </el-form-item>
      </el-form>
      <div slot="footer" class="dialog-footer">
        <el-button @click="dialogFormVisible = false">取 消</el-button>
        <el-button type="primary" @click="updateLabel">确 定</el-button>
      </div>
    </el-dialog>
  </div>
</template>

import
<script type="application/javascript">
  let id = null
  let itemName = null
  let cloneObject = null
  let removeid = null
  let moveObj = null
  export default {
    data() {
      return {
        form: {
          name: '',
          region: '',
          date1: '',
          date2: '',
          delivery: false,
          type: [],
          resource: '',
          desc: ''
        },
        pickerOptions1: {
          shortcuts: [{
            text: '今天',
            onClick(picker) {
              picker.$emit('pick', new Date());
            }
          }, {
            text: '昨天',
            onClick(picker) {
              const date = new Date();
              date.setTime(date.getTime() - 3600 * 1000 * 24);
              picker.$emit('pick', date);
            }
          }, {
            text: '一周前',
            onClick(picker) {
              const date = new Date();
              date.setTime(date.getTime() - 3600 * 1000 * 24 * 7);
              picker.$emit('pick', date);
            }
          }]
        },
        /* 日期插件*/
        datetimevalue: '',
        /* 模态框状态*/
        dialogFormVisible: false,
        labelid: '',
        labelname: '',
        htmlcode: '',
        /* 选项卡属性*/
        editableTabsValue: '2',
        editableTabs: [{
          title: 'Tab 1',
          name: '1',
          content: 'Tab 1 content'
        }, {
          title: 'Tab 2',
          name: '2',
          content: 'Tab 2 content'
        }],
        tabIndex: 2
      }
    },
    methods: {
      // 抓起
      copydrop: function(e) {
        console.log('SET -> addBuffer', e.target.id)
        e.dataTransfer.setData('addBuffer', e.target.id)
        this.CopyCss(e.target.id, '1px dashed #66CC99', 'rgba(204,204,204,0.3)', '4px')
      },
      // 移除起
      removedrop: function(e) {
        console.log('移除节点托起ID:', e.target.id)
        e.dataTransfer.setData('removeBuffer', e.target.id)
        this.CopyCss(e.target.id, '1px dashed red', 'rgba(204,204,204,0.3)', '4px')
      },
      // 移除放下
      removedrap: function(e) {
        removeid = e.dataTransfer.getData('removeBuffer')
        if (removeid === null || removeid === '') {
          console.log('removeId == null')
          return
        }
        console.log('移除节点放下ID:', removeid)
        // 删除节点
        document.getElementById(removeid).parentNode.removeChild(document.getElementById(removeid));
      },
      // 放下
      copydrap: function(e) {
        // console.log('放下')
        e.preventDefault()
        id = e.dataTransfer.getData('addBuffer')
        if (id === null || id === '') {
          console.log('id is NULL!')
          return
        }
        itemName = 'item' + parseInt(Math.random() * (1000000 - 1 + 1) + 1)
        console.log('GET-> addBuffer:', itemName)
        // 克隆真实对象
        cloneObject = document.getElementById(id).cloneNode(true)

        // 为克隆对象设置唯一Id
        cloneObject.setAttribute('id', itemName)
        // this.$set(cloneObject, 'id', itemName)
        // this.$set(cloneObject, '@click', 'updateLabel()')
        // 把新的节点添加到新的区域中
        e.target.appendChild(cloneObject)

        console.log(e.target.id)
        // console.log(cloneObject)
        // 设置样式
        this.CopyCss(id, '', '', '')

        // 修改名称
        this.dialogFormVisible = true
        this.labelid = itemName
      },
      // 拖动过程
      allowDrop: function(e) {
        console.log(e.target.id)
        e.preventDefault()
      },
      updateLabel: function() {
        this.dialogFormVisible = false
        // 设置labelname 到对呀的label
        document.getElementById(this.labelid).children[0].children[0].innerHTML = this.labelname
        // console.log(label)
        this.htmlcode = document.getElementById('box').innerHTML
        document.getElementById('codeBox').innerHTML = this.htmlcode
      },
      CopyCss: function(obj, border, background, borderradius) {
        moveObj = document.getElementById(obj)
        moveObj.style.border = border
        moveObj.style.background = background
        moveObj.style.borderRadius = borderradius
      },
      /* 选项卡属性*/
      handleTabsEdit(targetName, action) {
        if (action === 'add') {
          let newTabName = ++this.tabIndex + ''
          this.editableTabs.push({
            title: 'New Tab',
            name: newTabName,
            content: 'New Tab content'
          });
          this.editableTabsValue = newTabName
        }
        if (action === 'remove') {
          let tabs = this.editableTabs;
          let activeName = this.editableTabsValue
          if (activeName === targetName) {
            tabs.forEach((tab, index) => {
              if (tab.name === targetName) {
                let nextTab = tabs[index + 1] || tabs[index - 1]
                if (nextTab) {
                  activeName = nextTab.name
                }
              }
            });
          }

          this.editableTabsValue = activeName
          this.editableTabs = tabs.filter(tab => tab.name !== targetName)
        }
      }
    }
  }
</script>

<style scoped>
  .box{
    padding:20px;
  }
  .bg-purple {
    background: #d3dce6;
  }
  .bg-purple-light {
    background: #e5e9f2;
  }
  .grid-content {
    border-radius: 4px;
    height: 700px;
    overflow: auto;
    padding:20px;
  }
  .tab-content{
    border:1px solid #eee;
    border-radius: 4px;
    min-height: 200px;
    overflow: auto;
    padding:20px;
  }
  .item{
    height: 60px;
    border:0px solid #333;
    /*border-radius: 4px;
    border-style: dashed;*/
    padding: 10px;
    margin-bottom: 5px;
    cursor: pointer;
  }
  .item2{
    height: 80px;
    border:0px solid #333;
    /*border-radius: 4px;
    border-style: dashed;*/
    padding: 10px;
    margin-bottom: 5px;
    cursor: pointer;
  }
  #removeBox{
    height: 100px;
    width: 100px;
    border:2px dashed #999;
    background: rgba(0,0,0,0.3);
    position: absolute;
    bottom: 10px;
    right: 20px;
    background: url(/static/image/deleteBox.png) no-repeat;
    background-size: 90%;
    background-position: center center;
  }
  .flxed{
    position: relative;
    top: 0;
    left: 0;
  }
</style>
 

基于vue的 表单设计器(拖拽生成表单) 日常开发时想要快速构建节省时间或者功能需求需要拖拽生成表单,推荐使用以下表单设计器。 1.基于vue+elementui 的表单设计及代码生成器 Form Generator 码云仓库:form-generator: Element UI表单设计及代码生成器 演示地址:form-generator ... 阅读详情

相关推荐

Vue可视化拖拽表单实战:从零搭建动态表单编辑器

本文详细介绍了如何使用Vue和vuedraggable从零搭建可视化拖拽表单编辑器,提升开发效率并优化用户体验。通过环境准备、核心功能实现到高级优化,帮助开发者快速掌握动态表单开发技巧,适用于低代码平台和业务系统搭建。

weixin_27240351的博客 146

element form表单二次封装,并做成可拖拽的表单

今天为大家带来一篇element form表单二次封装,并做成可拖拽的表单 现阶段大部分功能已经完善,后续会添加更多的组件 首先先带搭建看一下页面 项目基于element ui 二次封装后的zx-lib 现在先来说一下zx-lib zx-lib 为element ui 二次封装的form表单以及table组件,现在已上传到npm 大家可以在线使用 使用方法: npm i zx-lib -S main.js 中引用 import zxLib from ‘zx-lib’ Vue.use(zxLib

轮回千载 1971

【开源】Vue+ElementUI拖拽表单设计器实战:从零构建自定义表单系统

本文详细介绍了如何使用Vue和ElementUI从零开发一个拖拽表单设计器,实现自定义表单系统。通过组件化设计和动态渲染技术,开发者可以快速搭建表单界面,提升开发效率。文章涵盖环境搭建、核心功能实现、表单验证与数据收集等关键环节,并提供了性能优化和扩展性设计的实用建议。

weixin_27603469的博客 352

vue----实现不同面板之间的拖拽按钮功能

vue----实现不同面板之间的拖拽按钮功能

wlijun_0808的博客 1295

低代码可视化大屏开发:从拖拉拽到FlyFish架构深度解析

数据可视化是将抽象数据转化为直观图形的关键技术,其核心原理在于通过视觉编码映射数据属性,帮助用户快速洞察信息模式。在工程实践中,传统编码开发方式面临效率瓶颈,催生了低代码开发平台的兴起。这类平台通过封装底层渲染引擎与布局算法,将可变的数据映射与样式配置抽象为可视化配置项,显著降低了可视化应用的构建门槛。其技术价值在于实现了开发范式的转变,使业务人员也能通过拖拉拽方式快速搭建专业大屏。典型的应用场景包括企业经营分析、实时监控看板和业务数据汇报等。本文以FlyFish平台为例,深入剖析其支撑“拖拉拽”体验的核心

weixin_29311017的博客 325

vue-dynamic-form:vue+antd实现的动态表单,可拖拽,可响应式,完全自定义布局

form-builder 技术栈: 基于VUE2.x + ant-design-vue 1.6.2 + sortable.js(拖拽) 实现的动态表单功能,支持编辑模式,表格模式,详情模式 代码按单元组件模块式划分,结构清晰、维护简单 (2核1G服务器,请勿攻击) 欢迎有兴趣的同学star,如有问题请提issues 或者联系: 以下为截图: Project setup npm install Compiles and hot-reloads for development npm run serve Compiles and minifies for production npm run build Customize configuration See Configuration Reference.

vue拖拉拽动态表单(转)

jquery/Bootstrap表单动态拖拉拽添加 先分享代码了 ,原理可以看上面jquery的原理,差不多的。 <template> <div class="box"> <h4>这是发布页面</h4> <el-row :gutter="10"> <el-col :span="8"> <div class="grid-content bg-purple-light"&gt...

doasmaster的博客 1003

基于Vue和Element UI的动态表单组件设计源码

基于Vue和Element UI的动态表单组件设计源码,该项目包含217个文件,主要文件类型有95个Vue前端文件,78个JavaScript文件,10个json配置文件,6个gif动画文件,5个Markdown文档,5个HTML页面文件,4个CSS样式文件,3个woff字体文件,以及3个png图像文件和2个ico图标文件。该组件通过vue+element ui实现,支持通过拖拽组件到面板来快速创建表单,并可以动态隐藏或显示各个组件,实现弹窗式维护。该项目致力于打造开源最强的Vue动态表单组件,并持续维护以提供更好的用户体验。

开源 | Lemon-form(柠檬轻表单) 基于Vue3实现的开源表单系统

简单来说渲染器是一个函数:根据表单的配置动态渲染出UI的业务逻辑,并动态完成配置的逻辑配置,数据绑定,交互方式。开发画布渲染:开发状态画布渲染,涉及到用户动态配置,拖拉拽用户调整导致的动态渲染逻辑,复杂一些的包括多人协同导致的算法调度和实时渲染逻辑,功能最全,最复杂预览:针对开发态的页面进行实时预览,查看页面搭建效果,可以调整预览终端,页面大小,主题等元素并实时获取反馈。

2504_91996561的博客 1733

变压器耦合放大器(低频应用+高频应用)

变压器耦合放大器(低频应用+高频应用)

m0_54943120的博客 2275

STM32学习笔记【江科协】【4-2】OLED显示屏

可以注意到接电源的GND和VCC同时和PB6、PB7号口连接,我们可以直接不初始化这两个引脚解决,因为STM32的引脚上电后,如果不初始化,默认是浮空输入的模式,在这个模式下,引脚不会输出电平,所以不会有什么影响,或者直接给PB6口输出低电平,PB7口输出高电平,用GPIO口直接给OLED供电,这个也是没问题的,因为OLED的功率很小这个也是可以驱动的,不过用GPIO口供电不是很规范,实际项目还是用电源供电。然后点击这里放大镜里面带d的图标,进入调试模式,这个界面里,

m0_74651303的博客 1595

Vuejs动态表单,拖拉拽生成

vue拖拉拽动态表单 之前写了一个jquery的拖来拽表单,但是用到vue项目,太麻烦,于是有重写了一边,虽说差不多,但是对vue还不太了解,写了一个大概,大家不会的可以参考一下,改一改。 jquery/Bootstrap表单动态拖拉拽添加 先分享代码了 ,原理可以看上面jquery的原理,差不多的。 <template> <div class="box"> <h4>这是发布页面<

J、wen的博客 2万+

从零构建工业级SPI-CAN网关:CH347与CH9431的软硬件协同设计实战

本文详细介绍了基于CH347和CH9431芯片构建工业级SPI-CAN网关的完整方案。通过硬件架构设计、Linux驱动定制、并发处理优化和EMC抗干扰测试,实现高可靠性通信网关,适用于工业自动化和汽车电子等严苛环境。

spark7igniter的博客 632

ruoyi vue plus 中的warm flow用法

主要介绍了 RuoYi Vue Plus +Warm Flow的使用

qq_33925837的博客 875

RM3100应用笔记驱动程序SPI接口

PNI磁传感器套件RM3100磁传感器套件由2个Sen-XY-f(pn13104)地磁传感器,1个Sen-Z-f(pn13101)地磁传感器和MagI2C(pn13156)控制芯片组成,能够实现三维空间的磁场大小测量。

AIoT技术栈的博客 4923

2023东华大学机试OJ进阶版1-81题

先排序。每次找两个最小的数,把其中一个置为两数之和,并累加这个和值,另一个数置为-1,然后再排序,重复操作,直到只剩下一个数。105。

m0_49263811的博客 2796

Vue.Draggable终极指南:如何在Vue.js中实现拖拽排序功能

Vue.Draggable是Vue.js生态中功能最强大的**拖拽排序组件**,基于SortableJS构建,让开发者能够轻松实现**列表拖拽排序**功能。本指南将带你从零开始掌握这个强大的工具!✨ ## 什么是Vue.Draggable? Vue.Draggable是一个**Vue.js拖拽组件**,专门用于实现元素的拖拽排序功能。它完美地集成了SortableJS的所有特性,同时保持了Vu

gitblog_00539的博客 637

GEE:基于MODIS数据计算NDVI时间序列,并使用Savatsky-Golay(SG)滤波器对其进行平滑处理

优快云@_养乐多_本文将介绍如何在 Google Earth Engine (GEE) 平台中,使用 MODIS 数据计算 NDVI 时间序列,并对该数据集应用 Savitzky-Golay 滤波器,得到了一个新的平滑后的数据集。Savitzky-Golay 滤波器可以有效地去除信号中的噪声,并平滑信号的变化。该方法可以扩展到基于 MODIS 数据计算的任何指数或者波段。

养乐多的博客 1426

lemon-form:基于Vue3和TypeScript的开源表单解决方案

lemon-form:基于Vue3和TypeScript的开源表单解决方案 项目介绍 在现代Web开发中,表单是一个不可或缺的元素。无论是用户注册、信息提交还是数据交互,表单都扮演着重要的角色。然而,创建和管理表单往往是一件复杂且耗时的工作。柠檬表单(lemon-form)正是一个为了简化这一过程而诞生的开源项目。它基于最新的前端技术Vue3和TypeScript进行开发,提供了一个功能强大且易于...

gitblog_01041的博客 1048

python实现MACD策略背离点的判断 (附完整源码)

python实现MACD策略背离点的判断 (附完整源码)

希望我的博客,能帮上你解决学习中工作中所遇到的问题 666

java技术专家 【DDD(领域驱动设计)思想解读及优秀实践 22】|泛化建模(上):领域知识更抽象怎么办?

java技术专家 【DDD(领域驱动设计)思想解读及优秀实践 22】|泛化建模(上):领域知识更抽象怎么办?

大壮 1166

Vue3 低代码平台项目实战(上)

本文介绍了低代码平台项目实战的前期准备工作。项目采用Vue3技术栈,结合Element Plus、Pinia等框架,实现用户通过拖拉拽组件进行可视化编辑的功能。文章详细讲解了项目搭建过程,包括创建Vue3项目、安装依赖(Sass、Element Plus等)、CSS样式配置(重置样式、通用样式、主题变量等),以及首页的基本实现。特别说明了如何禁用不必要的SCSS编译插件,并展示了项目的基本架构和页面布局。该低代码平台将为用户提供便捷的问卷设计功能,通过可视化操作降低开发门槛。

qq_39055970的博客 694

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

低代码平台

近些年来,随着Saas行业的高速发展,低代码的概念也逐渐流行了起来,而低代码产品也越来越多地出现在我们的身边,像国外的Mendix,国内的宜搭、苍穹、简道云等等。而我(博客作者)司自研的低代码应用构建平台也已服务了十余B端生产项目。基于这种新型的开发方式,图形化的拖拉拽配置界面,并兼容了自定义的组件、代码扩展,确实在B端后台管理类网站建设中很大程度上提升了效率。

qq_37581764的博客 860

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

低代码平台基础 Java+MySQL实现可拖拽的表单生成器后端

采用Spring Boot框架简化后端开发,搭配MyBatis-Plus操作MySQL数据库。前端通过JSON与后端交互表单配置数据,后端提供CRUD接口和动态表单渲染逻辑。完整实现需结合具体业务需求调整数据结构与接口逻辑,前端可通过Vue/React等框架实现拖拽交互。

xtrou234的博客 414

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

分享60个element-ui源码总有一个是您想要的

山高路远坑深,大军纵横驰奔,谁敢横刀立马?通过网盘分享的文件:62个element-ui源码.rar。分享60个element-ui源码总有一个是您想要的。知识付费甚欢喜,为咱码农谋福利。

zy0412326的专栏 1168

基于java+springboot的OA管理系统自动化办公系统

后端框架前端框架数据库辅助工具 如需完整源码或详细设计文档,可参考GitHub开源项目(如或),或基于上述技术栈自行搭建。

java python定制开发 648
上一篇: IDEA有用插件
下一篇: mxGraph 入门实例教程
兀兀术
博客等级 码龄19年 25粉丝 13原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值