dept-tree.vue 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. <template>
  2. <div class="nav-tree">
  3. <el-tree ref="tree" :data="treeItems" :props="navProps" node-key="id" @node-click="handleNavClick" :highlight-current="true"></el-tree>
  4. </div>
  5. </template>
  6. <script>
  7. export default {
  8. props: {
  9. navItems: Array,
  10. dataItems: Array,
  11. },
  12. data() {
  13. return {
  14. navProps: {
  15. children: 'children',
  16. label: 'name',
  17. },
  18. };
  19. },
  20. methods: {
  21. handleNavClick(data) {
  22. this.$emit('selected', data);
  23. },
  24. setCurrentKey(key) {
  25. this.$refs['tree'].setCurrentKey(key);
  26. },
  27. },
  28. computed: {
  29. treeItems() {
  30. if (this.navItems) return this.navItems;
  31. const items = this.dataItems || [];
  32. const root = items.filter(a => !items.some(b => b.id === a.parentid));
  33. const fetchChildren = item => {
  34. if (!item.path) item.path = [item.name];
  35. const children = items.filter(p => p.parentid === item.id).map(p => fetchChildren({ ...p, parent: item, path: item.path.concat(p.name) }));
  36. return { ...item, children };
  37. };
  38. return root.map(p => fetchChildren(p));
  39. },
  40. },
  41. };
  42. </script>
  43. <style lang="less" scoped>
  44. .nav-tree {
  45. /deep/ .el-tree-node.is-current > .el-tree-node__content {
  46. background-color: #409eff;
  47. color: white;
  48. .naf-icon-dian {
  49. display: inline;
  50. color: white;
  51. }
  52. }
  53. /deep/ .naf-icon-dian {
  54. display: none;
  55. }
  56. /deep/ .el-tree-node__content:hover .naf-icon-dian {
  57. display: inline;
  58. }
  59. }
  60. </style>