一个全新的Vue拖拽特性实现:“调整尺寸”部分
关于拖拽
CabloyJS提供了完备的拖拽特性,可以实现移动和调整尺寸两大类功能,这里对调整尺寸的开发进行阐述
关于
移动的开发,请参见:拖拽:移动
演示

开发步骤
下面以模块test-party为例,说明拖拽(调整尺寸)的开发步骤
完整源码请参见文件src/module/test-party/front/src/kitchen-sink/pages/dragdrop/dragdropResize.vue,这里只说明开发要点
1. v-eb-dragdrop
通过directive v-eb-dragdrop向需要实现调整尺寸的DOM元素附加拖拽特性
更多情况下,我们并不是拖拽DOM元素本身,而是拖拽与DOM元素相对应的手柄元素
<div class="test-dragdrop-resize-element" :style="{width:width+'px',height:height+'px'}">
<span class="resize-handler-col" v-eb-dragdrop="getDragdropContext('col')"></span>
<span class="resize-handler-row" v-eb-dragdrop="getDragdropContext('row')"></span>
</div>
getDragdropContext(resizeDirection) {
return {
scene: this.dragdropScene,
resizable: true,
resizeDirection,
onDragStart: this.onDragStart,
onDragMove: this.onDragMove,
onDragEnd: this.onDragEnd,
};
},
我们向v-eb-dragdrop传入一个拖拽Context对象,具体参数如下:
| 名称 | 说明 |
|---|---|
| scene | 应用场景,用于隔离不同的拖拽元素组,通常我们使用便捷方法Vue.prototype.$meta.util.nextId('dragdrop')创建一个唯一值 |
| resizable | 标明此拖拽是用于调整尺寸 |
| resizeDirection | 拖拽方向,col/row |
| onDragStart | 当启动拖拽时激发 |
| onDragMove | 当拖动时激发 |
| onDragEnd | 当拖拽行为结束时激发 |
拖拽事件
1. onDragStart
当启动拖拽时激发。我们可以通过此事件返回一个tooltip信息,进行友好的提示
onDragStart({ $el, context }) {
const isRow = context.resizeDirection === 'row';
const size = this.$view.sizeExtent;
const tooltip = isRow ? this.height : this.width;
return { size, tooltip };
},
- 参数
| 名称 | 说明 |
|---|---|
| $el | 拖拽手柄元素 |
| context | 拖拽Context对象 |
- 返回值
| 名称 | 说明 |
|---|---|
| size | 当前拖拽元素所属容器的尺寸,当拖动时便于准确计算偏移量的百分比。如果不关心移动的百分比信息,size可以返回null |
| tooltip | 拖拽元素的提示信息 |
2. onDragMove
当拖动时激发
onDragMove({ $el, context, diff }) {
const isRow = context.resizeDirection === 'row';
if (!isRow) {
let diffAbs = parseInt(diff.abs.x);
if (diffAbs === 0) return;
this.width += diffAbs;
const tooltip = this.width;
return { eaten: true, tooltip };
} else {
let diffAbs = parseInt(diff.abs.y);
if (diffAbs === 0) return;
this.height += diffAbs;
const tooltip = this.height;
return { eaten: true, tooltip };
}
},
- 参数
| 名称 | 说明 |
|---|---|
| $el | 拖拽手柄元素 |
| context | 拖拽Context对象 |
| diff | 拖动时的偏移量 |
| diff.abs | 偏移量的绝对值表示 |
| diff.percent | 偏移量的百分比表示 |
关于
diff.percent:
- 在Grid布局中,往往通过百分比来布局DOM元素。如果给这些DOM元素启用拖放特性来调整尺寸,那么调整的尺寸也将是百分比。可以参考
仪表盘中部件的拖放实现- 如果要得到准确的
diff.percent信息,必须在事件onDragStart中返回Grid布局容器的size信息
- 返回值
| 名称 | 说明 |
|---|---|
| eaten | 如果当前传入的diff偏移量有效,就设置eaten:true,从而重新计算新的diff偏移量 |
| tooltip | 拖拽元素的提示信息 |
关于
eaten:
- 在Grid布局中,往往通过百分比来布局DOM元素。而这些百分比不是连续值。因此,需要拖动一定的像素才认为是一个有效的百分比变更。这时,我们就需要返回
eaten:false,告知系统当前的偏移量需要累积,直到一个认可的偏移量出现,然后再返回eaten:true
3. onDragEnd
当拖拽行为结束时激发。如果需要执行清理工作,可以响应此事件
onDragEnd({ $el, context }) {
// do nothing
},
- 参数
| 名称 | 说明 |
|---|---|
| $el | 拖拽手柄元素 |
| context | 拖拽Context对象 |
一个全新的Vue拖拽特性实现:“调整尺寸”部分的更多相关文章
- 一个全新的Vue拖拽特性实现:“移动”部分
关于拖拽 CabloyJS提供了完备的拖拽特性,可以实现移动和调整尺寸两大类功能,这里对移动的开发进行阐述 关于调整尺寸的开发,请参见:拖拽:调整尺寸 演示 开发步骤 下面以模块test-party为 ...
- Vue拖拽组件
vue开发公众号项目,***产品需要添加一个新的功能.拖拽功能.一听简单.百度上轮子挺多,直接拉一个过来用着就行.然鹅...兴奋之余,却失望至极.东西很多,没有一个能使得.你让我失望,那我就让你绝望. ...
- vue拖拽组件开发
vue拖拽组件开发 创建临时vue项目 先查看node和npm版本,怎么安装就不多多bb了 再安装vue-cli npm install vue-cli -g //全局安装 vue-cli 检测是否安 ...
- 每天一个JavaScript实例-html5拖拽
<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...
- jQuery 学习笔记3 点击弹出一个div并允许拖拽移动
这里我看了下http://qings.blog.51cto.com/4857138/998878/ 的文章,感谢他的分享. 首先我们有一个a标签和一个div,div默认是不显示的,当用户点击时改为显示 ...
- 使用TypeScript给Vue 3.0写一个指令实现组件拖拽
最近在用vue3重构后台的一个功能.一个弹窗组件,弹出一个表单.然后点击提交. 早上运维突然跑过来问我,为啥弹窗挡住了下边的表格的数据,我添加的时候,都没法对照表格来看了.你必须给我解决一下. 我参考 ...
- vue2-dragula vue拖拽组件
https://github.com/kristianmandrup/vue2-dragula git 地址 https://github.com/kristianmandrup/vue2-dragu ...
- Vue.Draggable:基于 Sortable.js 的 Vue 拖拽组件使用中遇到的问题
Sortable.js 介绍 https://segmentfault.com/a/1190000008209715 项目中遇到的问题: A - 我需要在项目的拖拽组件中,使用背景 1 - 想到的第一 ...
- Vue 拖拽组件 vuedraggable 和 vue-dragging
一.描述 之前用 vue 写过一个在线的多二维码生成服务,体验地址:https://postbird.gitee.io/vue-online-qrcode/ 后面发现二维码多了之后有时候想要排序,需要 ...
随机推荐
- spring总览
Spring 概述 1. 什么是spring? Spring 是个java企业级应用的开源开发框架.Spring主要用来开发Java应用,但是有些扩展是针对构建J2EE平台的web应用.Spring ...
- QT-图标设置
记录一下怎么在QT里添加图片,包括exe图标和里面使用的其他图片. 注意这个图片是指ico后缀的图片,去网上搜就有了,一大堆. 随便找的一个在线转换,http://www.bitbug.net/ 新建 ...
- Java学习day22
今天跟着视频学习了JScroll面板,图片按钮以及单多选框 这是一个图片按钮程序 很多网站还有软件的图标兼容按钮的功能,如果只有button是无法实现该功能的这时候就需要使用到图标按钮 文本框没有办法 ...
- vue3组合式API
vue3组合式API 为什么要用组合式API,我们来看看它是如何解决vue2的局限性的 1.vue2的局限性 当组件内容越来越多,逻辑越来越复杂,可读性就会降低,并且难以维护. vue2组件采用配置式 ...
- vue3 操作修改数据
vue2.x改变数据: <template> <div class="v2"> 这是数据展示: <div v-for=" ...
- 搜索与图论②--宽度优先搜索(BFS)
宽度优先搜索 例题一(献给阿尔吉侬的花束) 阿尔吉侬是一只聪明又慵懒的小白鼠,它最擅长的就是走各种各样的迷宫. 今天它要挑战一个非常大的迷宫,研究员们为了鼓励阿尔吉侬尽快到达终点,就在终点放了一块阿尔 ...
- python基础练习题(题目 斐波那契数列II)
day16 --------------------------------------------------------------- 实例024:斐波那契数列II 题目 有一分数序列:2/1,3 ...
- XCTF练习题---MISC---What-is-this
XCTF练习题---MISC---What-is-this flag:AZADI TOWER 解题步骤: 1.观察题目,下载附件 2.下载后发现是个压缩包,文件内容不清楚,试试改为压缩包看看效果,发现 ...
- 关于Mysql索引的数据结构
索引的数据结构 1.为什么使用索引 概念: 索引是存储索引用于快速找到数据记录的一种数据结构,就好比一本书的目录部分,通过目录中对应的文章的页码,便可以快速定位到需要的文章,Mysql 中也是一样的道 ...
- 基于SqlSugar的数据库访问处理的封装,在.net6框架的Web API上开发应用
我前面几篇随笔介绍了关于几篇关于SqlSugar的基础封装,已经可以直接应用在Winform项目开发上,并且基础接口也通过了单元测试,同时测试通过了一些Winform功能页面:本篇随笔继续深化应用开发 ...