elTree.vue 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294
  1. <template>
  2. <div class="treePanel">
  3. <el-tree
  4. ref="tree"
  5. :data="data"
  6. node-key="id"
  7. :props="defaultProps"
  8. :default-expand-all="true"
  9. :expand-on-click-node="false"
  10. ></el-tree>
  11. </div>
  12. </template>
  13. <script>
  14. //import from '';
  15. export default {
  16. name: "Tree", //
  17. components: {},
  18. data() {
  19. return {
  20. // data1: [
  21. // {
  22. // label: "一级 3",
  23. // children: [
  24. // {
  25. // label: "二级 3-1",
  26. // children: [
  27. // {
  28. // label: "三级 3-1-1",
  29. // },
  30. // {
  31. // label: "三级 3-1-2",
  32. // },
  33. // ],
  34. // },
  35. // {
  36. // label: "二级 3-2",
  37. // children: [
  38. // {
  39. // label: "三级 3-2-1",
  40. // children: [
  41. // {
  42. // label: "四级 3-2-1四级 3-2-1四级 3-2-1四级 3-2-1",
  43. // },
  44. // {
  45. // label: "四级 3-2-2",
  46. // },
  47. // {
  48. // label: "四级 3-2-3",
  49. // },
  50. // {
  51. // label: "四级 3-2-3",
  52. // },
  53. // {
  54. // label: "四级 3-2-3",
  55. // },
  56. // {
  57. // label: "四级 3-2-3",
  58. // },
  59. // ],
  60. // },
  61. // {
  62. // label: "三级 3-2-2",
  63. // children: [
  64. // {
  65. // label: "四级 3-2-1",
  66. // },
  67. // {
  68. // label: "四级 3-2-2",
  69. // },
  70. // {
  71. // label: "四级 3-2-3",
  72. // },
  73. // ],
  74. // },
  75. // {
  76. // label: "三级 3-2-3",
  77. // children: [
  78. // {
  79. // label: "四级 3-2-1",
  80. // },
  81. // {
  82. // label: "四级 3-2-2",
  83. // },
  84. // {
  85. // label: "四级 3-2-3",
  86. // },
  87. // ],
  88. // },
  89. // ],
  90. // },
  91. // ],
  92. // },
  93. // ],
  94. defaultProps: {
  95. children: "children",
  96. label: "treeNode",
  97. disabled: "weightErr", // 用于权重的报错提示
  98. },
  99. };
  100. },
  101. props: {
  102. data: {
  103. type: Array,
  104. default: [],
  105. },
  106. },
  107. watch: {
  108. data(val) {
  109. if (val && val.length > 0) {
  110. this.domHandel();
  111. }
  112. },
  113. },
  114. methods: {
  115. domHandel() {
  116. this.$nextTick(() => {
  117. $(".el-tree-node__label").parent().next().each((i, item) => {
  118. if (!$(item).html()) {
  119. $(item)
  120. .prev()
  121. .find(".el-tree-node__label")
  122. .addClass("noChildren");
  123. }
  124. });
  125. $(
  126. ".el-tree > .el-tree-node > .el-tree-node__content > .el-tree-node__label"
  127. ).addClass("noParent");
  128. $(".el-tree-node__children").each((i, item) => {
  129. if($(item).children('.el-tree-node').eq(0).children('.el-tree-node__content')
  130. .children('.el-tree-node__label').html()) {
  131. let width = $(item).children('.el-tree-node').eq(0).children('.el-tree-node__content')
  132. .children('.el-tree-node__label').outerWidth();
  133. let left = $(item).children('.el-tree-node').eq(0).children('.el-tree-node__content')
  134. .css('padding-left');
  135. let prev = $(item).children('.el-tree-node').eq(0).children('.el-tree-node__content')
  136. .children('.el-tree-node__label').parent().parent().parent().prev()
  137. .children('.el-tree-node__label').outerWidth();
  138. let left1 = $(item).children('.el-tree-node').eq(0).children('.el-tree-node__content')
  139. .children('.el-tree-node__label').parent().parent().parent().prev()
  140. .css('padding-left');
  141. let cur = Math.min(width/2+parseFloat(left),prev/2+parseFloat(left1))
  142. let b = "<b style='width:"+cur+"px'></b>";
  143. $(item).children('.el-tree-node').eq(0).children('.el-tree-node__content')
  144. .children('.el-tree-node__label').before(b);
  145. let len = $(item).children('.el-tree-node').length;
  146. let width1 = $(item).children('.el-tree-node').eq(len-1).children('.el-tree-node__content')
  147. .outerWidth();
  148. let right = $(item).children('.el-tree-node').eq(len-1).children('.el-tree-node__content')
  149. .css('padding-left');
  150. let width2 = $(item).children('.el-tree-node').eq(len-1).children('.el-tree-node__content')
  151. .children('.el-tree-node__label').outerWidth();
  152. let i = "<i style='width:"+(width1-width2/2-parseFloat(right))+"px'></i>";
  153. $(item).children('.el-tree-node').eq(len-1).children('.el-tree-node__content')
  154. .children('.el-tree-node__label').before(i);
  155. }
  156. });
  157. });
  158. },
  159. },
  160. mounted() {
  161. this.domHandel();
  162. },
  163. };
  164. </script>
  165. <style lang='less' scoped>
  166. .treePanel {
  167. display: inline-block;
  168. padding-right: 10px;
  169. overflow: auto;
  170. }
  171. /deep/ .el-tree {
  172. * {
  173. cursor: default;
  174. }
  175. .el-tree-node[aria-disabled=true] {
  176. color: inherit;
  177. }
  178. .el-tree-node[aria-disabled=true] > .el-tree-node__content {
  179. color: red;
  180. }
  181. .el-tree-node.is-expanded > .el-tree-node__children {
  182. display: flex;
  183. // justify-content: space-between;
  184. }
  185. .el-tree-node__expand-icon.expanded {
  186. display: none;
  187. }
  188. .el-tree-node .el-tree-node__content {
  189. position: relative;
  190. height: 60px;
  191. line-height: 60px;
  192. > b {
  193. position: absolute;
  194. top: 0;
  195. left: 0;
  196. z-index: 6;
  197. width: 100%;
  198. height: 1px;
  199. border-top: 1px solid #ffffff;
  200. }
  201. > i {
  202. position: absolute;
  203. top: 0;
  204. right: 0;
  205. z-index: 6;
  206. width: 100%;
  207. height: 1px;
  208. border-top: 1px solid #ffffff;
  209. }
  210. }
  211. .el-tree-node__label {
  212. position: relative;
  213. &:before {
  214. content: "";
  215. display: block;
  216. position: absolute;
  217. left: 50%;
  218. top: 0;
  219. width: 1px;
  220. height: 20px;
  221. border-left: 1px solid @themeColor;
  222. }
  223. &:after {
  224. content: "";
  225. display: block;
  226. position: absolute;
  227. left: 50%;
  228. bottom: 0;
  229. width: 1px;
  230. height: 20px;
  231. border-left: 1px solid @themeColor;
  232. }
  233. &.noParent:before,
  234. &.noChildren:after {
  235. display: none;
  236. }
  237. }
  238. .el-tree-node__children {
  239. position: relative;
  240. &:before {
  241. content: "";
  242. display: block;
  243. position: absolute;
  244. left: 0;
  245. top: 0;
  246. width: 100%;
  247. height: 1px;
  248. border-top: 1px solid @themeColor;
  249. }
  250. }
  251. .el-icon-caret-right {
  252. display: none;
  253. }
  254. }
  255. </style>