Tree 树形控件

用清晰的层级结构展示信息,可展开或折叠。

基础用法

基础的树形结构展示

Tree 树形控件 - 图1

  1. <template>
  2. <el-tree :data="data" :props="defaultProps" @node-click="handleNodeClick" />
  3. </template>
  4. <script lang="ts" setup>
  5. interface Tree {
  6. label: string
  7. children?: Tree[]
  8. }
  9. const handleNodeClick = (data: Tree) => {
  10. console.log(data)
  11. }
  12. const data: Tree[] = [
  13. {
  14. label: 'Level one 1',
  15. children: [
  16. {
  17. label: 'Level two 1-1',
  18. children: [
  19. {
  20. label: 'Level three 1-1-1',
  21. },
  22. ],
  23. },
  24. ],
  25. },
  26. {
  27. label: 'Level one 2',
  28. children: [
  29. {
  30. label: 'Level two 2-1',
  31. children: [
  32. {
  33. label: 'Level three 2-1-1',
  34. },
  35. ],
  36. },
  37. {
  38. label: 'Level two 2-2',
  39. children: [
  40. {
  41. label: 'Level three 2-2-1',
  42. },
  43. ],
  44. },
  45. ],
  46. },
  47. {
  48. label: 'Level one 3',
  49. children: [
  50. {
  51. label: 'Level two 3-1',
  52. children: [
  53. {
  54. label: 'Level three 3-1-1',
  55. },
  56. ],
  57. },
  58. {
  59. label: 'Level two 3-2',
  60. children: [
  61. {
  62. label: 'Level three 3-2-1',
  63. },
  64. ],
  65. },
  66. ],
  67. },
  68. ]
  69. const defaultProps = {
  70. children: 'children',
  71. label: 'label',
  72. }
  73. </script>

可选择

适用于需要选择层级时使用。

本例还展示了动态加载节点数据的方法。

Tree 树形控件 - 图2

  1. <template>
  2. <el-tree
  3. :props="props"
  4. :load="loadNode"
  5. lazy
  6. show-checkbox
  7. @check-change="handleCheckChange"
  8. />
  9. </template>
  10. <script lang="ts" setup>
  11. import type Node from 'element-plus/es/components/tree/src/model/node'
  12. let count = 1
  13. interface Tree {
  14. name: string
  15. }
  16. const props = {
  17. label: 'name',
  18. children: 'zones',
  19. }
  20. const handleCheckChange = (
  21. data: Tree,
  22. checked: boolean,
  23. indeterminate: boolean
  24. ) => {
  25. console.log(data, checked, indeterminate)
  26. }
  27. const loadNode = (node: Node, resolve: (data: Tree[]) => void) => {
  28. if (node.level === 0) {
  29. return resolve([{ name: 'Root1' }, { name: 'Root2' }])
  30. }
  31. if (node.level > 3) return resolve([])
  32. let hasChild = false
  33. if (node.data.name === 'region1') {
  34. hasChild = true
  35. } else if (node.data.name === 'region2') {
  36. hasChild = false
  37. } else {
  38. hasChild = Math.random() > 0.5
  39. }
  40. setTimeout(() => {
  41. let data: Tree[] = []
  42. if (hasChild) {
  43. data = [
  44. {
  45. name: `zone${count++}`,
  46. },
  47. {
  48. name: `zone${count++}`,
  49. },
  50. ]
  51. } else {
  52. data = []
  53. }
  54. resolve(data)
  55. }, 500)
  56. }
  57. </script>

懒加载自定义叶子节点

由于在点击节点时才进行该层数据的获取,默认情况下 Tree 无法预知某个节点是否为叶子节点, 所以会为每个节点添加一个下拉按钮,如果节点没有下层数据,则点击后下拉按钮会消失。 同时,你也可以提前告知 Tree 某个节点是否为叶子节点,从而避免在叶子节点前渲染下拉按钮。

Tree 树形控件 - 图3

  1. <template>
  2. <el-tree :props="props" :load="loadNode" lazy show-checkbox />
  3. </template>
  4. <script lang="ts" setup>
  5. import type Node from 'element-plus/es/components/tree/src/model/node'
  6. interface Tree {
  7. name: string
  8. leaf?: boolean
  9. }
  10. const props = {
  11. label: 'name',
  12. children: 'zones',
  13. isLeaf: 'leaf',
  14. }
  15. const loadNode = (node: Node, resolve: (data: Tree[]) => void) => {
  16. if (node.level === 0) {
  17. return resolve([{ name: 'region' }])
  18. }
  19. if (node.level > 1) return resolve([])
  20. setTimeout(() => {
  21. const data: Tree[] = [
  22. {
  23. name: 'leaf',
  24. leaf: true,
  25. },
  26. {
  27. name: 'zone',
  28. },
  29. ]
  30. resolve(data)
  31. }, 500)
  32. }
  33. </script>

