Tree 树形控件

何时使用

文件夹、组织架构、生物分类、国家地区等等,世间万物的大多数结构都是树形结构。使用树控件可以完整展现其中的层级关系,并具有展开收起选择等交互功能。

代码演示

基本

最简单的用法,展示可勾选,可选中,禁用,默认展开等功能。

  1. <template>
  2. <v-tree :data="treeData" checkable multiple @select="selectFn" @check="checkFn"></v-tree>
  3. </template>
  4. <script>
  5. export default {
  6. data() {
  7. return {
  8. treeData: [{
  9. title: 'parent 1',
  10. expanded: true,
  11. selected: true,
  12. children: [{
  13. title: 'parent 1-0',
  14. expanded: true,
  15. disabled: true,
  16. children: [{
  17. title: 'leaf',
  18. disableCheckbox: true
  19. }, {
  20. title: 'leaf',
  21. }]
  22. }, {
  23. title: 'parent 1-1',
  24. checked: true,
  25. children: [{
  26. title: "<span style='color: #08c'>sss</span>"
  27. }]
  28. }]
  29. }]
  30. }
  31. },
  32. methods: {
  33. selectFn(data) {
  34. console.log(data);
  35. },
  36. checkFn(data) {
  37. console.log(data);
  38. },
  39. }
  40. }
  41. </script>

拖动示例

将节点拖拽到其他节点内部或前后。

  1. <template>
  2. <v-tree :data="dragData" draggable></v-tree>
  3. </v-tree>
  4. </template>
  5. <script>
  6. export default {
  7. data() {
  8. return {
  9. dragData: [{
  10. title: '0-0',
  11. expanded: true,
  12. children: [{
  13. title: '0-0-0',
  14. expanded: true,
  15. children: [{
  16. title: '0-0-0-0',
  17. }, {
  18. title: '0-0-0-1',
  19. }]
  20. }, {
  21. title: '0-0-1',
  22. children: [{
  23. title: '0-0-1-0'
  24. }]
  25. }]
  26. }, {
  27. title: '0-1',
  28. children: [{
  29. title: '0-1-0'
  30. }, {
  31. title: '0-1-2'
  32. }]
  33. }, {
  34. title: '0-2',
  35. }],
  36. }
  37. }
  38. }
  39. </script>

异步数据加载

点击展开节点,动态加载数据。

  1. <template>
  2. <v-tree :data="asyncData" :async="getData"></v-tree>
  3. </v-tree>
  4. </template>
  5. <script>
  6. export default {
  7. data() {
  8. return {
  9. asyncData: [
  10. { title: 'pNode 01', children: []},
  11. { title: 'pNode 02', children: []},
  12. { title: 'pNode 03'},
  13. ]
  14. }
  15. },
  16. methods: {
  17. getData(node) {
  18. console.log(node);
  19. return new Promise(resolve => {
  20. setTimeout(()=>{
  21. resolve([
  22. { title: `leaf ${node.clue}-0`, children: []},
  23. { title: `leaf ${node.clue}-1`},
  24. { title: `leaf ${node.clue}-2`},
  25. ])
  26. }, 1000)
  27. })
  28. },
  29. }
  30. }
  31. </script>

编辑模式

