使用指南

安装#

# Vue3
npm i --save @he-tree/vue
# Vue2. 仅支持Vue@2.6
npm i --save @he-tree/vue @vue/composition-api
sh

!!! 重要, 使用 Vue2 时,he-tree 在 Vue2.7 下不工作, 你可以复制这个示例文件夹来开始你的项目: https://github.com/phphe/he-tree/tree/dev/examples/example-vue2-no-ts

CDN#

引入#

Vue3#

import { BaseTree, Draggable } from '@he-tree/vue'
import '@he-tree/vue/style/default.css'
ts

Vue2#

import { BaseTree, Draggable } from '@he-tree/vue/vue2'
import '@he-tree/vue/style/default.css'
ts

BaseTree 是基础树组件. Draggable 组件继承于 BaseTree.

示例#

示例项目#

基础#

Projects
Frontend
Vue
Nuxt
React
Next
Angular
Backend
Photos
Videos
查看源码

折叠与勾选框#

Checked: []
Projects
Frontend
Vue
Nuxt
React
Next
Angular
Backend
Photos
Videos
查看源码

仅提供折叠与勾选的逻辑, 你需要通过 Vue 插槽传入你自己的样式代码. 其中stat.checked 有 3 个值:true, false, 0. 0表示子级部分选中, 你可以用其确定半选状态. 当父节点勾选时,所有子节点将被勾选. 当所有子节点勾选时,父节点将被勾选。当部分子节点勾选时,父节点的checked值变为0. 如果你需要其他勾选逻辑,不要死磕checked, 你可以在节点上增加一个其他属性来实现. 相关方法: getChecked, getUnchecked, updateCheck, openAll, closeAll, isVisible.

拖拽#

Projects
Frontend
Vue
Nuxt
React
Next
Angular
Backend
Photos
Videos
查看源码

简单样式 Material Design 和连接线#

Nuxt
Next
Angular
Backend
Photos
Videos
查看源码

节点缩进#

不要用 css 设置节点缩进, 而是用 prop indent.

数据#

数据为树形数据, 不支持平面数据. 平面数据需要你自行转换. 其中键名children可以通过 prop childrenKey修改, text可以通过 prop textKey修改. 例如:

{
  text: 'Root',
  children: [
    {text: 'Child'}
  ]
}
js

数据更新(内部行为)#

可以使用v-model绑定数据. 本组件会复制数据对象作为内部数据. 当内部数据变动时, 例如拖拽时, 有 3 种方式提交新数据到外部. 默认情况下直接修改绑定的数据对象的变动的局部. 通过 prop updateBehavior设置数据提交方式. updateBehavior 的值:

  • modify: 直接修改绑定的数据对象. 例如当一个节点改变时,将修改此节点,而v-model绑定的对象还是原对象。
  • new: 提交一个新的数据对象, 适用于 vuex. v-model绑定的对象将变为新对象。参考下一节的 vuex 例子。
  • disabled: 不提交. 你可以使用getData方法手动生成并获取当前数据.

Vuex 例子#

<template>
  <YourTree v-model="treeData" />
</template>
<script>
  export default {
    computed: {
      treeData: {
        get() {
          return this.$store.state.treeData
        },
        set(value) {
          this.$store.commit('updateTreeData', value)
        },
      },
    },
  }
</script>
vue

数据修改(外部操作)#

绑定的数据对象由外部改变时, 组件内部将会为每一个节点创建stat对象, 用来存储相关信息, 如 open, parent, children, level. 可通过钩子 prop statHandler 在 stat 创建之后修改每一个 stat. 相关 data: stats, statsFlat.

操作数据的方法: getStat, has, updateCheck, getChecked, getUnchecked, openAll, closeAll, openNodeAndParents, isVisible, move, add, addMulti, remove, removeMulti, iterateParent, getSiblings, getData.

Material Design (预置样式)#

代码和演示。库预置了简单样式,Material Design 风格。通过如下步骤启用:

  • 引入 css
    import '@he-tree/vue/style/default.css'
    import '@he-tree/vue/style/material-design.css'
    
    js
  • 添加 css 名:mtl-tree
    <Draggable class="mtl-tree" v-model="treeData" />
    
    html
  • 库包含一个折叠图标组件OpenIcon, 你可以使用它作为你的折叠图标。material-design.css包含一个简单的勾选框样式mtl-checkbox, 你可以添加到勾选框上美化它。代码和演示

Tree Line (连接线)#

代码和演示。使用 prop treeLine 启用它,使用 prop treeLineOffset 设置位移。此功能在表格模式下无效。

Tree Line 的样式可以通过 css 类控制。例如:

  • tree-line: 可以设置 Tree Line 的颜色。
    .your-tree .tree-line {
      background: red;
    }
    
    css
  • tree-vline: 可以设置 Tree Line 竖线的颜色,宽度。
    .your-tree .tree-vline {
      background: red;
      width: 1px;
    }
    
    css
  • tree-hline: 可以设置 Tree Line 横线的颜色,宽度。
    .your-tree .tree-hline {
      background: red;
      height: 1px;
      width: 10px;
    }
    
    css

虚拟列表#