禁用复选框

节点的复选框可以设置为禁用。

在示例中,通过 disabled 设置禁用状态。 相应的复选框已禁用,不能点击。

Tree 树形控件 - 图4

  1. <template>
  2. <el-tree :data="data" :props="defaultProps" show-checkbox />
  3. </template>
  4. <script lang="ts" setup>
  5. const defaultProps = {
  6. children: 'children',
  7. label: 'label',
  8. disabled: 'disabled',
  9. }
  10. const data = [
  11. {
  12. id: 1,
  13. label: 'Level one 1',
  14. children: [
  15. {
  16. id: 3,
  17. label: 'Level two 2-1',
  18. children: [
  19. {
  20. id: 4,
  21. label: 'Level three 3-1-1',
  22. },
  23. {
  24. id: 5,
  25. label: 'Level three 3-1-2',
  26. disabled: true,
  27. },
  28. ],
  29. },
  30. {
  31. id: 2,
  32. label: 'Level two 2-2',
  33. disabled: true,
  34. children: [
  35. {
  36. id: 6,
  37. label: 'Level three 3-2-1',
  38. },
  39. {
  40. id: 7,
  41. label: 'Level three 3-2-2',
  42. disabled: true,
  43. },
  44. ],
  45. },
  46. ],
  47. },
  48. ]
  49. </script>

禁用状态

可将 Tree 的某些节点设置为禁用状态

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

Tree 树形控件 - 图5

  1. <template>
  2. <el-tree
  3. :data="data"
  4. show-checkbox
  5. node-key="id"
  6. :default-expanded-keys="[2, 3]"
  7. :default-checked-keys="[5]"
  8. :props="defaultProps"
  9. />
  10. </template>
  11. <script lang="ts" setup>
  12. const defaultProps = {
  13. children: 'children',
  14. label: 'label',
  15. }
  16. const data = [
  17. {
  18. id: 1,
  19. label: 'Level one 1',
  20. children: [
  21. {
  22. id: 4,
  23. label: 'Level two 1-1',
  24. children: [
  25. {
  26. id: 9,
  27. label: 'Level three 1-1-1',
  28. },
  29. {
  30. id: 10,
  31. label: 'Level three 1-1-2',
  32. },
  33. ],
  34. },
  35. ],
  36. },
  37. {
  38. id: 2,
  39. label: 'Level one 2',
  40. children: [
  41. {
  42. id: 5,
  43. label: 'Level two 2-1',
  44. },
  45. {
  46. id: 6,
  47. label: 'Level two 2-2',
  48. },
  49. ],
  50. },
  51. {
  52. id: 3,
  53. label: 'Level one 3',
  54. children: [
  55. {
  56. id: 7,
  57. label: 'Level two 3-1',
  58. },
  59. {
  60. id: 8,
  61. label: 'Level two 3-2',
  62. },
  63. ],
  64. },
  65. ]
  66. </script>

树节点的选择

本例展示如何获取和设置选中节点。 获取和设置各有两种方式:通过 node 或通过 key。 如果需要通过 key 来获取或设置,则必须设置 node-key

