一个新的Vue拖拽特性实现:关于拖拽的“调整大小”部分
CabloyJS提供了一个完整的拖拽特性,可以实现移动和调整大小两大功能。这里对resizing的开发进行说明关于moving开发请参考:DragandDrop:MobileDemo开发步骤下面以模块test-party为例说明拖放(resize)的开发步骤请完整源码参考文件src/module/test-party/front/src/kitchen-sink/pages/dragdrop/dragdropResize.vue,这里只说明开发要点1.v-eb-dragdrop使用指令v-eb-dragdrop为需要调整大小的DOM元素添加拖拽功能更多的情况下,我们并不是拖动DOM元素本身,而是拖动DOM元素对应的handle元素
getDragdropContext(resizeDirection){返回{场景:this.dragdropScene,resizable:true,resizeDirection,onDragStart:this.onDragStart,onDragMove:this.onDragMove,onDragEnd:this.onDragEnd,};},我们传递一个拖动的Context对象给v-eb-dragdrop,具体参数如下:namedescriptionsceneapplicationscene,用来隔离不同的拖拽元素组,通常我们使用便捷方法Vue.prototype.$meta.util.nextId('dragdrop')创建一个唯一的值resizable表示这个拖拽是用来调整大小resizeDirection拖拽方向,col/rowonDragStart在拖动开始时触发onDragMove,onDragEnd在拖动行为结束时触发dragevent1.onDragStart在拖动开始时触发我们可以使用这个事件返回一个tooltip消息来给出一个友好的提示onDragStart({$el,context}){constisRow=context.resizeDirection==='行';constsize=this.$view.sizeExtent;const工具提示=isRow?这个高度:这个宽度;返回{大小,工具提示};},参数名称描述$el拖动句柄元素contextdraggingContext对象返回值名称描述size当前拖动元素所属容器的大小,方便精确计算拖动时偏移的百分比。如果不关心移动的百分比信息,size可以返回nulltooltip来拖动元素的提示信息2.onDragMove在拖动时触发onDragMove({$el,context,diff}){constisRow=context.resizeDirection==='行';如果(!isRow){让diffAbs=parseInt(diff.abs.x);如果(diffAbs===0)返回;this.width+=diffAbs;consttooltip=this.width;return{eated:true,tooltip};}else{让diffAbs=parseInt(diff.abs.y);如果(diffAbs===0)返回;this.height+=diffAbs;consttooltip=this.height;return{eated:true,tooltip};}},参数名称描述$eldragginghandleelementcontextdraggingContextobjectdiff拖动时的偏移diff.abs偏移的绝对值表示diff.percent偏移的百分比表示aboutdiff.percent:inInGridlayout,DOM元素通常按百分比排列。如果为这些DOM元素启用了拖放功能来调整大小,那么调整大小也将是一个百分比。可以参考dashboard中组件的拖拽实现。如果要得到准确的diff.percent信息,必须在onDragStart事件中返回Grid布局容器的大小信息返回值名称说明eaten如果传入的当前diffoffset有效,则设置eaten:true,以便重新计算新的diffoffsettooltip拖动元素提示信息关于eaten:在Grid布局中,DOM元素通常是按百分比布局的。而且这些百分比不是连续值。因此,需要拖动一定数量的像素才能被视为有效的百分比变化。这时候我们需要返回eaten:false来通知系统需要累加当前的offset,直到出现可以识别的offset,然后returneaten:true3.onDragEnd在拖动行为结束时触发。如果需要执行清理工作,可以响应这个事件onDragEnd({$el,context}){//donothing},参数名称描述$el拖拽句柄元素上下文拖拽上下文对象