1小时搞定卡片拖拽、自动排列交换位置、拖拽数据存取

Wesley13
• 阅读 534

**1小时搞定卡片拖拽、自动排列交换位置、拖拽数据存取 **首先演示一下最终效果

流畅的拖动和交换位置效果,并实时更新数据

1小时搞定卡片拖拽、自动排列交换位置、拖拽数据存取

支持组件的样式和内容自定义

1小时搞定卡片拖拽、自动排列交换位置、拖拽数据存取

这是这次系列文章的第一篇,我自己封装了一个用vue实现的拖拽排列卡片组件,并且发布到npm,详细地记录下来了整体制作过程。总共有三篇文章,介绍组件的制作思路和遇到的问题,以及在发布到npm上并下载使用的过程中,发生了什么问题并如何解决。

  • 第一篇为组件封装后的使用文档及介绍

  • 第二篇为组件的实现思路以及细节

  • 第三篇为将组件打包并上传至npm,如何实现按需加载和下载后使用的问题(鸽了)

这是vue实现的拖动卡片组件,主要实现了

  • 拖动卡片与其他卡片的位置更换,并且其他卡片根据拖动的位置自动顺移,位置数据实时更新

  • 拖动的时候可使用鼠标滚动

  • 卡片根据数据生成,所有参数和内容都是可以自定义的,方便应用于不同场景

  • 不同操作的事件都可获取到,拖动后的位置数据会实时更新

  • 可以全局安装和按需加载


如何使用?

下载carddragger

npm install carddragger

当前稳定版本:0.3.6,更新于10月24日早上11点

全局安装

在你vue项目的入口js文件中使用,vue-cli生成的项目一般为main.js文件

import {installCardDragger} from'carddragger'

按需加载

在组件中直接import

import { cardDragger } from'carddragger'

使用示例

1.基础使用:

<template>

2.完整示例:
参照源码仓库中的examples
将整个项目clone下来,npm install+npm run serve即可看到完整示例

Props(参数)

属性

说明

类型

默认值

data

必填,需要传入的卡片数据,具体格式请看下方解释

Array

-

colNum

卡片排列的列数

Number

2

cardOutsideWidth

卡片外部需要占据的宽度(包括无内容部分)

Number

590

cardOutsideHeight

卡片外部需要占据的高度(包括无内容部分)

Number

380

cardInsideWidth

卡片的宽度

Number

560

cardInsideHeight

卡片的高度

Number

320

data格式示例:

卡片的内容根据data数据生成或自定义

<template>

属性

说明

类型

默认值

id

必填,设置卡片的id作为唯一识别

String

-

positionNum

必填,设置卡片位置,从1开始依次递增

Number

-

name

选填,设置卡片的标题名称

String

'默认标题'

componentData

选填,设置卡片的内容为组件数据,如果此参数具有数据的话,则slot传入的数据失效

组件

-


Slot(插槽)

首先先介绍一下,卡片内容分为上下两部分:

  • 上部分为卡片的标题栏,并且拖拽事件只有点击上部分才触发

  • 下部分为卡片的内容

两个部分都是可以进行自定义内容及样式的。若不添加的自定义内容的话,标题栏和内容都是默认背景为白色,显示data中的name。若添加了自定义内容则背景需要自己设置。

标题栏插槽

<cardDragger:data="cardList" >

内容插槽

<cardDragger:data="cardList">

你也可以

<cardDragger :data="cardList">

关于内容我做了另外一个判断,你可以将需要的组件放在data的componentData属性里面,内容会自动读取componentData的数据。当然你直接都使用slot就可以忽略这个属性。

import exampleChild1 from"./childComponent/exampleChild1"

渲染优先级:data的componentData > slot > 默认内容


Events(事件)

startDrag

作用
在点击卡片顶部标题栏的时候,触发此函数

参数
startDrag(event,id)

第一个参数event,是点击事件的原生event
第二个参数id,是选中的卡片的id

swicthPosition

作用
在拖动一个卡片到另外一个卡片的位置的时候,触发此事件

参数
swicthPosition(oldPositon,newPositon,originItem)

第一个参数oldPositon,是卡片原来的位置号码
第二个参数newPositon,是卡片需要交换的位置号码
第三个参数originItem,是卡片交换完成后的数据

finishDrag

作用
拖拽完成松开鼠标后,触发此事件

参数
swicthPosition(oldPositon,newPositon,originItem)

第一个参数oldPositon,是卡片原来的位置号码
第二个参数newPositon,是卡片需要交换的位置号码
第三个参数originItem,是卡片交换完成后的数据


考虑修复的问题

1.data的positionNum出现空缺则会报错,必须从1依次递增。但好像这种场景也不常用,考虑修复ing。

未来计划

  • 如果有需要的话我再封装个react版本

  • 修改其他需要的参数和进行扩展

觉得这个系列有点意思的话,点个赞支持一下呗!

源自:https://juejin.im/post/5da53e29e51d457822796ed8

声明:文章著作权归作者所有,如有侵权,请联系小编删除。

感谢 · 转发欢迎大家留言

1小时搞定卡片拖拽、自动排列交换位置、拖拽数据存取

本文分享自微信公众号 - web前端学习圈(web-xxq)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Easter79 Easter79
3年前
swap空间的增减方法
(1)增大swap空间去激活swap交换区:swapoff v /dev/vg00/lvswap扩展交换lv:lvextend L 10G /dev/vg00/lvswap重新生成swap交换区:mkswap /dev/vg00/lvswap激活新生成的交换区:swapon v /dev/vg00/lvswap
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
3个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Stella981 Stella981
3年前
KaliTools说明书+BurpSuit实战指南+SQL注入知识库+国外渗透报告
!(https://oscimg.oschina.net/oscnet/d1c876a571bb41a7942dd9752f68632e.gif"15254461546.gif")0X00KaliLinux Tools中文说明书!(https://oscimg.oschina.net/oscnet/
Wesley13 Wesley13
3年前
MySQL总结(十一)子查询
!(https://oscimg.oschina.net/oscnet/upa344f41e81d3568e3310b5da00c57ced8ea.png)子查询1\.什么是子查询需求:查询开发部中有哪些员工selectfromemp;通
Stella981 Stella981
3年前
Android蓝牙连接汽车OBD设备
//设备连接public class BluetoothConnect implements Runnable {    private static final UUID CONNECT_UUID  UUID.fromString("0000110100001000800000805F9B34FB");
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
9个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这