vue + element tree 设置展开,折叠图标,设置节点前图标

本文详细介绍如何在Element UI中自定义树组件的图标和展开/折叠行为,包括使用SCSS设置不同状态下的图标样式,以及根据不同数据类型显示特定图标的方法。

效果图:

                                                               

1. 设置展开,折叠图标

<style lang="scss">
.el-tree .el-tree-node__expand-icon.expanded {
  -webkit-transform: rotate(0deg);
  transform: rotate(0deg);
}
.el-tree .el-icon-caret-right:before {
  content: "\e723";
}
.el-tree .el-tree-node__expand-icon.expanded.el-icon-caret-right:before{
  content: "\e722";
}
</style>

设置不同图标的效果,可以在element-ui icon模块查看对应的content值

 

2. 设置节点前的图标

<el-tree
      :data="data"
      show-checkbox
      node-key="id"
      :props="defaultProps"
      default-expand-all
      :expand-on-click-node="false"
    >
      <span slot-scope="{ node, data }" class="custom-tree-node">
        <!--可以根据情况,以数据类型来显示不同的图标或图片-->
        <i v-if="data.type == 'catalog'" class="el-icon-folder" />
        <i v-if="data.type == 'menu'" class="el-icon-tickets" />
        <span>{{ node.label }}</span>
      </span>
</el-tree>

下面是完整代码:

<template>
  <div>
    <el-tree
      :data="data"
      show-checkbox
      node-key="id"
      :props="defaultProps"
      default-expand-all
      :expand-on-click-node="false"
    >
      <span slot-scope="{ node, data }" class="custom-tree-node">
        <i v-if="data.type == 'catalog'" class="el-icon-folder" />
        <i v-if="data.type == 'menu'" class="el-icon-tickets" />
        <span>{{ node.label }}</span>
      </span>
    </el-tree>
  </div>
</template>

<script>
export default {
  data() {
    return {
      data: [{
        id: 1,
        label: '目录1',
        type: 'catalog',
        children: [{
          id: 2,
          type: 'menu',
          label: '菜单1'
        }, {
          id: 3,
          type: 'menu',
          label: '菜单2'
        }]
      }, {
        id: 4,
        type: 'catalog',
        label: '目录2',
        children: [{
          type: 'menu',
          id: 5,
          label: '菜单1'
        }, {
          id: 6,
          type: 'menu',
          label: '菜单2'
        }]
      }],
      defaultProps: {
        children: 'children',
        label: 'label'
      }
    }
  }

}
</script>

<style lang="scss">
.el-tree .el-tree-node__expand-icon.expanded {
  -webkit-transform: rotate(0deg);
  transform: rotate(0deg);
}
.el-tree .el-icon-caret-right:before {
  content: "\e723";
}
.el-tree .el-tree-node__expand-icon.expanded.el-icon-caret-right:before{
  content: "\e722";
}
</style>

 

### 如何在 Element UI Tree 组件中设置默认展开节点Element UI 的 `el-tree` 组件中,可以通过以下两种方式实现默认展开特定节点的功能: #### 方法一:使用 `default-expanded-keys` 属性 该属性接受一个数组,用于指定哪些节点应该默认展开。这些节点的唯一标识符由 `node-key` 属性定义。 以下是具体实现代码示例: ```vue <template> <el-tree :data="treeData" node-key="id" :default-expanded-keys="expandedKeys" :props="defaultProps"> </el-tree> </template> <script> export default { data() { return { treeData: [ { id: 1, label: 'Parent Node', children: [ { id: 2, label: 'Child Node' } ] } ], expandedKeys: [1], // 默认展开节点 ID 列表 defaultProps: { children: 'children', label: 'label' } }; } }; </script> ``` 此方法的关键在于绑定 `default-expanded-keys` 属性至一个包含目标节点 ID 的数组[^2]。 --- #### 方法二:动态控制节点展开状态 如果需要更灵活地控制节点展开/折叠行为,可以利用 `$refs` 访问树实例,并调用其内置方法来手动调整节点的状态。 以下是基于 Vue 生命周期钩子的一个例子: ```javascript this.$nextTick(() => { const keysToExpand = [1]; // 要展开节点 ID 数组 this.$refs.tree.store._getAllNodes().forEach(node => { if (keysToExpand.includes(Number(node.key))) { node.expanded = true; } }); }); ``` 上述逻辑可以在数据更新完成后执行,确保视图渲染完毕后再修改节点状态[^4]。 --- #### 注意事项 1. **`node-key` 是必需的** 如果未正确配置 `node-key`,则无法正常使用 `default-expanded-keys` 或其他依赖于节点唯一标识的功能。 2. **异步场景下的处理** 当树的数据来源于远程接口时,建议将默认展开节点列表存储在组件的状态中,在数据加载完成并通过 `$nextTick` 更新 DOM 后再应用展开逻辑[^5]。 3. **性能优化提示** 对于大规模树结构(数千级节点),应谨慎使用 `default-expand-all` 或过多的 `default-expanded-keys` 值,以免影响页面响应速度。 --- ### 总结 通过以上介绍可知,Element UI 提供了多种途径帮助开发者轻松实现树形控件的默认展开功能。推荐优先采用静态配置的方式即 `default-expanded-keys` 来满足大多数需求;而对于复杂业务场景,则可借助 API 手动干预节点的行为。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值