-
Notifications
You must be signed in to change notification settings - Fork 2
- 支持复选框
- 可异步加载
- 拖放操作
- 右键菜单
- 按钮
- 自定义外观
npm
npm install @tinywisp/vue-tree --save
import the library
import VueTree from '@tinywisp/vue-tree'
usage
<template>
<div id="app">
<vue-tree :tree="tree" ref="tree" class="tree" />
</div>
</template>
<script>
import VueTree from '@tinywisp/vue-tree'
export default {
name: 'App',
components: {
VueTree
},
data() {
return {
tree: [
{
id: 1,
title: 'ROOT',
hasChild: true,
children: [
{
id: 2,
title: 'child 1',
},
{
id: 3,
title: 'child 2',
hasChild: true,
children: [
{
id: 4,
title: 'child 2-1'
},
{
id: 5,
title: 'child 2-2'
},
{
id: 6,
title: 'child 2-3'
}
],
},
{
id: 7,
title: 'child 3'
},
{
id: 8,
title: 'child 4'
}
]
}
]
}
}
}
</script>
<style scoped>
.tree {
width: 200px;
height: 300px;
}
</style>点击此处 查看对vue2的支持
| 属性 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| tree | Array | [] | 树的结点数据 |
| defaultAttrs | Object | {} | 结点默认属性 |
| checkboxLinkage | Boolean | true | 选中取消复选框时,是否对他的父结点或子结点进行联动操作 |
| dragImageOffsetX | String | 20px | 拖动结点时,缩略图相对于鼠标的水平位置偏移 |
| dragImageOffsetY | String | 10px | 拖动结点时,缩略图相对于鼠标的垂直位置偏移 |
| enableDragNodeOut | Boolean | false | 允许将结点拖到树的外面 |
| enableDropExternalElement | Boolean | false | 允许将树外部的元素拖拽到树上 |
| enableTouchSupport | Boolean | false | 允许触屏上用手指进行拖拽操作 |
| dropToMove | Boolean | true | 拖和放都在一棵树中的时候,默认此拖放操作为移动结点 |
| treeId | String | 空串 | 在多棵树之前做拖拽操作时,用于识别拖动的结点来源于哪棵树 详情 |
| animationDuration | String | 0.5s | 动画效果的展示时间,为0则取消动画效果 |
| autoReload | Boolean | true | 监测tree属性的变化,如果有变化,则自动重新加载数据 |
| multiSelect | Boolean | false | 是否可多选 |
| pressEnterToBlur | Boolean | true | 在编辑标题时,按下回车键后,是否使输入框失去焦点 |
| fnLoadData | Function(node) | null | 加载数据的回调函数。返回结点数组,或者返回一个promise,该promise成功时的值为结点数组 |
| fnIsDroppable | Function(dragAndDrop) | null | 拖放操作时判断当前是否可放下拖动中的元素 |
| fnBeforeDrag | Function(node) | null | 开始拖动元素时调用,返回false则停止拖放操作,返回true则继续 |
| fnBeforeCheck | Function(node) | null | 点击选中复选框时调用,返回false则停止选中复选框,返回true则继续 |
| fnBeforeUncheck | Function(node) | null | 点击取消复选框时调用,返回false则停止取消复选框,返回true则继续 |
| fnBeforeSelect | Function(node) | null | 点击选中某个结点时调用,返回false则停止选中结点,返回true则继续 |
| fnBeforeExpand | Function(node) | null | 展开目录时调用,返回false则停止展开,返回true则继续 |
| fnBeforeCollpase | Function(node) | null | 折叠目录时调用,返回false则停止折叠,返回true则继续 |
| fnBeforeContextMenu | Function(node, event) | null | 展示右键菜单时调用,返回false则停止展示菜单,返回true则继续 |
| fnBeforeDrop | Function(dragAndDrop) | null | 用户拖动结点到某个合适的位置后放开鼠标按键时调用,返回false,则停止移动结点到此位置,返回true则继续 |
| fnAfterCalculate | Function(node) | null | 计算结点属性时调用。可用来自定义计算结点的属性。 |
| fnCustomClasses | Function(node) | null | 为结点增加自定义样式类。当此方法返回一个class名称数组时,会为结点增加相应的class |
| 事件 | 说明 |
|---|---|
| rename (node, node.title, title) | 修改结点标题 |
| edit (node) | 编辑结点标题 |
| quitedit (node) | 退出编辑结点编题 |
| focus (node, event) | 编辑结点标题时,输入框获得焦点 |
| blur (node, event) | 编辑结点标题时,输入框失去焦点 |
| input (node, event) | 编辑结点标题时,有文字输入 |
| keydown (node, event) | 编辑结点标题时,有按键按下 |
| keyup (node, event) | 编辑结点标题时,有按键释放 |
| keypress (node, event) | 编辑结点标题时,按键按下 |
| deselect (node) | 取消选择结点 |
| select (node) | 选中结点 |
| expand (node) | 展开一个目录结点 |
| collapse (node) | 折叠一个目录结点 |
| click (node) | 点击结点 |
| create (node) | 添加子结点 |
| remove (node) | 删除结点 |
| move (node, fromParent, fromPos, toParent, toPos) | 移动结点 |
| checkboxstatechange (node, oldState, state) | 复选框状态变化 |
| check (node) | 复选框选中 |
| uncheck (node) | 复选框取消 |
| dragstart (dragAndDrop) | 开始拖动 |
| dragover (dragAndDrop) | 拖放操作时,鼠标在某个结点上移动 |
| dragenter (dragAndDrop, node) | 拖放操作时,鼠标进入某个结点 |
| dragleave (dragAndDrop, node) | 拖放操作时,鼠标离开某个结点 |
| dragend (dragAndDrop) | 结束拖放操作 |
| dragentertree(dragAndDrop) | 拖放操作时,鼠标/手指从树的外面移动到树的内部 |
| dragleavetree(dragAndDrop) | 拖放操作时,鼠标/手指从树的内部区域来到树的外面 |
| 方法 | 说明 |
|---|---|
| reload() | 重新加载组件的tree属性中的数据 一般情况下,不推荐直接修改tree属性中的数据。 推荐调用create,remove,move,setTitle等方法修改数据 |
| traverse(fnDoSomething) | 遍历所有结点 |
| getNestedTree | 获取树,以嵌套形式返回所有结点 |
| getFlatTree | 获取树,返回一个包含所有结点的扁平数组 |
| getById(id) | 根据id获取结点, 不存在则返回null |
| getSelected() | 获取选中的结点数组 |
| getSelectedOne() | 获取选中的第一个结点 |
| setAttr(node, key, val) setAttr(node, key, subKey, val) |
设置结点属性 |
| getAttr(node, key) getAttr(node, key, subKey) |
获取结点属性 |
| setTitle(node, title) | 设置结点标题 |
| edit(node) | 使结点进入编辑模式 |
| quitEdit(node) | 使结点退出编缉模式 |
| getTitleElement(node) | 获取结点的DOM元素 |
| focus(node) | 编辑模式时,使输入框获得焦点 |
| blur(node) | 编辑模式时,使输入框失去焦点 |
| deselect(node) | 取消结点的选中状态 |
| select(node) | 选中结点 |
| hideContextMenuOnDisplay() | 隐藏正在显示的右键菜单 |
| create(node, parentNode, pos) create(node, parentNode) |
为某结点添加子结点。 不传入pos参数时,将结点添加在末尾。 |
| createAndEdit(node, parentNode, pos) create(node, parentNode) |
添加结点后并编辑该结点的标题,用法跟create一样。 |
| remove(node) | 删除结点 |
| move(node, toParent, toPos) move(node, toParent) |
移动结点。 不传入toPos参数时,把结点放到末尾的位置。 |
| search(keyword, fnMatch) search(keyword) |
搜索树,并返回符合条件的结点。 详情 |
| sort(node, recursive, fnCompare) sort(node, recursive) |
排序。详情 |
| clearSearchResult() | 清除搜索结果 |
| expand(node) | 展开目录结点 |
| expandAncestors(node) | 展开某个结点的所有祖先结点 |
| collapse(node) | 折參目录结点 |
| getElement() | 获取结点的DOM元素 |
| getOffset(node) | 获得结点的像素位置 |
| setCheckboxState(node, state) | 设置复选框状态 |
| check(node) | 选中复选框 |
| uncheck(node) | 取消复选框 |
| toggleCheckbox(node) | 选中或消取复选框 |
| getChecked() | 获取复选框为选中的结点 |
| getUndetermined() | 获取复选框状态不明确的目录结点 |
| getUnchecked() | 获取复选框未被选中的结点 |
| toggleDirectoryState(node) | 展开/折叠目录结点 |
| isTheTouchOperationFromTheTree(event) | 判断一个触屏操作是否是从某棵树上开始的 |
| getDragFrom() | 获取当前拖拽操作的来源 返回数据结构如 {treeId: 'leftTree', nodeId: 3} |
__.xxx属性由组件自动生成及维护,用户可以读取,但最好不要手动修改这些属性
| 属性 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| id | mixed | 唯一标识 | |
| title | String | 标题 | |
| hasChild | Boolean | false | 是否有子结点 |
| children | Array | [] | 子结点 |
| directoryState | String | expanded | 目录结点状态。枚举值:expanded, collapsed, loading |
| selected | Boolean | false | 是否处于选中状态 |
| checkbox.show | Boolean | false | 是否显示复选框 |
| checkbox.disable | Boolean | false | 是否禁用复选框 |
| checkbox.state | String | unchecked | 复选框状态。枚举值: checked, unchecked, undetermined |
| style.height | String | 2em | 结点高度。如"2em" |
| style.indent | String | 20px | 相对于父结点的缩进。如"20px" |
| style.fontSize | String | 12px | 字符尺寸。如“12px” |
| style.hoverBgColor | String | #e7f4f9 | 鼠标移动经过该结点时的背景色 |
| style.selectedBgColor | String | #e7f4f9 | 选中时的背景色 |
| style.switcherMarginRight | String | 0.1em | 为文件夹状态图标(折叠展开加载中)设置css的margin-right属性 |
| style.iconMarginRight | String | 0.5em | 为icon设置css的margin-right属性 |
| style.checkboxMarginRight | String | 0.1em | 为checkbox设置css的margin-right属性 |
| style.extraFloatRight | Boolean | false | 是否使插槽extra浮动到右端(设置css属性float:right) |
| style.extraAlwaysVisible | Boolean | false | 是否使插槽extra的内容总是显示,而不仅仅是在鼠标滑过时显示 |
| style.titleMaxWidth | String | none | 为title设置最大宽度。详情 |
| style.titleOverflow | String | clip | 为title设置text-overflow属性。 如果希望标题超过宽度后显示省略号,设为ellipsis。 注意一下: css属性text-overflow可以自定义一些字符串, 但在这里有可能会出现浏览器兼容性问题。 |
| style.showIcon | Boolean | true | 是否显示图标 |
| style.showSwitcher | Boolean | true | 是否显示文件夹折叠/展开图标 |
| __.parent | Object | 父结点 | |
| __.path | Array | 祖先结点数组 | |
| __.pos | Number | 位置。 在父结点下的位置序号 | |
| __.gpos | Number | 全局位置 | |
| __.dpos | Number | 在显示出来的结点中的位置。 如果某目录结点折叠,则其所有子结点及后裔结点该属性的值为-1 |
|
| __.depth | Number | 深度 | |
| __.isVisible | Boolean | 是否可见。折叠隐藏的结点为false | |
| __.isEditing | Boolean | false | 是否正在编辑标题 |
| __.isSearchResult | Boolean | false | 是否是搜索结果 |
| __.isDroppable | Boolean | true | 拖放操作时,是否可放下 |
| __.dragOverArea | String | null | 拖放操作时,鼠标在该结点上的位置。枚举值: prev, self, next, null |
| __.mousex | String | 0 | 拖放操作时鼠标的位置 |
| __.mousey | String | 0 | 拖放操作时鼠标的位置 |
| __.titleMaxWidth | String | none | 标题的最大宽度。 它是根据style.titleMaxWidth计算而得 |
| __.titleTip | String | 鼠标放到标题上显示的提示 当前的使用场合: 标题超过最大宽度后显示省略号, 鼠标放上去显示标题全文 |
|
| __.customClasses | Array | [] | 加到结点上的自定义CSS类名 |
| 属性 | 类型 | 说明 |
|---|---|---|
| status | Number | 拖拽操作的类型 0: 当前无拖拽操作 1: 用户将树的结点拖到树的外面 2: 用户拖动树的结点,在树的区域内 3: 用户将外部元素拖拽到树的区域内 |
| dragNode | Object | 拖动的结点 |
| overNode | Object | 拖拽操作时,当前鼠标在哪个结点上 |
| overArea | String | 拖拽操作时,鼠标在当前结点上的位置。枚举值: prev, self, next, null |
| isDroppable | Boolean | 是否可放下 |
| isTouch | Boolean | 是否触屏操作 |
| from | Object | 拖拽操作的来源。 页面上有多棵树时,将A树的结点拖动到B树,则在B树的一些事件中, from则表明了拖拽的结点来自哪棵树哪个结点, 其数据如下所示: {treeId: 'leftTree', nodeId: 3}。 |
插槽主要是用于自定义外观
| 名称 | 变量 | 说明 |
|---|---|---|
| switcher | node | 展开折叠目录及异步加载数据时的那个图标 |
| icon | node | 图标 |
| checkbox | node | 复选框 |
| title | node | 标题 |
| input | node | 编辑标题时的输入框 |
| extra | node | 额外内容。可用来实现按钮功能 |
| contextmenu | node | 右键菜单 |
| drag-image | dnd | 拖动结点时,跟随鼠标移动的图形。dnd见前面的dragAndDrop |
| drag-arrow | dnd | 拖动结点时,显示在结点标题左边的小箭头。dnd见前面的dragAndDrop |
功能: 添加结点
原型: create(node, parentNode, pos), create(node, parentNode)
参数:
| 名称 | 类型 | 说明 |
|---|---|---|
| node | Object | 要添加的结点 |
| parentNode | Object|null | 父结点 |
| pos | Number | 位置 可选参数 如果不提供这个参数,则将结点添加为parentNode的最后一个结点 |
功能: 移动结点
原型: move(node, toParent, toPos), move(node, toParent)
参数:
| 名称 | 类型 | 说明 |
|---|---|---|
| node | Object | |
| toParent | Object|null | |
| toPos | Number | 位置 可选参数 如果不提供这个参数,则将结点移动为toParent的最后一个结点 |
功能:搜索树,并返回符合条件的结点。
原型:search(keyword, fnMatch), search(keyword)
参数:
| 名称 | 类型 | 说明 |
|---|---|---|
| keyword | any | 关键词。类型由用户自己决定。 |
| fnMatch | function(node, keyword) | 回调函数,用于判断该结点是否匹配该关键词。 返回一个布尔值,true则匹配。 |
如果fnMatch为空且keyword为String类型,则按结点的标题判断是否匹配。
功能:排序
原型:sort(node, recursive, fnCompare), sort(node, recursive)
参数:
| 名称 | 类型 | 说明 |
|---|---|---|
| node | Object | 排序的结点为该node的子结点。 node=null,则排序深度为1的结点。 |
| recursive | Boolean | 是否递归 |
| fnCompare | function(node1, node2) | 回调函数,用于比较两个结点,返回值为一个整数: 正值,则表示node1排在node2前面 负值,则表示node1排在node2后面 0, 则表示不交换node1, node2的位置 |
如果不传入fnCompare参数,则按结点的标题排序
说明: 设置标题的最大宽度,它的值有两种情况:
- 正值,如"3px", "2em", "20%"等等,它跟css属性max-width是一个意思。
- 负值,如"-3px", "-2em", "-20%"等等。此时它表示标题的最大长度不能超过距离树容器右边缘的某个位置。
比如说,如果值为"-20%",则表示在距离树容器右边框20%的位置,标题的最大长度不能超过这个地方。
说明: 当需要在多棵树之间做拖拽操作时,此ID用于标识所操作的结点的来源。
在用户刚拖动树的结点时,组件会执行event.dataTransfer.setData('vue-tree', data)
data是一个JSON串,其格式为:
{
"treeId": "xxxxx",
"nodeId": "xxxxx"
}这样在监听到拖放操作相关的事件时,可以使用event.dataTransfer.getData('vue-tree')来获取结点的数据,知道结点是来源于哪棵树及结点的ID。
使用组件的defaultAttrs属性。
<vue-tree :tree="tree" :defaultAttrs="{style:{titleMaxWidth: '3em'}}"></vue-tree>这里表示所有结点的style.titleMaxWidth属性被设置为3em。
优先级: 树的结点数据 > defaultAttrs
比如下面的代码的效果是:
id为5的结点的style.titleMaxWidth为5em, 其余的结点的style.titleMaxWidth为3em。
树的结点数据:
[
{
id: 1,
title: 'ROOT',
hasChild: true,
children: [
{
id: 2,
title: 'child 1',
},
{
id: 3,
title: 'child 2',
hasChild: true,
children: [
{
id: 4,
title: 'child 2-1'
},
{
id: 5,
title: 'child 2-2',
style: {
titleMaxWidth: '5em'
}
},
{
id: 6,
title: 'child 2-3'
}
],
},
{
id: 7,
title: 'child 3'
},
{
id: 8,
title: 'child 4'
}
]
}
]模板:
<vue-tree :tree="tree" :defaultAttrs="{style:{titleMaxWidth: '3em'}}"></vue-tree>- MIT
- 无论个人还是公司,都可以免费自由使用
在该组件中以及各示例中使用的图标来自:

