位置: IT常识 - 正文

vue3使用拖拽组件draggable.next的使用教程【保姆级】(vue3 拖拽)

编辑:rootadmin
vue3使用拖拽组件draggable.next的使用教程【保姆级】

推荐整理分享vue3使用拖拽组件draggable.next的使用教程【保姆级】(vue3 拖拽),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:vue自定义拖拽指令,vuejs拖拽,vuejs拖拽,vue拖拽组件生成页面代码,vue 拖拉拽,vue拖拽组件生成页面代码,vuejs拖拽,vue实现拖拽组件,内容如对您有帮助,希望把文章链接给更多的朋友!

环境:vue3+setup语法

首先放官方文档的链接:

中文版本: https://www.itxst.com/vue-draggable-next/tutorial.html (民间翻译)

英文版本:https://github.com/SortableJS/vue.draggable.next

因为自己写的过程中,官方文档和网上的资料都非常不明,使用版本各不相同,极易踩坑,自己写完后就总结一下,与诸位共勉。

(一)首先,明确需求:

做一个可重复拖拽生成的表格设计器,效果图如下:

(二)搭一个基本的可互相拖拽的框架(1)在终端使用npm命令下载插件npm i -S vuedraggable@next//导入import draggable from 'vuedraggable'(2)拖拽插件大致可分为两种使用方式——分组拖拽与单组拖拽

单组拖拽为只有一组数据,而拖拽是交换此组数据内部的位置,如下图所示:

而互相拖拽是有两组数据,两组数据可以各自内部换顺序,可以相互拖拽到对方的数组中。

本文需求只用到了互相拖拽,互相拖拽的代码形式如下:

//需要克隆的数据,A组<draggable :list="dragList" ghost-class="ghost" :force-fallback="true" :group="{ name: 'list', pull: 'clone' }":sort="false" itemKey="id"><template #item="{ element }"><div class="item move"><label class="move">{{ element.name }}</label></div></template></draggable>//拖拽的结果,B组<draggable :list="widgetList" ghost-class="ghost" itemKey="id" :force-fallback="true" group="list" :fallback-class="true":fallback-on-body="true"><template #item="{ element }"><div class="item move"><label class="move">{{ element.name }}</label></div></template></draggable><script lang="ts" setup>import draggable from 'vuedraggable'interface type {name: string,id: number}const dragList: type[] = reactive<type[]>([{ name: "单行文本", id: 1 },{ name: "多行文本", id: 2 },{ name: "计数器", id: 3 },{ name: "单选框组", id: 4 },])const widgetList = reactive<type[]>([{ name: "多行文本", id: 2 },])

draggable的一些常用的属性我作了整理,方便根据不同的需求取用,可核对表格填写:

属性说明类型是否必填

group

如果是分组拖拽,可通过设置group的name来实现分类。

pull属性代表拖出,put为拖入,

:group="{ name :'list',pull : true, put: false }"

代表这个分组与其他name为list的分组可实现分组拖拽,此分组允许拖出,不允许拖入,pull为‘clone’则代表clone模式,pull与put可写可不写,默认值都为true

Object / string

(分组拖拽时必填)

list

绑定的数据

Array

sort

是否开启排序功能,默认为true,如果设置为false,它所在组无法排序

Boolean

force-fallback

默认false,忽略HTML5的拖拽行为,因为h5里有个属性也是可以拖动,你要自定义ghostClass chosenClass dragClass样式时,建议forceFallback设置为true

Boolean

(设置ghost-class或drag-class时为必填)

vue3使用拖拽组件draggable.next的使用教程【保姆级】(vue3 拖拽)

ghost-class

:ghostClass=“ghostClass” 设置拖动元素的占位符类名,可以将拖动时的元素设置为不同的样式。自定义样式可能需要加!important才能生效,并把forceFallback属性设置成true。

String

disabled

是否禁用,默认false

Boolean

drag-class

:drag-class="dragClass"拖动元素的样式,你的自定义样式可能需要加!important才能生效,并把forceFallback属性设置成true

Boolean

item-key

每个元素唯一的标识,建议使用id

itemKey='id',注意,此处无需写成变量形式

String

(不填也能运行,但控制台会报警告)

到现在为止,这已经是个互相拖拽的组件了。

(3)如果发现自己写的组件 不能进行拖拽,或者网页上不显示组件 ,或者出现红色报错信息,则检查以下注意点 :

