背景
QOA中要求组织架构页面支持数据作为树状图显示,且要求树状图可以横向展示、支持拖动、支持放大缩小、导出图片、如果精力允许支持拖拽调整节点
调研
考虑优先利用现有第三方组件,完成该需求。搜索vue中支持家谱图的组件,找到以下四种:
- vue-tree-chart(由于该组件仅支持纵向展示,需求方提出的功能点都不满足,因此pass)
- vue-org-tree(样式满足hr需求,但是同样需求方提出的功能点都不满足,pass)
- vue-orgchart (基于OrgChart二次封装样式,功能基本满足,但是样式很差,pass)
- OrgChart (功能基本满足,但是样式太丑,pass)
网上找到的解决方案,大都不满足需求本身,其实vue-orgchart 是最贴近需求,但是样式太差只能舍弃,根据该组件的思路,将OrgChart的样式与vue-org-tree功能进行二次封装并发布到公司内部私有仓库中@qd/vue-strong-org-tree
实现原理
1.树形图:渲染机制,利用递归,不再赘述。
2.支持拖动:监听mousedown、touchstart、mouseleave、mouseup、touchend 监听鼠标按下后的拖动的位置,设置容器的matrix3d属性 实现挪动
3.支持缩放:利用 wheel 事件中 deltaY属性(若向下滚动时返回正值,向上滚动时返回负值,否则为0),若返回正直则缩小,否则变大。变大缩小通过设置容器scale属性。
4.支持导出图片:利用html2canvas第三方库,将dom元素专程canvas再导出图片
5.支持拖拽调整节点