Tree 树形控件 - 图6

  1. <template>
  2. <el-tree
  3. ref="treeRef"
  4. :data="data"
  5. show-checkbox
  6. default-expand-all
  7. node-key="id"
  8. highlight-current
  9. :props="defaultProps"
  10. />
  11. <div class="buttons">
  12. <el-button @click="getCheckedNodes">get by node</el-button>
  13. <el-button @click="getCheckedKeys">get by key</el-button>
  14. <el-button @click="setCheckedNodes">set by node</el-button>
  15. <el-button @click="setCheckedKeys">set by key</el-button>
  16. <el-button @click="resetChecked">reset</el-button>
  17. </div>
  18. </template>
  19. <script lang="ts" setup>
  20. import { ref } from 'vue'
  21. import { ElTree } from 'element-plus'
  22. import type Node from 'element-plus/es/components/tree/src/model/node'
  23. interface Tree {
  24. id: number
  25. label: string
  26. children?: Tree[]
  27. }
  28. const treeRef = ref<InstanceType<typeof ElTree>>()
  29. const getCheckedNodes = () => {
  30. console.log(treeRef.value!.getCheckedNodes(false, false))
  31. }
  32. const getCheckedKeys = () => {
  33. console.log(treeRef.value!.getCheckedKeys(false))
  34. }
  35. const setCheckedNodes = () => {
  36. treeRef.value!.setCheckedNodes(
  37. [
  38. {
  39. id: 5,
  40. label: 'Level two 2-1',
  41. },
  42. {
  43. id: 9,
  44. label: 'Level three 1-1-1',
  45. },
  46. ] as Node[],
  47. false
  48. )
  49. }
  50. const setCheckedKeys = () => {
  51. treeRef.value!.setCheckedKeys([3], false)
  52. }
  53. const resetChecked = () => {
  54. treeRef.value!.setCheckedKeys([], false)
  55. }
  56. const defaultProps = {
  57. children: 'children',
  58. label: 'label',
  59. }
  60. const data: Tree[] = [
  61. {
  62. id: 1,
  63. label: 'Level one 1',
  64. children: [
  65. {
  66. id: 4,
  67. label: 'Level two 1-1',
  68. children: [
  69. {
  70. id: 9,
  71. label: 'Level three 1-1-1',
  72. },
  73. {
  74. id: 10,
  75. label: 'Level three 1-1-2',
  76. },
  77. ],
  78. },
  79. ],
  80. },
  81. {
  82. id: 2,
  83. label: 'Level one 2',
  84. children: [
  85. {
  86. id: 5,
  87. label: 'Level two 2-1',
  88. },
  89. {
  90. id: 6,
  91. label: 'Level two 2-2',
  92. },
  93. ],
  94. },
  95. {
  96. id: 3,
  97. label: 'Level one 3',
  98. children: [
  99. {
  100. id: 7,
  101. label: 'Level two 3-1',
  102. },
  103. {
  104. id: 8,
  105. label: 'Level two 3-2',
  106. },
  107. ],
  108. },
  109. ]
  110. </script>

自定义节点内容

节点的内容支持自定义,可以在节点区添加按钮或图标等内容

可以通过两种方法进行树节点内容的自定义:render-content 和 scoped slot。 使用 render-content 指定渲染函数,该函数返回需要的节点区内容即可。 渲染函数的用法请参考 Vue 文档。 使用 scoped slot 会传入两个参数 nodedata,分别表示当前节点的 Node 对象和当前节点的数据。 注意:由于 jsfiddle 不支持 JSX 语法,所以render-content示例在 jsfiddle 中无法运行。 但是在实际的项目中,只要正确地配置了相关依赖,就可以正常运行。

