menuTreeSelect.vue 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. <template>
  2. <a-tree-select
  3. v-model:value="defaultSelectKeys"
  4. show-search
  5. class="xn-wd"
  6. :dropdown-style="{ maxHeight: '400px', overflow: 'auto' }"
  7. placeholder="请选择菜单"
  8. :field-names="treeFieldNames"
  9. allow-clear
  10. multiple
  11. tree-default-expand-all
  12. :tree-data="menu"
  13. >
  14. </a-tree-select>
  15. </template>
  16. <script setup name="menuTreeSelect">
  17. import tool from '@/utils/tool'
  18. import { onMounted } from 'vue'
  19. const defaultSelectKeys = ref([])
  20. const menu = ref([])
  21. const props = defineProps({
  22. defaultSelectKeys: {
  23. type: Array,
  24. default: () => [],
  25. required: false
  26. },
  27. defaultSelectData: {
  28. type: Array,
  29. default: () => [],
  30. required: false
  31. },
  32. resultData: {
  33. type: Boolean,
  34. default: () => false,
  35. required: false
  36. }
  37. })
  38. const treeFieldNames = { children: 'children', title: 'title', key: 'id', value: 'id' }
  39. onMounted(() => {
  40. // 设置选中项目,调用的地方可传纯id数组,或者是对象型数组
  41. if (!props.defaultSelectKeys) {
  42. defaultSelectKeys.value = props.defaultSelectData.map((m) => {
  43. return m.id
  44. })
  45. } else {
  46. defaultSelectKeys.value = props.defaultSelectKeys
  47. }
  48. menu.value = traverseChildren(tool.data.get('MENU'))
  49. })
  50. // 遍历增加属性
  51. const traverseChildren = (data = []) => {
  52. // 递归遍历控件树
  53. const traverse = (array) => {
  54. array.forEach((element) => {
  55. if (element.children) {
  56. // 设置支节点不可选择
  57. element.selectable = false
  58. traverse(element.children)
  59. }
  60. })
  61. }
  62. traverse(data)
  63. return data
  64. }
  65. // 遍历增加属性
  66. const traverseResultDataList = (menu, data = []) => {
  67. const result = []
  68. // 递归遍历控件树
  69. const traverse = (array) => {
  70. array.forEach((element) => {
  71. if (data) {
  72. data.forEach((item) => {
  73. if (item === element.id) {
  74. const obj = {
  75. id: element.id,
  76. title: element.title,
  77. icon: element.icon,
  78. path: element.path
  79. }
  80. result.push(obj)
  81. }
  82. })
  83. }
  84. if (element.children) {
  85. traverse(element.children)
  86. }
  87. })
  88. }
  89. traverse(menu)
  90. return result
  91. }
  92. // 获取选择的数据
  93. const getSelectData = () => {
  94. if (props.resultData) {
  95. return traverseResultDataList(menu.value, defaultSelectKeys.value)
  96. }
  97. return defaultSelectKeys.value
  98. }
  99. // 设置回显的数据
  100. const setSelectData = (data) => {
  101. defaultSelectKeys.value = data.map((m) => {
  102. return m.id
  103. })
  104. }
  105. defineExpose({
  106. getSelectData,
  107. setSelectData
  108. })
  109. </script>