当前位置:   article > 正文

详解树状结构图 vue-org-tree

vue-org-tree

前言

最近公司项目(Vue + Element )需求有用到 tree ,所以呢我去网上找了很多插件,都不是很符合我的要求。最后在GitHub上面找到了一款插件是 iview 的组织结构树  vue-org-tree ,但是由于文档不是特别易懂,自己踩了很多坑。不过定制性特别高,基本上会用到的方法都有了。所以今天来给大家讲解下。

安装

NPM

  1. # use npm
  2. npm i vue2-org-tree
  3. # use yarn
  4. yarn add vue2-org-tree

安装 loader

温馨提示:不安装less-loader基本上都会报错

npm install --save-dev less less-loader

Import Plugins

  1. import Vue from 'vue'
  2. import Vue2OrgTree from 'vue2-org-tree'
  3. Vue.use(Vue2OrgTree)

CDN

  1. # css
  2. <link href="https://unpkg.com/vue2-org-tree@1.1.0/dist/style.css">
  3. # js
  4. <script src="https://unpkg.com/vue@2.5.17/dist/vue.js"></script>
  5. <script src="https://unpkg.com/vue2-org-tree@1.1.0/dist/index.js"></script>

简单起步

严老湿这边呢,就直接使用Vue-cli起步了,vue-org-tree 安装成功之后,我们就直接使用了,在Vue页面或者组件中使用vue2-org-tree 标签,动态绑定data

基本创建

<vue2-org-tree :data="data"/>

data数据放入页面中

id 每个元素不同的ID ,label为name, children为自己的子集数据

  1. data: {
  2. id: 0,
  3. label: "XXX科技有限公司",
  4. children: [
  5. {
  6. id: 2,
  7. label: "产品研发部",
  8. children: [
  9. {
  10. id: 5,
  11. label: "研发-前端"
  12. },
  13. {
  14. id: 6,
  15. label: "研发-后端"
  16. },
  17. {
  18. id: 9,
  19. label: "UI设计"
  20. },
  21. {
  22. id: 10,
  23. label: "产品经理"
  24. }
  25. ]
  26. },
  27. {
  28. id: 3,
  29. label: "销售部",
  30. children: [
  31. {
  32. id: 7,
  33. label: "销售一部"
  34. },
  35. {
  36. id: 8,
  37. label: "销售二部"
  38. }
  39. ]
  40. },
  41. {
  42. id: 4,
  43. label: "财务部"
  44. },
  45. {
  46. id: 9,
  47. label: "HR人事"
  48. }
  49. ]
  50. }

效果图:


排列方式

刚刚我们看到的是默认排列方式 ,其实还有一种排列方式,我们一起来看看

水平排列

horizontal  是水平排列方式,我们来实践一下吧,它的参数是truefalse

  1. <vue2-org-tree
  2.     :data="data"
  3. :horizontal="true"
  4. />

看看效果如何:


修改背景色

使用 label-class-name  我们还可以动态绑定自定义class

  1. <vue2-org-tree
  2.     :data="data"
  3. :horizontal="true"
  4. :label-class-name="labelClassName"
  5. />

我们一起来尝试一下吧!

js:

  1. data() {
  2. return {
  3. labelClassName:"bg-color-orange"
  4. }
  5. }

css:

  1. .bg-color-orange{
  2. color: #fff;
  3. background-color: orange;
  4. }

    看看效果图

折叠展示

折叠展示效果

  1. <vue2-org-tree
  2.     :data="data"
  3. :horizontal="true"
  4. :label-class-name="labelClassName"
  5. collapsable
  6. />

折叠效果是有了,那么怎么展开呢?

  1. <vue2-org-tree
  2.     :data="data"
  3. :horizontal="true"
  4. :label-class-name="labelClassName"
  5. collapsable
  6.     @on-expand="onExpand"
  7. />

js:

  1. collapse(list) {
  2. var _this = this;
  3. list.forEach(function(child) {
  4. if (child.expand) {
  5. child.expand = false;
  6. }
  7. child.children && _this.collapse(child.children);
  8. });
  9. },
  10. onExpand(e,data) {
  11. if ("expand" in data) {
  12. data.expand = !data.expand;
  13. if (!data.expand && data.children) {
  14. this.collapse(data.children);
  15. }
  16. } else {
  17. this.$set(data, "expand", true);
  18. }
  19. },

请看效果图:

问题又来了,默认展开如何实现?

请看大屏幕

  1. toggleExpand(data, val) {
  2.     var _this = this;
  3. if (Array.isArray(data)) {
  4. data.forEach(function(item) {
  5. _this.$set(item, "expand", val);
  6. if (item.children) {
  7. _this.toggleExpand(item.children, val);
  8. }
  9. });
  10. } else {
  11. this.$set(data, "expand", val);
  12. if (data.children) {
  13. _this.toggleExpand(data.children, val);
  14. }
  15. }
  16. }