Tree 树形控件 - 图7

  1. <template>
  2. <div class="custom-tree-container">
  3. <p>Using render-content</p>
  4. <el-tree
  5. :data="dataSource"
  6. show-checkbox
  7. node-key="id"
  8. default-expand-all
  9. :expand-on-click-node="false"
  10. :render-content="renderContent"
  11. />
  12. <p>Using scoped slot</p>
  13. <el-tree
  14. :data="dataSource"
  15. show-checkbox
  16. node-key="id"
  17. default-expand-all
  18. :expand-on-click-node="false"
  19. >
  20. <template #default="{ node, data }">
  21. <span class="custom-tree-node">
  22. <span>{{ node.label }}</span>
  23. <span>
  24. <a @click="append(data)"> Append </a>
  25. <a style="margin-left: 8px" @click="remove(node, data)"> Delete </a>
  26. </span>
  27. </span>
  28. </template>
  29. </el-tree>
  30. </div>
  31. </template>
  32. <script lang="ts" setup>
  33. import { ref } from 'vue'
  34. import type Node from 'element-plus/es/components/tree/src/model/node'
  35. interface Tree {
  36. id: number
  37. label: string
  38. children?: Tree[]
  39. }
  40. let id = 1000
  41. const append = (data: Tree) => {
  42. const newChild = { id: id++, label: 'testtest', children: [] }
  43. if (!data.children) {
  44. data.children = []
  45. }
  46. data.children.push(newChild)
  47. dataSource.value = [...dataSource.value]
  48. }
  49. const remove = (node: Node, data: Tree) => {
  50. const parent = node.parent
  51. const children: Tree[] = parent.data.children || parent.data
  52. const index = children.findIndex((d) => d.id === data.id)
  53. children.splice(index, 1)
  54. dataSource.value = [...dataSource.value]
  55. }
  56. const renderContent = (
  57. h,
  58. {
  59. node,
  60. data,
  61. store,
  62. }: {
  63. node: Node
  64. data: Tree
  65. store: Node['store']
  66. }
  67. ) => {
  68. return h(
  69. 'span',
  70. {
  71. class: 'custom-tree-node',
  72. },
  73. h('span', null, node.label),
  74. h(
  75. 'span',
  76. null,
  77. h(
  78. 'a',
  79. {
  80. onClick: () => append(data),
  81. },
  82. 'Append '
  83. ),
  84. h(
  85. 'a',
  86. {
  87. style: 'margin-left: 8px',
  88. onClick: () => remove(node, data),
  89. },
  90. 'Delete'
  91. )
  92. )
  93. )
  94. }
  95. const dataSource = ref<Tree[]>([
  96. {
  97. id: 1,
  98. label: 'Level one 1',
  99. children: [
  100. {
  101. id: 4,
  102. label: 'Level two 1-1',
  103. children: [
  104. {
  105. id: 9,
  106. label: 'Level three 1-1-1',
  107. },
  108. {
  109. id: 10,
  110. label: 'Level three 1-1-2',
  111. },
  112. ],
  113. },
  114. ],
  115. },
  116. {
  117. id: 2,
  118. label: 'Level one 2',
  119. children: [
  120. {
  121. id: 5,
  122. label: 'Level two 2-1',
  123. },
  124. {
  125. id: 6,
  126. label: 'Level two 2-2',
  127. },
  128. ],
  129. },
  130. {
  131. id: 3,
  132. label: 'Level one 3',
  133. children: [
  134. {
  135. id: 7,
  136. label: 'Level two 3-1',
  137. },
  138. {
  139. id: 8,
  140. label: 'Level two 3-2',
  141. },
  142. ],
  143. },
  144. ])
  145. </script>
  146. <style>
  147. .custom-tree-node {
  148. flex: 1;
  149. display: flex;
  150. align-items: center;
  151. justify-content: space-between;
  152. font-size: 14px;
  153. padding-right: 8px;
  154. }
  155. </style>

自定义节点类名

节点的类名支持自定义。

使用 props.class 来建立节点的类名。

Tree 树形控件 - 图8

  1. <template>
  2. <div class="custom-tree-node-container">
  3. <el-tree
  4. :data="data"
  5. show-checkbox
  6. node-key="id"
  7. default-expand-all
  8. :expand-on-click-node="false"
  9. :props="{ class: customNodeClass }"
  10. />
  11. </div>
  12. </template>
  13. <script lang="ts" setup>
  14. import type Node from 'element-plus/es/components/tree/src/model/node'
  15. interface Tree {
  16. id: number
  17. label: string
  18. isPenultimate?: boolean
  19. children?: Tree[]
  20. }
  21. const customNodeClass = (data: Tree, node: Node) => {
  22. if (data.isPenultimate) {
  23. return 'is-penultimate'
  24. }
  25. return null
  26. }
  27. const data: Tree[] = [
  28. {
  29. id: 1,
  30. label: 'Level one 1',
  31. children: [
  32. {
  33. id: 4,
  34. label: 'Level two 1-1',
  35. isPenultimate: true,
  36. children: [
  37. {
  38. id: 9,
  39. label: 'Level three 1-1-1',
  40. },
  41. {
  42. id: 10,
  43. label: 'Level three 1-1-2',
  44. },
  45. ],
  46. },
  47. ],
  48. },
  49. {
  50. id: 2,
  51. label: 'Level one 2',
  52. isPenultimate: true,
  53. children: [
  54. {
  55. id: 5,
  56. label: 'Level two 2-1',
  57. },
  58. {
  59. id: 6,
  60. label: 'Level two 2-2',
  61. },
  62. ],
  63. },
  64. {
  65. id: 3,
  66. label: 'Level one 3',
  67. isPenultimate: true,
  68. children: [
  69. {
  70. id: 7,
  71. label: 'Level two 3-1',
  72. },
  73. {
  74. id: 8,
  75. label: 'Level two 3-2',
  76. },
  77. ],
  78. },
  79. ]
  80. </script>
  81. <style>
  82. .is-penultimate > .el-tree-node__content {
  83. color: #626aef;
  84. }
  85. .el-tree-node.is-expanded.is-penultimate > .el-tree-node__children {
  86. display: flex;
  87. flex-direction: row;
  88. }
  89. .is-penultimate > .el-tree-node__children > div {
  90. width: 25%;
  91. }
  92. </style>

