bootstrap树节点如何设置默认不展开_我开源了一个基于Vue的组织架构树组件

开门见山

Demo 演示地址:http://www.longstudy.club/vue...

github 地址:https://github.com/qq44924588...

项目背景

因为最近公司需要做一个OKR,OKR 里面有个对齐视图,是一个数型结构,如下图所示:

v2-e2d3d4e2e443a698ec487347c36060ba_b.jpg

就拿我 小智 来说,如果有人对齐我的 KR 就放到我的右边,如果是我对齐了谁的 KR,就放到我的左边,类似一个上下级的关系,所以这里我用两棵树来表示左边与右边的关系。

在GitHub上找了半天,这类组件不多,也没有符合业务需求的组件,所以决定自己造轮子!

分析

  • 既然是树,那么每个节点都应该是相同的组件
  • 节点下面套节点,所以节点组件应该是一个递归组件
  • 整棵树应该有一个全局的状态,用来管理从外部传入的值以及向外部提供的属性和方法。
  • 每相树节点应该也要有一个对应的节点状态,来管理节点自身属性和方法。

实现思路

递归组件

对于递归组件,Vue 官方文档是这样说的:

组件在它的模板内可以递归地调用自己。不过,只有当它有 name 选项时才可以这么做。

这里我用 OkrTreeNode.vue 来表示树的节点,里面是这样用递归,下面是该组件简定:

<template>
  <OkrTreeNode
    v-for="child in leftChildNodes"
    :node="child"
  ></OkrTreeNode>
</template>

export default {
  name: 'OkrTreeNode'
}

递归组件的使用需要注意的两点是组件里面要有组件name 以及结束递归的条件。

树的状态

对于树的状态,我用一个 TreeStore 类来表示,该实现方式主要是参考 ElementUI 中的 tree 组件。TreeStore 中的属性就表示我外部传入的 pros 或者 attr 或者 事件和方法,都在这个对象里面管理,具体的代码可以看这里:

https://github.com/qq44924588...

节点的状态

对于节点的状态,我用一个 Node 对象来表示,具体的代码可以看下面这个地址,这里就不展开说了:

https://github.com/qq44924588...

Demo 演示

基础用法

基础的树形结构展示,默认方式垂直方向。

v2-1c2f8454c9ee594876a14e1cbe049332_b.jpg

水平方向

direction 属性设置为 horizontal 就可以展示水平方向。

v2-edfbab4e68473b5c618febd1e5f9dea4_b.jpg

节点是否可被展开

节点可被展开,默认是不展开,通过show-collapsable设置节点可被展开。

v2-cc91a83f90c548e0b09a6b4c3c4f3276_b.jpg

节点默认全部展开

通过设置 default-expand-all 默认展开所有节点,该参数只有在 show-collapsabletrue 时有效

v2-b1337bab9e7780ffdc9abb418641aedf_b.jpg

可将 Tree 的某些节点设置为默认展开

v2-73f943066de743ba6beb3a74887c556d_b.jpg

通过 default-expanded-keys 设置默认展开的节点。需要注意的是,此时必须设置 node-key ,其值为节点数据中的一个字段名,该字段在整棵树中是唯一的。

节点的样式

可自行设置节点的默认样式和选中的样式。

通过 label-class-name 设置节点的样式,支持字符和函数方式。通过 current-lable-class-name 设置当前节点选中的样式,支持字符和函数方式。

v2-85cbf34a02a813f027c936da8f88223f_b.jpg

节点自定义内容

可自行设置节点内容。通过 render-content 渲染节点内容。

v2-abe1672f2ca5383778ad0c643a893732_b.jpg

OKR 展示模式

该模式的出现,是为了实现跟飞书OKR 展示的视图一样效果,所以在 Tree 的模式下,扩展成左右两棵子树。
该模式必须设置 onlyBothTree ,以及通过 leftData表示左子数的结构。

v2-2d65c45eaa1592a56dde36d1bac5f5d2_b.jpg

OKR 展示模式之自定义节点内容

与上常规 Tree 一样,我们也可以通过自定义渲染函数来制定节点的内容。

通过 render-content 渲染节点内容,通过返回 node 中的 isLeftChild 判断是否是左边的树。

v2-ef84c00772177ddc7a70d6c5a208132d_b.jpg

节点过滤(不可展开)及支持的方法

通过关键字过滤树节点,在需要对节点进行过滤时,调用 Tree 实例的 filter 方法,参数为关键字。需要注意的是,此时需要设置 filter-node-method ,值为过滤函数。

v2-7b2c6ec384946291fb8264719ac0329e_b.jpg

节点过滤(可被展开)

通过关键字过滤树节点,在需要对节点进行过滤时,调用 Tree 实例的 filter 方法,参数为关键字。需要注意的是,此时需要设置 filter-node-method ,值为过滤函数。

v2-11a9dc81b36bcdcc8e71385baa4317e0_b.jpg

支持的事件(不可展开)

不可展开时支持的事件有 节点点击 和 鼠标右键点击。

v2-967163274aa0bfa1e115d7d09a33329b_b.jpg

支持的事件(可被展开)

可展开时支持的事件有 节点点击、鼠标右键点击,节点的展开以及节点的关闭。

v2-81cf31d86a7a5ceaceacd446e22c6602_b.jpg

Attributes

参数说明类型可选值默认值

v2-624e6ba95b76ca015689db63ccab5c62_b.jpg

v2-74179cacb414a8b6f41c197954dd6986_b.jpg

v2-086377666bbaf60dc9ab4e80e3018d17_b.jpg

v2-a9baadfc94ccc132bef2d5c2086355f3_b.jpg

props

参数说明类型可选值默认值

v2-c150e379856807dc5d0578ff9e2142e2_b.jpg

Events

事件名称说明回调参数

v2-7bee844f1363fc2d44ea84cbade2a3f2_b.jpg

方法

方法名说明回调参数

v2-59d89e03c6c6b2a39f5f296a40e8e3ed_b.jpg

v2-3cb4d045d1ab43eed86e1bd681398eae_b.jpg

浏览器支持情况

Modern browsers and Internet Explorer 10+.

如果你觉得还不错的话,还请帮忙在 github 上给个 star,如果你觉得哪些需要优化的可以到 github 上提个 PR。

2020年,web前端还好找工作吗?​www.zhihu.com
作者:前端小智
链接: https:// segmentfault.com/a/1190 000037765135
来源:segmentfault
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处