在请求完数据之后直接调用,或者生命周期调用,可以自由发挥

第一个参数是你的资源data,第二个参数是全部展开或否

this.toggleExpand(this.data,true)

上效果图:

深入观察

vue2-org-tree 向我们抛出了几个事件,我们先看看有哪些事件

点击事件

on-node-click 就是被抛出的点击事件

  1. <vue2-org-tree
  2. :data="data"
  3. @on-node-click="NodeClick"
  4. />

我们在方法里面写一个NodeClick用来接受点击触发的值

  1. NodeClick(e,data){
  2. console.log(e)
  3. // e 为 event
  4. console.log(data)
  5. // 当前项的所有详情 如:id label children
  6. }

打印结果:

  1. // e 的打印
  2. {
  3. isTrusted: true
  4. screenX: 720
  5. screenY: 308
  6. clientX: 720
  7. clientY: 205
  8. ctrlKey: false
  9. shiftKey: false
  10. altKey: false
  11. metaKey: false
  12. button: 0
  13. buttons: 0
  14. relatedTarget: null
  15. pageX: 720
  16. ......
  17. }
  18. // data的打印
  19. {
  20. id: 2
  21.     label: "产品研发部"
  22.     children: Array(4)
  23. }

移入移出

它还向我们抛出了移入移出事件,返回值与点击事件大致相同

  1. <vue2-org-tree
  2.     :data="data"
  3. :horizontal="true"
  4. :label-class-name="labelClassName"
  5. collapsable
  6.     @on-expand="onExpand"
  7.     @on-node-mouseover="onMouseover"
  8. @on-node-mouseout="onMouseout"
  9. />

拓展移入移出

来了老弟?我们做移入移出,肯定是要有功能的对不对?

每当我们的鼠标移入到小盒子里就出现一个模态框用来展示data内容

  1. <vue2-org-tree
  2.     :data="data"
  3. :horizontal="true"
  4.     name="test"
  5. :label-class-name="labelClassName"
  6.     collapsable
  7.     @on-expand="onExpand"
  8.     @on-node-mouseover="onMouseover"
  9. @on-node-mouseout="onMouseout"
  10. />
  11. <!-- 创建浮窗盒子 -->
  12. <div v-show="BasicSwich" class="floating">
  13. <p>ID:{{BasicInfo.id}}</p>
  14. <p>Name:{{BasicInfo.label}}</p>
  15. </div>

js:

  1. // 声明变量
  2. data() {
  3. return {
  4. BasicSwich:false,
  5. BasicInfo:{id:null,label:null}
  6. }
  7. }
  8. // 方法
  9. onMouseout(e, data) {
  10. this.BasicSwich = false
  11. },
  12. onMouseover(e, data) {
  13. this.BasicInfo = data;
  14. this.BasicSwich = true;
  15. var floating = document.getElementsByClassName('floating')[0];
  16. floating.style.left = e.clientX +'px';
  17. floating.style.top = e.clientY+'px';
  18. },

css:

  1. /* 盒子css */
  2. .floating{
  3. background: rgba(0, 0, 0, 0.7);
  4. width: 160px;
  5. height: 100px;
  6. position: absolute;
  7. color: #fff;
  8. padding-top: 15px;
  9. border-radius: 15px;
  10. padding-left: 15px;
  11. box-sizing: border-box;
  12. left:0;
  13. top: 0;
  14. transition: all 0.3s;
  15.     z-index: 999;
  16.     text-align: left;
  17.     font-size: 12px;
  18. }

上效果图:

API

props

propdescriptontypedefault
data
Object
propsconfigure propsObject{label: 'label', children: 'children', expand: 'expand'}
labelWidthnode label widthString | Numberauto
collapsablechildren node is collapsableBooleantrue
renderContenthow to render node labelFunction-
labelClassNamenode label classFunction | String-
selectedKeyThe key of the selected nodeString-
selectedClassNameThe className of the selected nodeFunction | String-

events

event namedescriptontype
clickClick eventFunction
mouseoveronMouseOver eventFunction
mouseoutonMouseOut eventFunction
  • Call events

on-expand

鼠标点击时调用它。

  • params e Event

  • params data Current node data

on-node-click

well be called when the node-label clicked

  • params e Event

  • params data Current node data

on-node-mouseover

当鼠标悬停时调用它。

  • params e Event

  • params data Current node data

on-node-mouseout

当鼠标离开时调用它。

  • params e Event

  • params data Current node data

总结

最后附上Git地址:https://github.com/CrazyMrYan/vue2-org-tree

预览地址:http://crazy.lovemysoul.vip/gitdemo/vue2-org-tree

关注“悲伤日记”更多精彩文章

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读