两天前,客户方提出了便捷工作台的需求,通俗点来说,可通过拖拽、增减等操作,将菜单拖入到想放置的模块中,同时可对大模块拖拽排序,最终以配置的模块或菜单,在首页进行展示。该需求,实现逻辑上其实很简单明了,无非是确定拖拽区域,拖拽对象,按照一定规则操作菜单,但在大的功能做完之后,遗留了一些小的bug,这些小bug容易让人遗漏。因此,在这里记录一下。
目前项目适用框架:vue2+ant-design-vue
拖拽组件:vuedraggable
弹窗采用ant-design提供的模态框组件去封装,同时根据业务需求,接入vuedraggable组件。这里代码比较简单,直接贴图,具体实现不做赘述。
如何处理:监听弹窗元素滚动开始start方法,在该方法中,将根元素滚动属性隐藏,对弹窗滚动结束end方法监听,恢复根元素的滚动属性。
start() {// 防止拖动时,滚动穿透document.getElementById('app').style.overflow = 'hidden'
},
end() {document.getElementById('app').style.overflow = ''
},
如何处理:vue只有当组件内容获取样式发生改变之后,才会重新进行渲染,因此我们可以为组件设置key属性,key内容为当前时间值,由于时间值随时在改变,因此vue会重新渲染。
如何处理:根据vuedraggable文档描述,可以设置handle属性,该属性中定义拖拽的元素,可以为需要退拽的区域dom设置该属性。
如何处理:首先将模块与菜单元素分层,内部菜单之间可拖动,设置group值为menu,外层模块元素区域,设置另外的group属性为module,通过group区别,来控制不同的拖拽分组。
{{ item.modelName }}
{{ element.benchName }}-
如何处理:vuedraggable文档提供了scrollSensitivity属性,用于描述拖拽距离滚动区域多远时,滚动条滚动。给draggable设置该属性,可以处理该问题。
如何处理:利用内外两层div包裹,通过css控制滚动区域,外层div滚动属性设置为hidden,内层利用position:fixed固定区域,同时设置overflow属性,这里要这与,如果想要隐藏浏览器的原生滚动条,需要设置内层区域高度或宽度高于外层区域。
如何处理:使用flex的column排序,解决不了该问题。只能通过writing-mode来处理。flex根元素设置writing-mode为vertical-lr,表示元素会从上到下垂直排列,其次flex子元素div上,设置writing-mode为horizontal-tb,表示该元素将水平从左到右排列,同时一定要设置子元素的flex宽度,使用50%将行划分为两行。