基础的树形结构展示。

    可选择

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

    Tree 树形控件 - 图1

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

    1. :props="props"
    2. :load="loadNode"
    3. lazy
    4. show-checkbox
    5. @check-change="handleCheckChange">
    6. </el-tree>
    7. <script>
    8. export default {
    9. data() {
    10. return {
    11. props: {
    12. label: 'name',
    13. children: 'zones'
    14. },
    15. count: 1
    16. };
    17. },
    18. methods: {
    19. handleCheckChange(data, checked, indeterminate) {
    20. console.log(data, checked, indeterminate);
    21. },
    22. handleNodeClick(data) {
    23. console.log(data);
    24. },
    25. loadNode(node, resolve) {
    26. if (node.level === 0) {
    27. return resolve([{ name: 'region1' }, { name: 'region2' }]);
    28. }
    29. if (node.level > 3) return resolve([]);
    30. var hasChild;
    31. if (node.data.name === 'region1') {
    32. hasChild = true;
    33. } else if (node.data.name === 'region2') {
    34. hasChild = false;
    35. } else {
    36. hasChild = Math.random() > 0.5;
    37. }
    38. setTimeout(() => {
    39. var data;
    40. if (hasChild) {
    41. data = [{
    42. name: 'zone' + this.count++
    43. }, {
    44. name: 'zone' + this.count++
    45. }];
    46. } else {
    47. data = [];
    48. }
    49. resolve(data);
    50. }, 500);
    51. }
    52. }
    53. };
    54. </script>

    懒加载自定义叶子节点

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

    1. <el-tree
    2. :props="props"
    3. :load="loadNode"
    4. lazy
    5. show-checkbox>
    6. </el-tree>
    7. <script>
    8. export default {
    9. data() {
    10. return {
    11. props: {
    12. label: 'name',
    13. children: 'zones',
    14. isLeaf: 'leaf'
    15. },
    16. };
    17. },
    18. methods: {
    19. loadNode(node, resolve) {
    20. if (node.level === 0) {
    21. return resolve([{ name: 'region' }]);
    22. }
    23. if (node.level > 1) return resolve([]);
    24. setTimeout(() => {
    25. const data = [{
    26. name: 'leaf',
    27. leaf: true
    28. }, {
    29. name: 'zone'
    30. }];
    31. resolve(data);
    32. }, 500);
    33. }
    34. }
    35. };
    36. </script>

    默认展开和默认选中

    可将 Tree 的某些节点设置为默认展开或默认选中

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

    禁用状态

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

    Tree 树形控件 - 图2

    通过disabled设置禁用状态。

    1. <el-tree
    2. :data="data"
    3. show-checkbox
    4. node-key="id"
    5. :default-expanded-keys="[2, 3]"
    6. :default-checked-keys="[5]">
    7. </el-tree>
    8. <script>
    9. export default {
    10. data() {
    11. return {
    12. data: [{
    13. id: 1,
    14. children: [{
    15. id: 3,
    16. label: '二级 2-1',
    17. children: [{
    18. id: 4,
    19. label: '三级 3-1-1'
    20. }, {
    21. id: 5,
    22. label: '三级 3-1-2',
    23. disabled: true
    24. }]
    25. }, {
    26. id: 2,
    27. label: '二级 2-2',
    28. disabled: true,
    29. children: [{
    30. id: 6,
    31. }, {
    32. id: 7,
    33. label: '三级 3-2-2',
    34. disabled: true
    35. }]
    36. }]
    37. }],
    38. defaultProps: {
    39. children: 'children',
    40. label: 'label'
    41. }
    42. };
    43. }
    44. };
    45. </script>

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

    1. <el-tree
    2. :data="data"
    3. show-checkbox
    4. default-expand-all
    5. node-key="id"
    6. ref="tree"
    7. highlight-current
    8. :props="defaultProps">
    9. </el-tree>
    10. <div class="buttons">
    11. <el-button @click="getCheckedNodes">通过 node 获取</el-button>
    12. <el-button @click="getCheckedKeys">通过 key 获取</el-button>
    13. <el-button @click="setCheckedNodes">通过 node 设置</el-button>
    14. <el-button @click="setCheckedKeys">通过 key 设置</el-button>
    15. <el-button @click="resetChecked">清空</el-button>
    16. </div>
    17. <script>
    18. export default {
    19. methods: {
    20. getCheckedNodes() {
    21. console.log(this.$refs.tree.getCheckedNodes());
    22. },
    23. getCheckedKeys() {
    24. console.log(this.$refs.tree.getCheckedKeys());
    25. },
    26. setCheckedNodes() {
    27. this.$refs.tree.setCheckedNodes([{
    28. id: 5,
    29. label: '二级 2-1'
    30. }, {
    31. id: 9,
    32. label: '三级 1-1-1'
    33. }]);
    34. },
    35. setCheckedKeys() {
    36. this.$refs.tree.setCheckedKeys([3]);
    37. },
    38. resetChecked() {
    39. this.$refs.tree.setCheckedKeys([]);
    40. }
    41. },
    42. data() {
    43. return {
    44. data: [{
    45. id: 1,
    46. label: '一级 1',
    47. children: [{
    48. id: 4,
    49. label: '二级 1-1',
    50. children: [{
    51. id: 9,
    52. label: '三级 1-1-1'
    53. }, {
    54. id: 10,
    55. label: '三级 1-1-2'
    56. }]
    57. }]
    58. }, {
    59. id: 2,
    60. label: '一级 2',
    61. children: [{
    62. id: 5,
    63. label: '二级 2-1'
    64. }, {
    65. id: 6,
    66. label: '二级 2-2'
    67. }]
    68. }, {
    69. id: 3,
    70. label: '一级 3',
    71. children: [{
    72. id: 7,
    73. label: '二级 3-1'
    74. }, {
    75. id: 8,
    76. label: '二级 3-2'
    77. }]
    78. }],
    79. defaultProps: {
    80. children: 'children',
    81. label: 'label'
    82. }
    83. };
    84. }
    85. };
    86. </script>

    自定义节点内容

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

    Tree 树形控件 - 图3

    节点过滤

    通过关键字过滤树节点

    在需要对节点进行过滤时,调用 Tree 实例的filter方法,参数为关键字。需要注意的是,此时需要设置filter-node-method,值为过滤函数。

    1. <el-input
    2. placeholder="输入关键字进行过滤"
    3. v-model="filterText">
    4. </el-input>
    5. class="filter-tree"
    6. :data="data"
    7. :props="defaultProps"
    8. default-expand-all
    9. :filter-node-method="filterNode"
    10. ref="tree">
    11. </el-tree>
    12. <script>
    13. export default {
    14. watch: {
    15. filterText(val) {
    16. this.$refs.tree.filter(val);
    17. }
    18. },
    19. methods: {
    20. filterNode(value, data) {
    21. if (!value) return true;
    22. return data.label.indexOf(value) !== -1;
    23. }
    24. },
    25. data() {
    26. return {
    27. filterText: '',
    28. data: [{
    29. id: 1,
    30. label: '一级 1',
    31. children: [{
    32. id: 4,
    33. label: '二级 1-1',
    34. children: [{
    35. id: 9,
    36. label: '三级 1-1-1'
    37. }, {
    38. id: 10,
    39. label: '三级 1-1-2'
    40. }]
    41. }]
    42. }, {
    43. id: 2,
    44. label: '一级 2',
    45. children: [{
    46. id: 5,
    47. label: '二级 2-1'
    48. }, {
    49. id: 6,
    50. label: '二级 2-2'
    51. }]
    52. }, {
    53. id: 3,
    54. label: '一级 3',
    55. children: [{
    56. id: 7,
    57. label: '二级 3-1'
    58. }, {
    59. id: 8,
    60. label: '二级 3-2'
    61. }]
    62. }],
    63. defaultProps: {
    64. children: 'children',
    65. label: 'label'
    66. }
    67. };
    68. }
    69. };
    70. </script>

    手风琴模式

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

    Tree 树形控件 - 图4

    1. <el-tree
    2. :data="data"
    3. :props="defaultProps"
    4. accordion
    5. @node-click="handleNodeClick">
    6. </el-tree>
    7. <script>
    8. export default {
    9. data() {
    10. return {
    11. data: [{
    12. label: '一级 1',
    13. children: [{
    14. label: '二级 1-1',
    15. children: [{
    16. label: '三级 1-1-1'
    17. }]
    18. }]
    19. }, {
    20. label: '一级 2',
    21. children: [{
    22. label: '二级 2-1',
    23. children: [{
    24. label: '三级 2-1-1'
    25. }]
    26. }, {
    27. label: '二级 2-2',
    28. children: [{
    29. label: '三级 2-2-1'
    30. }]
    31. }]
    32. }, {
    33. label: '一级 3',
    34. children: [{
    35. label: '二级 3-1',
    36. children: [{
    37. label: '三级 3-1-1'
    38. }]
    39. }, {
    40. label: '二级 3-2',
    41. children: [{
    42. label: '三级 3-2-1'
    43. }]
    44. }]
    45. }],
    46. defaultProps: {
    47. children: 'children',
    48. label: 'label'
    49. }
    50. };
    51. },
    52. methods: {
    53. handleNodeClick(data) {
    54. console.log(data);
    55. }
    56. }
    57. };

    可拖拽节点

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

    props

    方法

    Tree 内部使用了 Node 类型的对象来包装用户传入的数据,用来保存目前节点的状态。 Tree 拥有如下方法:

    Events

    Scoped Slot