tree.vue 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. <template>
  2. <div class="cl-menu-tree">
  3. <el-popover
  4. ref="popover"
  5. placement="bottom-start"
  6. trigger="click"
  7. popper-class="popper-menu-tree"
  8. >
  9. <el-input size="small" v-model="filterValue">
  10. <i slot="prefix" class="el-input__icon el-icon-search"></i>
  11. </el-input>
  12. <el-tree
  13. ref="tree"
  14. node-key="menuId"
  15. :data="treeList"
  16. :props="props"
  17. :highlight-current="true"
  18. :expand-on-click-node="false"
  19. :default-expanded-keys="expandedKeys"
  20. :filter-node-method="filterNode"
  21. @current-change="currentChange"
  22. >
  23. </el-tree>
  24. </el-popover>
  25. <el-input v-model="name" v-popover:popover readonly placeholder="请选择"></el-input>
  26. </div>
  27. </template>
  28. <script>
  29. import { deepTree } from "cl-admin/utils";
  30. export default {
  31. name: "cl-menu-tree",
  32. props: {
  33. value: [Number, String]
  34. },
  35. data() {
  36. return {
  37. filterValue: "",
  38. list: [],
  39. props: {
  40. label: "name",
  41. children: "children"
  42. },
  43. expandedKeys: []
  44. };
  45. },
  46. watch: {
  47. filterValue(val) {
  48. this.$refs.tree.filter(val);
  49. }
  50. },
  51. computed: {
  52. name() {
  53. const item = this.list.find((e) => e.id == this.value);
  54. return item ? item.name : "一级菜单";
  55. },
  56. treeList() {
  57. return deepTree(this.list);
  58. }
  59. },
  60. mounted() {
  61. this.menuList();
  62. },
  63. methods: {
  64. currentChange({ id }) {
  65. this.$emit("input", id);
  66. },
  67. menuList() {
  68. this.$service.system.menu.list().then((res) => {
  69. let list = res.filter((e) => e.type != 2);
  70. list.unshift({
  71. name: "一级菜单",
  72. id: null
  73. });
  74. this.list = list;
  75. });
  76. },
  77. filterNode(value, data) {
  78. if (!value) return true;
  79. return data.name.indexOf(value) !== -1;
  80. }
  81. }
  82. };
  83. </script>
  84. <style lang="scss">
  85. .popper-menu-tree {
  86. width: 480px;
  87. box-sizing: border-box;
  88. .el-input {
  89. margin-bottom: 10px;
  90. }
  91. }
  92. </style>