树节点过滤

树节点是可以被过滤的

调用 Tree 实例对象的 filter 方法来过滤树节点。 方法的参数就是过滤关键字。 需要注意的是,此时需要设置 filter-node-method 属性,其值为过滤函数。

Tree 树形控件 - 图9

  1. <template>
  2. <el-input v-model="filterText" placeholder="Filter keyword" />
  3. <el-tree
  4. ref="treeRef"
  5. class="filter-tree"
  6. :data="data"
  7. :props="defaultProps"
  8. default-expand-all
  9. :filter-node-method="filterNode"
  10. />
  11. </template>
  12. <script lang="ts" setup>
  13. import { ref, watch } from 'vue'
  14. import { ElTree } from 'element-plus'
  15. interface Tree {
  16. id: number
  17. label: string
  18. children?: Tree[]
  19. }
  20. const filterText = ref('')
  21. const treeRef = ref<InstanceType<typeof ElTree>>()
  22. const defaultProps = {
  23. children: 'children',
  24. label: 'label',
  25. }
  26. watch(filterText, (val) => {
  27. treeRef.value!.filter(val)
  28. })
  29. const filterNode = (value: string, data: Tree) => {
  30. if (!value) return true
  31. return data.label.includes(value)
  32. }
  33. const data: Tree[] = [
  34. {
  35. id: 1,
  36. label: 'Level one 1',
  37. children: [
  38. {
  39. id: 4,
  40. label: 'Level two 1-1',
  41. children: [
  42. {
  43. id: 9,
  44. label: 'Level three 1-1-1',
  45. },
  46. {
  47. id: 10,
  48. label: 'Level three 1-1-2',
  49. },
  50. ],
  51. },
  52. ],
  53. },
  54. {
  55. id: 2,
  56. label: 'Level one 2',
  57. children: [
  58. {
  59. id: 5,
  60. label: 'Level two 2-1',
  61. },
  62. {
  63. id: 6,
  64. label: 'Level two 2-2',
  65. },
  66. ],
  67. },
  68. {
  69. id: 3,
  70. label: 'Level one 3',
  71. children: [
  72. {
  73. id: 7,
  74. label: 'Level two 3-1',
  75. },
  76. {
  77. id: 8,
  78. label: 'Level two 3-2',
  79. },
  80. ],
  81. },
  82. ]
  83. </script>

手风琴模式

对于同一级的节点,每次只能展开一个

Tree 树形控件 - 图10

  1. <template>
  2. <el-tree
  3. :data="data"
  4. :props="defaultProps"
  5. accordion
  6. @node-click="handleNodeClick"
  7. />
  8. </template>
  9. <script lang="ts" setup>
  10. interface Tree {
  11. label: string
  12. children?: Tree[]
  13. }
  14. const handleNodeClick = (data: Tree) => {
  15. console.log(data)
  16. }
  17. const data: Tree[] = [
  18. {
  19. label: 'Level one 1',
  20. children: [
  21. {
  22. label: 'Level two 1-1',
  23. children: [
  24. {
  25. label: 'Level three 1-1-1',
  26. },
  27. ],
  28. },
  29. ],
  30. },
  31. {
  32. label: 'Level one 2',
  33. children: [
  34. {
  35. label: 'Level two 2-1',
  36. children: [
  37. {
  38. label: 'Level three 2-1-1',
  39. },
  40. ],
  41. },
  42. {
  43. label: 'Level two 2-2',
  44. children: [
  45. {
  46. label: 'Level three 2-2-1',
  47. },
  48. ],
  49. },
  50. ],
  51. },
  52. {
  53. label: 'Level one 3',
  54. children: [
  55. {
  56. label: 'Level two 3-1',
  57. children: [
  58. {
  59. label: 'Level three 3-1-1',
  60. },
  61. ],
  62. },
  63. {
  64. label: 'Level two 3-2',
  65. children: [
  66. {
  67. label: 'Level three 3-2-1',
  68. },
  69. ],
  70. },
  71. ],
  72. },
  73. ]
  74. const defaultProps = {
  75. children: 'children',
  76. label: 'label',
  77. }
  78. </script>

可拖拽节点

通过 draggable 属性可让节点变为可拖拽