节点增、删、改

  1. <template>
  2. <v-button-group>
  3. <v-button type="primary" icon="plus-square" @click="addTopNode" title="增加一个顶级节点"></v-button>
  4. <v-button type="primary" icon="edit" :disabled="!selectNode" @click="modalVisible = true" title="编辑节点(改名)"></v-button>
  5. <v-button type="primary" icon="plus" :disabled="!selectNode" @click='addNode' title="插入一个子节点"></v-button>
  6. <v-button type="primary" icon="close" :disabled="!selectNode" @click='delNode' title="删除节点"></v-button>
  7. </v-button-group>
  8. <v-tree :data="editData" @select="select" ref="tree"></v-tree>
  9. <v-modal title="更改名称" :visible="modalVisible" @ok="changeTitle" @cancel="modalVisible = false">
  10. <v-input placeholder="请输入新的名称" v-model="newTitle"></v-input>
  11. </v-modal>
  12. </template>
  13. <script>
  14. export default {
  15. data() {
  16. return {
  17. selectNode: null,
  18. modalVisible: false,
  19. newTitle: '',
  20. editData: [{
  21. title: '0-0',
  22. expanded: true,
  23. children: [{
  24. title: '0-0-0',
  25. expanded: true,
  26. children: [{
  27. title: '0-0-0-0',
  28. }, {
  29. title: '0-0-0-1',
  30. }]
  31. }, {
  32. title: '0-0-1',
  33. children: [{
  34. title: '0-0-1-0'
  35. }]
  36. }]
  37. }, {
  38. title: '0-1',
  39. children: [{
  40. title: '0-1-0'
  41. }, {
  42. title: '0-1-2'
  43. }]
  44. }, {
  45. title: '0-2',
  46. }],
  47. }
  48. },
  49. methods: {
  50. select(selectedNodes) {
  51. this.selectNode = selectedNodes[0];
  52. },
  53. changeTitle() {
  54. if (!this.newTitle) return this.$message.warning('您还未填写新的名称!');
  55. this.$refs.tree.editNode(this.selectNode.clue, { title: this.newTitle });
  56. this.newTitle = '';
  57. this.modalVisible = false;
  58. },
  59. addTopNode() {
  60. this.$refs.tree.addNode('0', {
  61. title: '顶级节点'
  62. });
  63. },
  64. addNode() {
  65. this.$refs.tree.addNode(this.selectNode.clue, {
  66. title: `${this.selectNode.title}的节点`
  67. });
  68. },
  69. delNode() {
  70. this.$refs.tree.delNode(this.selectNode.clue);
  71. }
  72. }
  73. }
  74. </script>

连接线

带连接线的树。

  1. <template>
  2. <v-tree :data="treeData" show-line></v-tree>
  3. </template>
  4. <script>
  5. export default {
  6. data() {
  7. return {
  8. treeData: [{
  9. title: 'parent 1',
  10. expanded: true,
  11. selected: true,
  12. children: [{
  13. title: 'parent 1-0',
  14. expanded: true,
  15. disabled: true,
  16. children: [{
  17. title: 'leaf',
  18. disableCheckbox: true
  19. }, {
  20. title: 'leaf',
  21. }]
  22. }, {
  23. title: 'parent 1-1',
  24. checked: true,
  25. children: [{
  26. title: "<span style='color: #08c'>sss</span>"
  27. }]
  28. }]
  29. }]
  30. }
  31. },
  32. }
  33. </script>

API

Tree Props

参数说明类型默认值
data可嵌套的节点属性的数组,生成tree的数据Array[]
multiple支持点选多个节点Booleanfalse
checkable节点前添加 Checkbox 复选框Booleanfalse
showLine是否展示连接线Booleanfalse
draggable设置节点可拖拽Booleanfalse
canDrop用来判断拖拽时是否能drop的函数,dropPosition的值有-1(插入到目标节点前面),0(插入到目标节点里面),1(插入到目标节点后面)Function(sourceNode, targetNode, dropPosition)() => true
async异步加载数据Function(node)-

Data Props

属性说明类型默认值
disabled禁掉响应Booleanfalse
disableCheckbox禁掉 checkboxBooleanfalse
title标题String/element string'—-'
expanded是否展开子节点Booleanfalse
selected是否选中子节点Booleanfalse
checked是否勾选(如果勾选,子节点也会全部勾选)Booleanfalse
children子节点属性数组(同data)Array-

Tree Methods

方法名说明参数返回值
getCheckedNodes获取被勾选的节点-节点数组
getHalfCheckedNodes获取被半选的节点-节点数组
getSelectedNodes获取被选中的节点-节点数组
editNode编辑某个节点clue, data-
addNode在某个下面增加一个节点clue, data-
delNode删除某个节点clue-

Tree Events

事件说明参数
check点击复选框触发childrenArray
select点击树节点触发childrenArray