group中name是否一致,group为变量,需要 :group =‘{name:'' }’的形式

AB组的元素要实现互相拖拽,元素的数据结构必须完全一致,如果不放心,可以使用interface来定义一个类型诸如 interface itemType { name : string , id:number }

AB组绑定的数组是否为响应式,如非响应式,会发生拖拽成功,但不能及时响应的情况,可以用这个方法自检-->先进行拖拽,然后在代码的html部分随便加个东西,然后保存,观察网页上是否显示刚才拖拽的内容,如果出现,那就是数组非响应式的问题。

改正:const arr = reactive<itemType[]>([ { name : 'name ' , id : 1 } ])

在新版vue3中,item插槽是必写的部分,不能使用v-for循环替代。

<draggable>    <template #item="{ element }"><div class="item move"><label class="move">{{ element.name }}</label></div></template></draggable>

item插槽中只允许有一个子元素,此处有个坑,就是如果有两个子元素,但注释掉了一个,也会报错。哪怕实际上这只有一个子元素。

//正确的<template #item="{ element }"><div class="item move"><label class="move">{{ element.name }}</label></div></template>//会报错的情况!<template #item="{ element }">    <!-- <div class="class"></div> --><div class="item move"><label class="move">{{ element.name }}</label></div></template>

到此为止,已经实现拖拽成功。有些人可能会碰到这个问题————如果B组为空,向B组内拖第一个组件的时候,会出现拖拽困难,只能往拖拽区的最顶部拖才能成功 / 根本无法拖拽成功。

原因:因为B组的draggable渲染时为一个高度为auto的div,当前组如果为空,高度也为0,可拖拽区就会变得很小或不存在。

解决方法:为B组的draggable设计高度,具体代码为添加类名,在css中设置

<draggable :list="widgetList" ghost-class="ghost" itemKey="id" :force-fallback="true" group="list" :fallback-class="true":fallback-on-body="true" class="drag-content"><template #item="{ element }"><div class="item move"><label class="move">{{ element.name }}</label></div></template></draggable><style lang="less" scoped>    .drag-content {        height:500px; //建议是外层嵌套一层div,div固定高,此处再设为100%    }</style>(三)将拖拽后的内容替换为element组件/其它指定内容

我们发现,拖拽后显示的内容可自由定义,在B组的draggable中设置

此时,我们需要完善dragList的数组结构,来映射拖拽后所形成的不同组件

(在组件少的情况下可以这么做)

interface itemType {name: string,id: number,  element:string}const dragList: type[] = reactive<type[]>([{ name: "单行文本", id: 1, element: 'Input' },{ name: "多行文本", id: 2, element: 'Textarea' },{ name: "计数器", id: 3, element: 'InputNumber' },{ name: "单选框组", id: 4, element: 'Radio' },])const widgetList = reactive<type[]>([])// A组<draggable :list="dragList" ghost-class="ghost" :force-fallback="true" :group="{ name: 'list', pull: 'clone' }":sort="false" itemKey="id"><template #item="{ element }"><div class="item move"><label class="move">{{ element.name }}</label></div></template></draggable>// B组<draggable :list="widgetList" ghost-class="ghost" itemKey="id" :force-fallback="true" group="list":fallback-class="true" :fallback-on-body="true" class="drag-content"><template #item="{ element }"><div class="item move"><label class="move title">{{ element.name }}</label><div> <el-input v-model="input" placeholder="Please input" v-if="element.element === 'input'" /></div><div><el-input v-model="textarea" :rows="2" type="textarea" placeholder="Please input"v-if="element.element === 'textarea'" /> </div></div></template></draggable>

点击控件拖过去,就可以实现如下的效果,如果不想要标题,可以把label部分去掉,其他控件如法炮制即可:

在组件数量少的时候,可以这么做,但数量多时,建议使用component标签来映射

(1)先更改一下文件的结构 (2)写一个公共的函数去返回当前widgets文件夹下的所有文件// getWidget.tsconst gets = {} as anyconst modules = import.meta.glob('./*.vue', {eager:true})for (let each in modules) {const name = (modules[each] as any).default.__namegets[name] = (modules[each] as any).default}console.log(gets);export default gets

也可使用globEager方法,编译器会报错:函数已经弃用,不过不影响使用。