Tree 树形控件 - 图11

  1. <template>
  2. <el-tree
  3. :allow-drop="allowDrop"
  4. :allow-drag="allowDrag"
  5. :data="data"
  6. draggable
  7. default-expand-all
  8. node-key="id"
  9. @node-drag-start="handleDragStart"
  10. @node-drag-enter="handleDragEnter"
  11. @node-drag-leave="handleDragLeave"
  12. @node-drag-over="handleDragOver"
  13. @node-drag-end="handleDragEnd"
  14. @node-drop="handleDrop"
  15. />
  16. </template>
  17. <script lang="ts" setup>
  18. import type Node from 'element-plus/es/components/tree/src/model/node'
  19. import type { DragEvents } from 'element-plus/es/components/tree/src/model/useDragNode'
  20. import type { DropType } from 'element-plus/es/components/tree/src/tree.type'
  21. const handleDragStart = (node: Node, ev: DragEvents) => {
  22. console.log('drag start', node)
  23. }
  24. const handleDragEnter = (
  25. draggingNode: Node,
  26. dropNode: Node,
  27. ev: DragEvents
  28. ) => {
  29. console.log('tree drag enter:', dropNode.label)
  30. }
  31. const handleDragLeave = (
  32. draggingNode: Node,
  33. dropNode: Node,
  34. ev: DragEvents
  35. ) => {
  36. console.log('tree drag leave:', dropNode.label)
  37. }
  38. const handleDragOver = (draggingNode: Node, dropNode: Node, ev: DragEvents) => {
  39. console.log('tree drag over:', dropNode.label)
  40. }
  41. const handleDragEnd = (
  42. draggingNode: Node,
  43. dropNode: Node,
  44. dropType: DropType,
  45. ev: DragEvents
  46. ) => {
  47. console.log('tree drag end:', dropNode && dropNode.label, dropType)
  48. }
  49. const handleDrop = (
  50. draggingNode: Node,
  51. dropNode: Node,
  52. dropType: DropType,
  53. ev: DragEvents
  54. ) => {
  55. console.log('tree drop:', dropNode.label, dropType)
  56. }
  57. const allowDrop = (draggingNode: Node, dropNode: Node, type: DropType) => {
  58. if (dropNode.data.label === 'Level two 3-1') {
  59. return type !== 'inner'
  60. } else {
  61. return true
  62. }
  63. }
  64. const allowDrag = (draggingNode: Node) => {
  65. return !draggingNode.data.label.includes('Level three 3-1-1')
  66. }
  67. const data = [
  68. {
  69. label: 'Level one 1',
  70. children: [
  71. {
  72. label: 'Level two 1-1',
  73. children: [
  74. {
  75. label: 'Level three 1-1-1',
  76. },
  77. ],
  78. },
  79. ],
  80. },
  81. {
  82. label: 'Level one 2',
  83. children: [
  84. {
  85. label: 'Level two 2-1',
  86. children: [
  87. {
  88. label: 'Level three 2-1-1',
  89. },
  90. ],
  91. },
  92. {
  93. label: 'Level two 2-2',
  94. children: [
  95. {
  96. label: 'Level three 2-2-1',
  97. },
  98. ],
  99. },
  100. ],
  101. },
  102. {
  103. label: 'Level one 3',
  104. children: [
  105. {
  106. label: 'Level two 3-1',
  107. children: [
  108. {
  109. label: 'Level three 3-1-1',
  110. },
  111. ],
  112. },
  113. {
  114. label: 'Level two 3-2',
  115. children: [
  116. {
  117. label: 'Level three 3-2-1',
  118. },
  119. ],
  120. },
  121. ],
  122. },
  123. ]
  124. </script>

属性

