基础的树形结构展示。

    可选择

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

    Tree 树形控件 - 图2

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

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

    懒加载自定义叶子节点

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

    <el-tree
      :props="props"
      :load="loadNode"
      lazy
      show-checkbox>
    </el-tree>
    
    <script>
      export default {
        data() {
          return {
            props: {
              label: 'name',
              children: 'zones',
              isLeaf: 'leaf'
            },
          };
        },
        methods: {
          loadNode(node, resolve) {
            if (node.level === 0) {
              return resolve([{ name: 'region' }]);
            }
            if (node.level > 1) return resolve([]);
    
            setTimeout(() => {
              const data = [{
                name: 'leaf',
                leaf: true
              }, {
                name: 'zone'
              }];
    
              resolve(data);
            }, 500);
          }
        }
      };
    </script>
    

    默认展开和默认选中

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

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

    禁用状态

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

    Tree 树形控件 - 图5

    通过disabled设置禁用状态。

    <el-tree
      :data="data"
      show-checkbox
      node-key="id"
      :default-expanded-keys="[2, 3]"
      :default-checked-keys="[5]">
    </el-tree>
    
    <script>
      export default {
        data() {
          return {
            data: [{
              id: 1,
              label: '一级 2',
              children: [{
                id: 3,
                label: '二级 2-1',
                children: [{
                  id: 4,
                  label: '三级 3-1-1'
                }, {
                  id: 5,
                  label: '三级 3-1-2',
                  disabled: true
                }]
              }, {
                id: 2,
                label: '二级 2-2',
                disabled: true,
                children: [{
                  id: 6,
                  label: '三级 3-2-1'
                }, {
                  id: 7,
                  label: '三级 3-2-2',
                  disabled: true
                }]
              }]
            }],
            defaultProps: {
              children: 'children',
              label: 'label'
            }
          };
        }
      };
    </script>
    

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

    
    

    自定义节点内容

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

    Tree 树形控件 - 图7

    节点过滤

    通过关键字过滤树节点

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

    <el-input
      placeholder="输入关键字进行过滤"
      v-model="filterText">
    </el-input>
    
    <el-tree
      class="filter-tree"
      :data="data"
      :props="defaultProps"
      default-expand-all
      :filter-node-method="filterNode"
      ref="tree">
    </el-tree>
    
    <script>
      export default {
        watch: {
          filterText(val) {
            this.$refs.tree.filter(val);
          }
        },
    
        methods: {
          filterNode(value, data) {
            if (!value) return true;
            return data.label.indexOf(value) !== -1;
          }
        },
    
        data() {
          return {
            filterText: '',
            data: [{
              id: 1,
              label: '一级 1',
              children: [{
                id: 4,
                label: '二级 1-1',
                children: [{
                  id: 9,
                  label: '三级 1-1-1'
                }, {
                  id: 10,
                  label: '三级 1-1-2'
                }]
              }]
            }, {
              id: 2,
              label: '一级 2',
              children: [{
                id: 5,
                label: '二级 2-1'
              }, {
                id: 6,
                label: '二级 2-2'
              }]
            }, {
              id: 3,
              label: '一级 3',
              children: [{
                id: 7,
                label: '二级 3-1'
              }, {
                id: 8,
                label: '二级 3-2'
              }]
            }],
            defaultProps: {
              children: 'children',
              label: 'label'
            }
          };
        }
      };
    </script>
    

    手风琴模式

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

    Tree 树形控件 - 图9

    <el-tree
      :data="data"
      :props="defaultProps"
      accordion
      @node-click="handleNodeClick">
    </el-tree>
    
    <script>
      export default {
        data() {
          return {
            data: [{
              label: '一级 1',
              children: [{
                label: '二级 1-1',
                children: [{
                  label: '三级 1-1-1'
                }]
              }]
            }, {
              label: '一级 2',
              children: [{
                label: '二级 2-1',
                children: [{
                  label: '三级 2-1-1'
                }]
              }, {
                label: '二级 2-2',
                children: [{
                  label: '三级 2-2-1'
                }]
              }]
            }, {
              label: '一级 3',
              children: [{
                label: '二级 3-1',
                children: [{
                  label: '三级 3-1-1'
                }]
              }, {
                label: '二级 3-2',
                children: [{
                  label: '三级 3-2-1'
                }]
              }]
            }],
            defaultProps: {
              children: 'children',
              label: 'label'
            }
          };
        },
        methods: {
          handleNodeClick(data) {
            console.log(data);
          }
        }
      };
    </script>
    

    可拖拽节点

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

    props

    方法

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

    Events

    Scoped Slot