Projects
Frontend
Vue
Nuxt
React
Next
Angular
Backend
Photos
Videos
Node-983
Node-822
Node-372
Node-094
Node-581
Node-433
Node-912
Node-867
Node-193
Node-892
Node-109
Node-122
查看源码

使用虚拟列表时需要给树或其父元素设置高度, 否则会自动扩展高度为最大. 相关 props: virtualization, virtualizationPrerenderCount

虚拟列表由我的另一个库virtual-list实现. virtual-list.

遍历树形数据#

使用walkTreeData方法遍历树形数据。

// Vue3
import { walkTreeData } from '@he-tree/vue'
// Vue2
import { walkTreeData } from '@he-tree/vue/vue2'

walkTreeData(node, (node, index, parent) => {}, {
  childrenKey: 'children',
  reverse: false,
  childFirst: false,
})
js

树形数据示例, childrenKey必须正确:

let treeData1 = { a: 1, children: [{ b: 1 }] }
let treeData2 = [{ a: 1, children: [{ b: 1 }] }, { c: 1 }]
let treeData3 = { a: 1, sub: [{ b: 1 }] }
js

详细类型:

declare function walkTreeData<T extends Object>(
  obj: T | T[],
  handler: WalkTreeDataHandler<T>,
  opt?: WalkTreeDataOptions
): void
declare type WalkTreeDataHandler<T> = (
  node: T,
  index: number,
  parent: T | null,
  path: TreeDataPath
) => void | false | 'skip children' | 'skip siblings'
declare type WalkTreeDataOptions = {
  childrenKey?: string
  reverse?: boolean
  childFirst?: boolean
}
ts

WalkTreeDataHandler 返回不同的值的效果:

  • false: 停止遍历
  • skip children: 跳过当前节点的子节点
  • skip siblings: 跳过当前节点的同级节点
  • 其他值: 无影响

WalkTreeDataOptions:

  • childrenKey: 树形数据子节点的key, 默认是children.
  • reverse: 遍历节点数组时,从后往前遍历。
  • childFirst: 先遍历子节点。

例子,寻找所有 2 级节点:

let results = []
walkTreeData(tree.rootChildren, (stat) => {
  if (stat.level === 2) {
    results.push(stat)
    return `skip children`
  }
})
js

默认展开所有节点#

相关 props: defaultOpen

从右到左显示#

相关 props: rtl

从下到上显示#

相关 props: btt

Angular
Next
React
Nuxt
Vue
Frontend
Projects
查看源码

渲染为表格#

actionTextLevel
Projects1
Frontend2
Vue3
Nuxt4
React3
Next4
Angular3
Backend2
Photos1
Videos1
actionTextLevel
查看源码

支持虚拟列表与表格同时工作. 相关 props: table. 通过插槽 prepend, append 添加表头和表底部. 表格拖拽为高级功能, 需购买pro启用.

拖拽相关#

自定义触发拖拽的元素#

相关 props: triggerClass

拖拽控制/可拖拽/可拖放#

可通过节点stat控制每个节点. 也可通过钩子函数控制. 相关 props: disableDrag, disableDrop, eachDraggable, eachDroppable, rootDroppable, maxLevel

拖拽时限制最大层数/深度#

相关 props: maxLevel

拖拽到节点上时打开该节点#

当把节点拖动到一个折叠节点上时, 默认会打开此节点以便拖入其中. 可通过 prop dragOpen控制. 可通过 prop dragOpenDelay设置等待时间. 钩子 prop: beforeDragOpen

占位元素#

表示拖拽时的可放置区域。拖拽时, 会生成一个元素默认淡蓝色背景, 用以标识可放置的位置. 使用插槽placeholder控制它, 例如添加提示文字.

拖拽时, 如果离开树, 占位元素将会被删掉, 如果此时停止拖拽, 树将恢复原状. 通过 prop keepPlaceholder可使占位元素在拖拽结束前一直保留.

占位元素有类: drag-placeholder. 可以使用这个类名自定义它的样式。

拖拽时相关信息#

拖拽时相关信息不在事件或钩子函数的参数里, 而是暴露为一个对象 dragContext.

// vue3
import { dragContext } from '@he-tree/vue'
// vue2
import { dragContext } from '@he-tree/vue/vue2'
ts

外部拖入#

外部拖入指外部的信息通过 Drag and Drop API 拖入树内. 可以通过钩子 props: onExternalDragOver, externalDataHandler 处理这一情况. 以此可实现与任何组件通过 Drag and Drop API 互通.

触摸 & 移动设备#

此组件基于 HTML5 Drag and Drop API, 所以在支持 Drag and Drop API 到移动设备上也能工作. 如果不支持, 可以尝试使设备兼容 Drag and Drop API 的库.

注意: 触摸时, 用户需要触摸并等一会儿才能触发拖拽。

水印#

此项默认关闭。 此组件会在浏览器控制台输出一条水印信息. 可使用 prop watermark关闭.

Pro#

pro 有以下高级功能.

  • 跨树拖拽.

  • 拖拽开始时克隆原节点而不是移动原节点.

  • 可拖拽表格.

    详情请点击.