一、css样式方式

  1. /* 树节点icon改造 */
  2. .el-tree /deep/ .el-tree-node__expand-icon.expanded {
  3. -webkit-transform: rotate(0deg);
  4. transform: rotate(0deg);
  5. /* rotate 定义 2D 旋转,在参数中规定角度。这里设置为0,就是清除原生小三角的90°旋转 */
  6. }
  7. /* 有子节点 且未展开 */
  8. .el-tree /deep/ .el-icon-caret-right:before {
  9. /* :before在该样式加载之前,替换图标 */
  10. background: url("../../../assets/folder.png") no-repeat;
  11. content: "";
  12. display: block;
  13. width: 16px;
  14. height: 16px;
  15. font-size: 16px;
  16. background-size: 16px;
  17. }
  18. /* 有子节点 且已展开 */
  19. .el-tree /deep/ .el-tree-node__expand-icon.expanded.el-icon-caret-right:before {
  20. background: url("../../../assets/folder-open.png") no-repeat;
  21. content: "";
  22. display: block;
  23. width: 16px;
  24. height: 16px;
  25. font-size: 16px;
  26. background-size: 16px;
  27. }
  28. /* 没有子节点 */
  29. .el-tree /deep/.el-tree-node__expand-icon.is-leaf::before {
  30. background: url("../../../assets/sql.png") no-repeat;
  31. content: "";
  32. display: block;
  33. width: 16px;
  34. height: 16px;
  35. font-size: 16px;
  36. background-size: 16px;
  37. }

弊端:有一个bug是在筛选列表后,如果符合条件的脚本为0 ,则会遗留几个空文件夹📂,但因为没有子级,文件夹图标会显示成📄。用户点击📄相当于点击一个空的文件夹📂。

解决方案:后端在返回筛选后的脚本列表时如果目录的children字段的length为0,连目录级的数据也无需返回,但是这样新建的目录因为没有子级就无法显示了,所以如果用这种方式的话,给children添加一个永久的’’,让length永远不为0。

二、数据展示的方式

  1. <el-tree current-node-key node-key="id" ref="tree" :default-expand-all="extend" :data="treeList"
  2. :props="defaultProps" @node-click="getScript">
  3. <span class="custom-tree-node" slot-scope="{ node }">
  4. <i style="marginLeft:6px;paddingRight:5px;" :class="data.icon"></i>
  5. <span class="node-label">
  6. <div :title="node.data.label" class="node-label-item">{{ node.label }}</div>
  7. </span>

image.png
这里的结构和第一种方案不一样,插槽span 下的第一个 就替代了原生图标,这里的data.icon,data就是后台返回的:data = “treeList”,而插槽中树节点node中还有很多像node.extended(是否展开状态,布尔值)这样的属性所以这个 中的:class 已经转交给后台返回的data中的icon 字段控制了。比如说,在一级目录层的数据中icon:”el-icon-folder” 这个图标就会显示成文件夹📂。这个时候加入node.extended做判断的话,就可以控制展开和折叠时的文件夹图标样式了。比如:class = “[node.extended?data.icon1:data.icon2]” 。这里重点注意子级目录的icon1和icon2 都要用同一个名称比如”el-icon-document”

也可以不用后台添加icon字段,前端完全写死也可以

  1. <i style="marginLeft:6px;paddingRight:5px;" :class="[data.isLeaf?'el-icon-document':(
  2. !node.expanded?'el-icon-folder':'el-icon-folder-opened')]"></i>
  3. // data.isLeaf表示是否是目录级或脚本 node.expanded 表示是否展开

:class在有多个样式的时候,可以用数组格式表示,并且用双引号包裹 :class = “[a,b,三元?表达:式]”

这里要注意一点,原有的el-tree会携带一个三角形的icon,要先清除掉该样式

  1. /* 树节点icon改造 */
  2. .el-tree /deep/ .el-tree-node__expand-icon.expanded {
  3. /* 不让icon在展开时旋转角度
  4. -webkit-transform: rotate(0deg);
  5. transform: rotate(0deg);
  6. /* rotate 定义 2D 旋转,在参数中规定角度。这里设置为0,就是清除原生小三角的90°旋转 */
  7. }
  8. .el-tree /deep/ .el-tree-node__expand-icon {
  9. /* 清除原生的三角形icon*/
  10. display: none;
  11. }
  12. .el-tree /deep/ .el-icon-folder {
  13. /* 折叠状态的文件夹样式 */
  14. color: #efb336;
  15. }
  16. .el-tree /deep/ .el-icon-folder-opened {
  17. /* 展开状态的文件夹样式 */
  18. color: #efb336;
  19. }
  20. .el-tree /deep/ .el-icon-document {
  21. /* 叶子级的文件样式 */
  22. color: #2a86bb;
  23. }

最终效果:
image.pngimage.pngimage.png