使用指南
安装#
# Vue3
npm i --save @he-tree/vue
# Vue2. 仅支持Vue@2.6
npm i --save @he-tree/vue @vue/composition-api
!!! 重要, 使用 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'
Vue2#
import { BaseTree, Draggable } from '@he-tree/vue/vue2'
import '@he-tree/vue/style/default.css'
BaseTree
是基础树组件. Draggable
组件继承于 BaseTree
.
示例#
示例项目#
基础#
折叠与勾选框#
仅提供折叠与勾选的逻辑, 你需要通过 Vue 插槽传入你自己的样式代码. 其中stat.checked
有 3 个值:true, false, 0
. 0
表示子级部分选中, 你可以用其确定半选状态. 当父节点勾选时,所有子节点将被勾选. 当所有子节点勾选时,父节点将被勾选。当部分子节点勾选时,父节点的checked
值变为0
. 如果你需要其他勾选逻辑,不要死磕checked
, 你可以在节点上增加一个其他属性来实现. 相关方法: getChecked, getUnchecked, updateCheck, openAll, closeAll, isVisible.
拖拽#
简单样式 Material Design 和连接线#
节点缩进#
不要用 css 设置节点缩进, 而是用 prop indent.
数据#
数据为树形数据, 不支持平面数据. 平面数据需要你自行转换. 其中键名children
可以通过 prop childrenKey修改, text
可以通过 prop textKey修改. 例如:
{
text: 'Root',
children: [
{text: 'Child'}
]
}
数据更新(内部行为)#
可以使用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>
数据修改(外部操作)#
绑定的数据对象由外部改变时, 组件内部将会为每一个节点创建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; }
csstree-vline
: 可以设置 Tree Line 竖线的颜色,宽度。.your-tree .tree-vline { background: red; width: 1px; }
csstree-hline
: 可以设置 Tree Line 横线的颜色,宽度。.your-tree .tree-hline { background: red; height: 1px; width: 10px; }
css
虚拟列表#
使用虚拟列表时需要给树或其父元素设置高度, 否则会自动扩展高度为最大. 相关 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,
})
树形数据示例, childrenKey
必须正确:
let treeData1 = { a: 1, children: [{ b: 1 }] }
let treeData2 = [{ a: 1, children: [{ b: 1 }] }, { c: 1 }]
let treeData3 = { a: 1, sub: [{ b: 1 }] }
详细类型:
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
}
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`
}
})
默认展开所有节点#
相关 props: defaultOpen
从右到左显示#
相关 props: rtl
从下到上显示#
相关 props: btt
渲染为表格#
action | Text | Level |
---|---|---|
Projects | 1 | |
Frontend | 2 | |
Vue | 3 | |
Nuxt | 4 | |
React | 3 | |
Next | 4 | |
Angular | 3 | |
Backend | 2 | |
Photos | 1 | |
Videos | 1 | |
action | Text | Level |
支持虚拟列表与表格同时工作. 相关 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'
外部拖入#
外部拖入指外部的信息通过 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 有以下高级功能.
跨树拖拽.
拖拽开始时克隆原节点而不是移动原节点.
可拖拽表格.
详情请点击.