(3)分别把每个组件的部分写好// Input.vue<template><div><el-input v-model="input" placeholder="Please input" /></div></template><script lang="ts" setup>const input=ref('')</script><style lang="less" scoped></style>(4)使用component标签映射<draggable :list="widgetList" ghost-class="ghost" itemKey="id" :force-fallback="true" group="list":fallback-class="true" :fallback-on-body="true" class="drag-content"><template #item="{ element }"><div class="item move"><label class="move title">{{ element.name }}</label><div><component :is="getWidget(element.element)"></component></div></div></template></draggable>// 使用函数映射<script lang="ts" setup>import draggable from 'vuedraggable'//要注意导入import getName from './widgets/getWidget'const getWidget = (name: string) => {//写的时候,组件的起名一定要与dragList中的element名字一模一样,不然会映射不上return getName[name]}(5)最终效果

成功实现!

本文链接地址:https://www.jiuchutong.com/zhishi/298669.html 转载请保留说明!

上一篇:Vue3安装配置、开发环境搭建(组件安装卸载)(图文详细)(vue3安装配置)

下一篇:【JavaScript数据结构与算法】字符串类(反转字符串中的单词)(javascript数据类型)

  • 小米手环6女性健康在哪里设置(小米手环6女性健康怎么开启)

    小米手环6女性健康在哪里设置(小米手环6女性健康怎么开启)

  • qq怎么弄情侣空间(qq怎么弄情侣空间不显示)

    qq怎么弄情侣空间(qq怎么弄情侣空间不显示)

  • 华为键盘符号为什么没有特殊符号(华为键盘符号为什么没有数字符号啊)

    华为键盘符号为什么没有特殊符号(华为键盘符号为什么没有数字符号啊)

  • 抖音移除粉丝后会取消对方对我的关注吗(抖音移除粉丝后怎么恢复粉丝)

    抖音移除粉丝后会取消对方对我的关注吗(抖音移除粉丝后怎么恢复粉丝)

  • i3 3240 cpu哪一年的(i3 3240什么时候出的)

    i3 3240 cpu哪一年的(i3 3240什么时候出的)

  • 小米蓝牙耳机可以连接苹果用吗(小米蓝牙耳机可以定位吗)

    小米蓝牙耳机可以连接苹果用吗(小米蓝牙耳机可以定位吗)

  • 5g手机支持4g网络吗(5g手机也支持4g网络吗)

    5g手机支持4g网络吗(5g手机也支持4g网络吗)

  • 编辑栏中的公式栏中显示的是(编辑栏中的公式怎么用)

    编辑栏中的公式栏中显示的是(编辑栏中的公式怎么用)

  • 苹果摄像头后压是什么意思(苹果摄像头后压5倍什么意思)

    苹果摄像头后压是什么意思(苹果摄像头后压5倍什么意思)

  • 怎么知道自己qq密码是什么(怎么知道自己qq注册时间)

    怎么知道自己qq密码是什么(怎么知道自己qq注册时间)

  • 苹果手机视频压缩失败无法发送怎么办(苹果手机视频压缩失败怎么回事)

    苹果手机视频压缩失败无法发送怎么办(苹果手机视频压缩失败怎么回事)

  • 小米盒子4se参数(小米盒子4se硬件参数)

    小米盒子4se参数(小米盒子4se硬件参数)

  • word2010底纹图案样式怎么设置(word2010底纹图案样式设置为20%)

    word2010底纹图案样式怎么设置(word2010底纹图案样式设置为20%)

  • 天猫u先试用在哪里(天猫u先试用划算吗)

    天猫u先试用在哪里(天猫u先试用划算吗)

  • vivox20美颜怎么设置(vivo手机美颜功能设置)

    vivox20美颜怎么设置(vivo手机美颜功能设置)

  • 计算机中数据编码最小单位是(计算机中数据编码是什么)

    计算机中数据编码最小单位是(计算机中数据编码是什么)

  • cmiitid后面的日期是什么

    cmiitid后面的日期是什么

  • 华为自带日历怎么更新(华为自带日历怎么恢复显示一个月)

    华为自带日历怎么更新(华为自带日历怎么恢复显示一个月)

  • 怎么把空白页删掉(怎么把空白页删掉docx)

    怎么把空白页删掉(怎么把空白页删掉docx)

  • 关坝保护地需要多少能量(关坝自然保护区)

    关坝保护地需要多少能量(关坝自然保护区)

  • p30怎样关闭息屏指纹显示(华为p30取消灭屏显示时间怎么设置)

    p30怎样关闭息屏指纹显示(华为p30取消灭屏显示时间怎么设置)

  • oppor9s用户体验计划在哪里(oppor9s功能介绍)

    oppor9s用户体验计划在哪里(oppor9s功能介绍)

  • xshare设备是什么(share 设备)

    xshare设备是什么(share 设备)

  • 腾讯大王卡预存款咋花(腾讯大王卡预存多少钱)

    腾讯大王卡预存款咋花(腾讯大王卡预存多少钱)

  • 微信链接怎么群发(微信链接怎么群发消息给多人)

    微信链接怎么群发(微信链接怎么群发消息给多人)

  • issch.exe是什么进程?issch.exe是不是病毒?(isass是什么程序)

    issch.exe是什么进程?issch.exe是不是病毒?(isass是什么程序)

  • 从零开始的「校园商铺」毕设全栈开发—开题报告(从零开始吧)

    从零开始的「校园商铺」毕设全栈开发—开题报告(从零开始吧)

  • python中delattr可以删除对象方法(python del语法)

    python中delattr可以删除对象方法(python del语法)

  • 销售软件系统退货怎么退
  • 企业所得税的账户设置
  • 企业奖金会计分录
  • 餐饮服务需要缴纳增值税吗
  • 报税软件费用可以退吗
  • 怎么强调各个分公司之间无直接联系
  • 增值税一般纳税人是什么意思
  • 一般纳税人如何抵扣进项税
  • 医院销售药品是干嘛的
  • 分月计提利息会计分录
  • 企业收到政府补助要交税吗
  • 管家婆进货单科目名称怎么录入?
  • 利润表的企业所得税怎么查询
  • 银行缴纳印花税的范围
  • 所得税为负值是什么意思
  • 建筑业的发票
  • 施工服务费税率9%
  • 托儿所幼儿园卫生保健工作规范2022
  • 交叉持股的合并财务报表
  • 租赁合同印花税怎么交,一年一次吗
  • 收到的运输发票要交印花税吗?
  • 营改增后不动产发票样本
  • 污水处理费谁来收
  • 怎么计算附加税税率
  • 王者荣耀电脑版操作
  • 应收账款周转天数和应收账款周转率的关系
  • 企业当年实现的净利润
  • 成本转入费用
  • 税盘维护费的账务处理
  • 2021年8月现在还能去武汉吗
  • pc是什么文件
  • 商业银行提取的贷款损失准备金
  • php docblocker
  • 原材料计入什么凭证
  • 三维重建的主要步骤
  • 电脑找不到应用程序的图标怎么删除
  • yolo v4 v5
  • 代缴社保可以领住房补贴吗
  • pgrep命令作用及含义
  • 管理费用抵消分录
  • python怎么查看文件路径
  • 第三方车主
  • python django做网页
  • mongodb查看数据库大小
  • 超出python用什么
  • 销售费用主要包括哪些
  • 税务企业类型分为哪几种
  • MySQL数据库结构设计图
  • 无形资产的有效期限与法定保护期限相等
  • 长期待摊费用装修费分摊分录
  • 为什么银行结息不加入账户
  • 企业资金如何运动
  • 销售费用进项税抵扣
  • 专票当普票用进项需要转出吗
  • 五险怎么做账
  • win7系统安全在哪
  • vista升级选项灰色
  • ubuntu ftp服务开启
  • centos安装后配置
  • window7 aero
  • 影响电脑速度的因素
  • rapimgr.exe - rapimgr进程是什么文件.有哪些作用
  • 怎么查看自己mac电脑有没有被人使用过
  • 在Linux命令行中快速删除光标前的快捷键是什么?
  • 微信 cookies
  • Intermediate Unity 3D for iOS: Part 1/3
  • Extjs TriggerField在弹出窗口显示不出问题的解决方法
  • python win32print
  • 面向对象实例化
  • Node.js中的包管理工具是什么
  • jquery层级选择器
  • jquery中ajax跨域方法实例分析
  • javascript+
  • python如何安装各种库
  • Metaio in Unity3d 教学--- 一. 搭建环境,运行官方案例
  • python函数判断质数
  • 航天金税盘客服电话苏州
  • 不动产租赁和经营租赁税率是多少
  • 房产税季度缴纳还是月度
  • 津补贴怎么算
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设