记录一次关于el-tree中让内容与左边有距离的爬坑记录

首先看设计文稿如下

 

 

 可以看到tree的内容与左边有一个88px的间距,起初看到觉得很容易,给容器加一个padding-left: 88px就可以了。可是似乎并没那么简单。。。

/deep/.el-tree-node__content {
  padding-left: 88px !important;
}

看看结果

 

 

 

似乎是对的,但是注意,这张图中所有父子节点与左边的内容都是88px,这是因为el-tree组件中有一个属性叫indent,表示缩进距离,默认为16px。其实也就是在这个el-node-tree__conent中加了一个padding-left:16px的属性,而我自己写的恰好覆盖了这个默认缩进,因此所有节点都为88px。看来这种方法不行,但是我注意到indent这个属性,那我直接加上这个属性是否就可以了呢?于是我试了下

 

 

 

还是不行,它表示的仅仅是缩进的距离,也就是每个子节点对应父节点产生的左间距。

接下来我又试着在整个容器中加入左间距试试

.el-tree{
  padding-left: 88px
}

 

 

 

 

可以看到间距是有了,但是呢鼠标移动到内容上时,左边因为空出了一个88px的距离,感觉十分丑,然后我就围绕这方面想是否能够让这个移动的内容的div浮动起来,结果依然不行。

后来我想了一下,因为我的文本是通过动态绑定形式渲染的,那么我就试着将内容与左边产生间距,

<div
              slot-scope="{ node, data }"
              @mouseenter="mouseenter(data)"
              @mouseleave="mouseleave(data)"
              style="font-size: 1rem; width: 100%; display: flex; align-items: center; padding-left: 88px"
            >
            
              
              <i
                :class="{
                  'fa fa-folder': !node.expanded,
                  'fa fa-folder-open': node.expanded,
                }"
                style="color: #1672FA; padding-left: 4px"
              />
              <span style="padding-left: 8px">{{ data.descr }} </span>
              <span style="margin-left: auto; margin-right: 29px"
                ><i v-show="data.show" @click="deleteDept(data.deptid)" class="el-icon-close"
              /></span>
            </div>

结果....

 

 

前面的小箭头却没有跟着一起移动。。。因为箭头并不是动态渲染的。但是可以看到鼠标移动上去时,可以有整行的高亮效果,我感觉抓住了方向,

接下来说重点。

思路:既然内容是可以产生右边间距的,虽然左边的小箭头不会跟过来,但是这个箭头可以跟着动态生成就行了。

我看了下el-tree点击的事件,是通过绑定aria-expanded="true"这个事件控制小箭头切换的方向,也就是展开时向下,闭合时向右。

ok,这就很好理解了,我也需要通过一个这样的属性判断该节点是否展开。恰好绑定的node中有一个叫expanded是判断是否展开的。(其实做文件夹图标状态时已经用过,这会大脑短路)

那就很容易了,

<span
                :class="{
                  'expanded el-tree-node__expand-icon el-icon-caret-right': node.expanded,
                  'el-tree-node__expand-icon el-icon-caret-right': !node.expanded,
                }"
              ></span>

看下效果

 

 

现在我就只需要去掉前面的小箭头即可。只需将el-tree中icon-class设置为空即可。

icon-class="''"

 

 

但是这里出了一个问题,当该节点下面不存在子节点时候,依旧会显示出一个箭头,这个问题也很简单我只需要加入判断,该节点下是否还有子节点,有则显示箭头,否则隐藏。

v-if="data.child.length!==0"

然后看下效果

 

 ok,箭头终于去掉了,大功告成!

有点乱,整理下思路:

1.在动态渲染的内容中加入左间距,此时会发现箭头与文本内容有一个88px的间距,我们先不管它。

2.通过node.expanded判断当前节点是展开还是闭合,绑定箭头对应的图标生成我们自己的箭头。

3.去掉el-tree组件自带的箭头。

4.判断该节点下是否还存在子节点,存在才显示箭头,否则不显示。

贴上完整的代码

<el-tree
            :highlight-current="true"
            :data="deptList"
            :props="defaultProps"
            @node-click="handleNodeClick"
            style="margin-top: 8px"
            v-loading="loading"
            node-key="deptid"
            :default-expanded-keys="['100000']"
            icon-class="''"
          >
            <div
              slot-scope="{ node, data }"
              @mouseenter="mouseenter(data)"
              @mouseleave="mouseleave(data)"
              style="font-size: 1rem; width: 100%; display: flex; align-items: center; padding-left: 88px"
            >
            
              <span
              v-if="data.child.length!==0"
                :class="{
                  'expanded el-tree-node__expand-icon el-icon-caret-right': node.expanded,
                  'el-tree-node__expand-icon el-icon-caret-right': !node.expanded,
                }"
              ></span>
              <i
                :class="{
                  'fa fa-folder': !node.expanded,
                  'fa fa-folder-open': node.expanded,
                }"
                style="color: #1672FA; padding-left: 4px"
              />
              <span style="padding-left: 8px">{{ data.descr }} </span>
              <span style="margin-left: auto; margin-right: 29px"
                ><i v-show="data.show" @click="deleteDept(data.deptid)" class="el-icon-close"
              /></span>
            </div>
          </el-tree>

 如果有更好的思路欢迎提出~~

posted @ 2021-06-04 19:07  皮皮马y  阅读(1632)  评论(3编辑  收藏  举报