属性说明类型可选值默认值
data展示数据array
empty-text内容为空的时候展示的文本string
node-key每个树节点用来作为唯一标识的属性,整棵树应该是唯一的string
props配置选项,具体看下表object
render-after-expand是否在第一次展开某个树节点后才渲染其子节点booleantrue
load加载子树数据的方法,仅当 lazy 属性为true 时生效function(node, resolve),node为当前点击的节点,resolve为数据加载完成的回调(必须调用)
render-content树节点的内容区的渲染 FunctionFunction(h, { node, data, store })
highlight-current是否高亮当前选中节点,默认值是 false。booleanfalse
default-expand-all是否默认展开所有节点booleanfalse
expand-on-click-node是否在点击节点的时候展开或者收缩节点, 默认值为 true,如果为 false,则只有点箭头图标的时候才会展开或者收缩节点。booleantrue
check-on-click-node是否在点击节点的时候选中节点,默认值为 false,即只有在点击复选框时才会选中节点。booleanfalse
auto-expand-parent展开子节点的时候是否自动展开父节点booleantrue
default-expanded-keys默认展开的节点的 key 的数组array
show-checkbox节点是否可被选择booleanfalse
check-strictly在显示复选框的情况下,是否严格的遵循父子不互相关联的做法,默认为 falsebooleanfalse
default-checked-keys默认勾选的节点的 key 的数组array
current-node-key当前选中的节点string, number
filter-node-method对树节点进行筛选时执行的方法, 返回 false 则表示这个节点会被隐藏Function(value, data, node)
accordion是否每次只打开一个同级树节点展开booleanfalse
indent相邻级节点间的水平缩进,单位为像素number16
icon自定义图标组件string | Component--
lazy是否懒加载子节点,需与 load 方法结合使用booleanfalse
draggable是否开启拖拽节点功能booleanfalse
allow-drag判断节点能否被拖拽 如果返回 false ,节点不能被拖动Function(node)
allow-drop拖拽时判定目标节点能否成为拖动目标位置。 如果返回 false ,拖动节点不能被拖放到目标节点。 type 参数有三种情况:’prev’、’inner’ 和 ‘next’,分别表示放置在目标节点前、插入至目标节点和放置在目标节点后Function(draggingNode, dropNode, type)

Props

Props说明类型可选值默认值
label指定节点标签为节点对象的某个属性值string, function(data, node)
children指定子树为节点对象的某个属性值string
disabled指定节点选择框是否禁用为节点对象的某个属性值string, function(data, node)
isLeaf指定节点是否为叶子节点,仅在指定了 lazy 属性的情况下生效string, function(data, node)
class自定义节点类名string, function(data, node)

方法

Tree 组件有以下方法,均返回当前选中的节点数组

方法描述参数
filter过滤所有树节点,过滤后的节点将被隐藏接收一个参数并指定为 filter-node-method 属性的第一个参数
updateKeyChildren为节点设置新数据,只有当设置 node-key 属性的时候才可用(key, data) 接收两个参数: 1. 节点的 key 2. 新数据
getCheckedNodes如果节点可以被选中,(show-checkboxtrue), 本方法将返回当前选中节点的数组(leafOnly, includeHalfChecked) 接收两个布尔类型参数: 1. 默认值为 false. 若参数为 true, 它将返回当前选中节点的子节点 2. 默认值为 false. 如果参数为 true, 返回值包含半选中节点数据
setCheckedNodes设置目前勾选的节点,使用此方法必须提前设置 node-key 属性要选中的节点构成的数组
getCheckedKeys若节点可用被选中 (show-checkboxtrue), 它将返回当前选中节点 key 的数组(leafOnly) 接收一个布尔类型参数,默认为 false. 如果参数是 true, 它只返回当前选择的子节点数组。
setCheckedKeys设置目前选中的节点,使用此方法必须设置 node-key 属性(keys, leafOnly) 接收两个参数: 1. 一个需要被选中的多节点 key 的数组 2. 一个布尔类型参数,默认为 false. 如果参数是 true, 它只返回当前选择的子节点数组。
setChecked设置节点是否被选中, 使用此方法必须设置 node-key 属性(key/data, checked, deep) 接收三个参数: 1. 要选中的节点的 key 或者数据 2. 一个布尔类型参数表明是否选中. 3. 一个布尔类型参数表明是否递归选中子节点
getHalfCheckedNodes如果节点可用被选中 (show-checkboxtrue), 它将返回当前半选中的节点组成的数组-
getHalfCheckedKeys若节点可被选中(show-checkboxtrue),则返回目前半选中的节点的 key 所组成的数组-
getCurrentKey返回当前被选中节点的数据 (如果没有则返回 null)
getCurrentNode返回当前被选中节点的数据 (如果没有则返回 null)
setCurrentKey通过 key 设置某个节点的当前选中状态,使用此方法必须设置 node-key 属性(key, shouldAutoExpandParent=true) 1. 待被选节点的 key, 如果为 null, 取消当前选中的节点 2. 是否自动展开父节点
setCurrentNode设置节点为选中状态,使用此方法必须设置 node-key 属性(node, shouldAutoExpandParent=true) 1. 待被选中的节点 2. 是否展开父节点
getNode根据 data 或者 key 拿到 Tree 组件中的 node(data) 节点的 data 或 key
remove删除 Tree 中的一个节点,使用此方法必须设置 node-key 属性(data) 要删除的节点的 data 或者 node 对象
append为 Tree 中的一个节点追加一个子节点(data, parentNode) 1. 要追加的子节点的 data 2. 父节点的 data, key 或 node
insertBefore在 Tree 中给定节点前插入一个节点(data, refNode) 1. 要增加的节点的 data 2. 参考节点的 data, key 或 node
insertAfter在 Tree 中给定节点后插入一个节点(data, refNode) 1. 要增加的节点的 data 2. 参考节点的 data, key 或 node

