deepTree.vue 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. <template>
  2. <el-tree
  3. :data="treeList"
  4. :props="defaultProps"
  5. accordion
  6. :expand-on-click-node="false"
  7. node-key="code"
  8. :default-expand-all="false"
  9. class="tree"
  10. >
  11. <span class="custom-tree-node" slot-scope="{ node, data }">
  12. <el-tooltip v-if="node.label.length > 8" effect="dark" :content="node.label" placement="top-start">
  13. <span @click="handleNodeClick(node, data)">{{ node.label.slice(0, 5) + '...' }}</span>
  14. </el-tooltip>
  15. <span @click="handleNodeClick(node, data)" v-else>{{ node.label }}</span>
  16. <span v-if="operation">
  17. <el-button @click="edit(node)" type="text" size="mini" icon="el-icon-edit"></el-button>
  18. <el-button @click="remove(data)" type="text" size="mini" icon="el-icon-delete"></el-button>
  19. </span>
  20. </span>
  21. </el-tree>
  22. </template>
  23. <script>
  24. export default {
  25. props: {
  26. // 控件渲染数据源
  27. data: { type: Array, default: () => [] },
  28. // 是否启用修改删除操作
  29. operation: { type: Boolean, default: false }
  30. },
  31. computed: {
  32. treeList() {
  33. return this.$tree(this.data) ?? [];
  34. }
  35. },
  36. data() {
  37. return {
  38. defaultProps: {
  39. children: 'children',
  40. label: 'name'
  41. }
  42. };
  43. },
  44. mounted() {},
  45. methods: {
  46. // 选择事件
  47. handleNodeClick(node, data) {
  48. this.$emit('nodeClick', { node, data });
  49. },
  50. // 修改事件
  51. edit(node) {
  52. this.$emit('edit', node?.data);
  53. },
  54. // 删除事件
  55. remove(data) {
  56. this.$confirm('此操作将永久删除该数据, 是否继续?', '提示', { type: 'warning' })
  57. .then(_ => {
  58. this.$emit('remove', data);
  59. })
  60. .catch(_ => {});
  61. }
  62. }
  63. };
  64. </script>
  65. <style lang="scss" scoped>
  66. .custom-tree-node {
  67. flex: 1;
  68. display: flex;
  69. align-items: center;
  70. justify-content: space-between;
  71. font-size: 14px;
  72. padding-right: 8px;
  73. }
  74. .tree {
  75. // background: #f7f7f7;
  76. ::v-deep .el-tree-node__content {
  77. // background-color: #f50202 !important;
  78. // background-colo#ff0000e7e7e7 !important;
  79. .custom-tree-node {
  80. color: #006efd;
  81. font-size: 18px;
  82. font-weight: 700;
  83. font-family: '宋体';
  84. // span {}
  85. }
  86. }
  87. ::v-deep .el-tree-node__children .el-tree-node .el-tree-node__content {
  88. background-color: #f0f0f0 !important;
  89. margin: 8px 0 !important;
  90. padding-left: 0 !important;
  91. margin-left: 36px !important;
  92. .custom-tree-node {
  93. color: #409EFF;
  94. font-size: 14px;
  95. font-weight: 600;
  96. font-family: '宋体';
  97. // span {}
  98. }
  99. }
  100. ::v-deep .el-tree-node__children .el-tree-node .el-tree-node__children .el-tree-node .el-tree-node__content {
  101. background-color: #f5f8fa !important;
  102. margin: 8px 0 !important;
  103. padding-left: 0 !important;
  104. margin-left: 72px !important;
  105. .custom-tree-node {
  106. color: #2ca0ff;
  107. font-size: 12px;
  108. font-weight: 500;
  109. font-family: '宋体';
  110. // span {}
  111. }
  112. }
  113. }
  114. </style>