index.vue 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183
  1. <template>
  2. <div class="tree-wrapper">
  3. <el-tree
  4. :data="treeList"
  5. :props="defaultProps"
  6. v-loading="treeLoading"
  7. :node-key="nodeKey"
  8. ref="tree"
  9. :highlight-current="true"
  10. :expand-on-click-node="false"
  11. @node-click="handleNodeClick"
  12. v-bind="$attrs"
  13. :default-expand-all="defaultExpandAll"
  14. :default-expanded-keys="defaultExpandedKeys"
  15. >
  16. </el-tree>
  17. </div>
  18. </template>
  19. <script>
  20. import {getProduceTreeByCode, getTreeByPid} from '@/api/custom';
  21. // let originId = '';
  22. // let originType = '';
  23. export default {
  24. props: {
  25. // treeList私有化处理
  26. treeFormate: {
  27. type: Function,
  28. default: null
  29. },
  30. defaultProps: {
  31. type: Object,
  32. default: function () {
  33. return {
  34. children: 'children',
  35. value: 'id',
  36. label: 'name'
  37. };
  38. }
  39. },
  40. defaultExpandAll: {
  41. type: Boolean,
  42. default: function () {
  43. return true;
  44. }
  45. },
  46. defaultExpandedKeys: {
  47. type: Array,
  48. default: () => {
  49. return [];
  50. }
  51. },
  52. // 初始请求treeList
  53. init: {
  54. type: Boolean,
  55. default: true
  56. },
  57. isFirstRefreshTable: {
  58. type: Boolean,
  59. default: true
  60. },
  61. id: {
  62. type: String,
  63. default: '0'
  64. },
  65. code: {
  66. type: String,
  67. default: ''
  68. },
  69. nodeKey: {
  70. type: String,
  71. default: 'id'
  72. }
  73. // appendRoot: {
  74. // type: Boolean,
  75. // default: false
  76. // },
  77. },
  78. data() {
  79. return {
  80. treeList: [],
  81. treeLoading: false,
  82. parentName: '',
  83. parentId: '',
  84. currentKey: ''
  85. };
  86. },
  87. async mounted() {
  88. if (this.init) {
  89. if (this.code) {
  90. let typeObj = await getProduceTreeByCode(this.code);
  91. await this.getTreeData(typeObj[0]?.id);
  92. } else {
  93. await this.getTreeData(this.id);
  94. }
  95. }
  96. },
  97. methods: {
  98. getInstance() {
  99. return this.$refs.tree;
  100. },
  101. // 获取树结构数据
  102. async getTreeData(id) {
  103. try {
  104. this.treeLoading = true;
  105. const res = await getTreeByPid(id);
  106. this.treeLoading = false;
  107. if (res?.code === '0') {
  108. this.treeList = res.data;
  109. this.$emit('setRootId', res.data[0].id);
  110. if (this.treeFormate) {
  111. this.treeList = this.treeFormate(this.treeList);
  112. }
  113. this.$nextTick(() => {
  114. // 默认高亮第一级树节点
  115. if (this.treeList[0] && this.isFirstRefreshTable) {
  116. this.setCurrentKey(this.treeList[0].id);
  117. this.handleNodeClick(
  118. this.treeList[0],
  119. this.$refs.tree.getCurrentNode()
  120. );
  121. }
  122. });
  123. return this.treeList;
  124. }
  125. } catch (error) {
  126. console.error(error);
  127. }
  128. this.treeLoading = false;
  129. },
  130. // 递归 - 往树children里面添加parentName
  131. // _setParentName (tree) {
  132. // let data = tree;
  133. // for (let i = 0; i < data.length; i++) {
  134. // if (data[i].parentId === '0') {
  135. // this.parentName = data[i].name;
  136. // originId = data[i].id;
  137. // originType = data[i].type;
  138. // }
  139. // data[i]['originId'] = originId;
  140. // data[i]['originType'] = originType;
  141. // data[i]['parentId'] = data[i]['parentId'];
  142. // if (data[i].children && data[i].children.length > 0) {
  143. // this._setParentName(data[i].children);
  144. // }
  145. // }
  146. // return data;
  147. // },
  148. handleNodeClick(data, node) {
  149. this.$emit('handleNodeClick', data, node);
  150. },
  151. // 设置默认高亮行
  152. setCurrentKey(id) {
  153. this.currentKey = id;
  154. this.$refs.tree.setCurrentKey(this.currentKey);
  155. },
  156. // 获取树的选中状态
  157. getSelectList() {
  158. const selectList = this.$refs.tree.getCurrentNode();
  159. return selectList;
  160. }
  161. }
  162. };
  163. </script>
  164. <style lang="scss" scoped>
  165. .tree-wrapper {
  166. width: 100%;
  167. height: 100%;
  168. overflow: auto;
  169. :deep(.el-tree) {
  170. display: inline-block;
  171. min-width: 100%;
  172. }
  173. }
  174. </style>