事件

事件名说明回调参数
node-click当节点被点击的时候触发四个参数:对应于节点点击的节点对象,TreeNode 的 node 属性, TreeNode和事件对象
node-contextmenu当某一节点被鼠标右键点击时会触发该事件共四个参数,依次为:event、传递给 data 属性的数组中该节点所对应的对象、节点对应的 Node、节点组件本身。
check-change当复选框被点击的时候触发共三个参数,依次为:传递给 data 属性的数组中该节点所对应的对象、节点本身是否被选中、节点的子树中是否有被选中的节点
check点击节点复选框之后触发共两个参数,依次为:传递给 data 属性的数组中该节点所对应的对象、树目前的选中状态对象,包含 checkedNodes、checkedKeys、halfCheckedNodes、halfCheckedKeys 四个属性
current-change当前选中节点变化时触发的事件共两个参数,依次为:当前节点的数据,当前节点的 Node 对象
node-expand节点被展开时触发的事件共三个参数,依次为:传递给 data 属性的数组中该节点所对应的对象、节点对应的 Node、节点组件本身
node-collapse节点被关闭时触发的事件共三个参数,依次为:传递给 data 属性的数组中该节点所对应的对象、节点对应的 Node、节点组件本身
node-drag-start节点开始拖拽时触发的事件共两个参数,依次为:被拖拽节点对应的 Node、event
node-drag-enter拖拽进入其他节点时触发的事件共三个参数,依次为:被拖拽节点对应的 Node、所进入节点对应的 Node、event
node-drag-leave拖拽离开某个节点时触发的事件共三个参数,依次为:被拖拽节点对应的 Node、所离开节点对应的 Node、event
node-drag-over在拖拽节点时触发的事件(类似浏览器的 mouseover 事件)共三个参数,依次为:被拖拽节点对应的 Node、当前进入节点对应的 Node、event
node-drag-end拖拽结束时(可能未成功)触发的事件共四个参数,依次为:被拖拽节点对应的 Node、结束拖拽时最后进入的节点(可能为空)、被拖拽节点的放置位置(before、after、inner)、event
node-drop拖拽成功完成时触发的事件共四个参数,依次为:被拖拽节点对应的 Node、结束拖拽时最后进入的节点、被拖拽节点的放置位置(before、after、inner)、event

插槽

插槽名说明
自定义树节点的内容, 自定义树节点的内容, 参数为 { node, data }

源代码

组件 Tree 树形控件 - 图12 文档 Tree 树形控件 - 图13

贡献者

Tree 树形控件 - 图14 三咲智子

Tree 树形控件 - 图15 云游君

Tree 树形控件 - 图16 jeremywu

Tree 树形控件 - 图17 Xc

Tree 树形控件 - 图18 zz

Tree 树形控件 - 图19 LIUCHAO

Tree 树形控件 - 图20 msidolphin

Tree 树形控件 - 图21 Aex

Tree 树形控件 - 图22 Delyan Haralanov

Tree 树形控件 - 图23 啝裳

Tree 树形控件 - 图24 C.Y.Kun

Tree 树形控件 - 图25 zhiyuanzmj

Tree 树形控件 - 图26 jarven

Tree 树形控件 - 图27 Zhongxiang Wang

Tree 树形控件 - 图28 opengraphica

Tree 树形控件 - 图29 bqy

Tree 树形控件 - 图30 Alan Wang

Tree 树形控件 - 图31 ElsaOOo

Tree 树形控件 - 图32 Herrington Darkholme

Tree 树形控件 - 图33 Greper

Tree 树形控件 - 图34 SongWuKong

Tree 树形控件 - 图35 deepthan

Tree 树形控件 - 图36 on the field of hope

Tree 树形控件 - 图37 zazzaz

Tree 树形控件 - 图38 Hades-li

Tree 树形控件 - 图39 renovate[bot]

Tree 树形控件 - 图40 Chen_Z