el-tree 组件自定义样式 最后一级flex,其余级别正常block

先上需求的效果图

el-tree的样式一般全都是block换行的,如下图

先分析一下,
1.树结构的级别是不确定的,但是样式上要求最后一个层级需要横着排列,其余竖着排,超出需要换行
2.如何找到每一个数据项的最后一级呢?
3.找到之后怎么办?

ok,then,
1.先通过插槽吧,因为这样咱们可以自定义最后一个节点的样式,加一个类名作为标识。在methods里面加一个判断是否最后一级的函数,是最后一级则加类名,否则正常显示

<el-tree :data="chanelItemList" show-checkbox default-expand-all node-key="id" ref="tree" :highlight-current="false"
    :props="defaultProps" :expand-on-click-node="false" :check-on-click-node="true"
    :default-checked-keys="defaultCheckedKeys">
    <template #default="{ node, data }">
          <div v-if="isLastLevelNode(node)" class="last-level-node">
               <span class="el-tree-node__label">{{ data.label }}</span>
          </div>
               <span v-else>{{ data.label }}</span>
     </template>
  </el-tree>
isLastLevelNode(node) {
     // 检查当前节点是否为最后一级
     return !node.data.children || node.data.children.length === 0;
},

2.通过浏览器编译后,可以看到这个类名标识,且能够反向找到需要改成横着拍的元素,如图:
需要修改的是这个span的父级的父级的父级的样式

3.通过js来做行内样式修改,继续在methods里面加一个方法

addClass() {
      // 获取所有最后一级节点对应的 .el-tree-node__children 元素
      document.querySelectorAll('.last-level-node').forEach(function (element) {
        // 获取 .el-tree-node__children 元素
        const childrenElement = element.parentNode.parentNode.parentNode;
        // 添加 display: flex; 的行内样式
        childrenElement.style.display = 'flex';
        childrenElement.style.flexWrap = 'wrap'; 
        childrenElement.style.flexDirection = 'row'; // 可选:明确指定水平方向
        childrenElement.style.alignItems = 'center'; // 可选:对齐方式
      });
    }
在钩子函数中调用一下
created() {
    this.$nextTick(() => {
      this.addClass()
    })
  }

然后就ok啦~~~

posted @ 2024-08-12 11:18  JocelynFung  阅读(202)  评论(0编辑  收藏  举报
Live2D 看板娘 / Demo