RouterMenu.vue 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. <template>
  2. <el-scrollbar>
  3. <div class="hc-router-tab-box">
  4. <div :class="barRoutes.key === 'datav' ? 'cur' : ''" class="hc-router-tab-item" @click="barDatavClick">
  5. <span>数据看板</span>
  6. </div>
  7. <template v-for="(item, index) in barMenuData" :key="item.key">
  8. <div :class="item.key === barRoutes.key ? 'cur' : ''" class="hc-router-tab-item" @click="barMenuClick(item)" @contextmenu.prevent="barMenuContextMenu($event, item, index)">
  9. <span>{{ item.title }}</span>
  10. <div class="close-icon" @click.stop="barMenuCloseClick(item, index)">
  11. <HcIcon name="close" />
  12. </div>
  13. </div>
  14. </template>
  15. </div>
  16. </el-scrollbar>
  17. <!-- 右键菜单 -->
  18. <HcContextMenu ref="contextMenuRef" :datas="menusData" @item-click="handleMenuSelect" />
  19. </template>
  20. <script setup>
  21. import { onMounted, ref, watch } from 'vue'
  22. import { useRoute, useRouter } from 'vue-router'
  23. import { getStore, setStore } from 'hc-vue3-ui'
  24. import { useAppStore } from '~src/store'
  25. const emit = defineEmits(['load'])
  26. //初始组合式
  27. const router = useRouter()
  28. const useRoutes = useRoute()
  29. const store = useAppStore()
  30. //初始变量
  31. const barMenuData = ref(getStore('bar-menu-datas') || [])
  32. const barRoutes = ref({ key: '', path: '', title: '', query: null })
  33. //渲染完成
  34. onMounted(() => {
  35. const { name, path, meta, query } = useRoutes
  36. barRoutes.value = { path, key: name, title: meta?.title, query }
  37. setBarMenuData()
  38. })
  39. //监听
  40. watch(() => [
  41. useRoutes?.name,
  42. useRoutes?.path,
  43. useRoutes?.query,
  44. useRoutes?.meta?.title,
  45. ], ([key, path, query, title]) => {
  46. barRoutes.value = { path, key, title, query }
  47. setBarMenuData()
  48. })
  49. //设置菜单数据
  50. const setBarMenuData = () => {
  51. const { key, path, title, query } = barRoutes.value
  52. if (['home', 'home-index', 'datav'].indexOf(key) === -1) {
  53. const index = barMenuData.value.findIndex(item => item.key === key)
  54. if (index === -1) {
  55. barMenuData.value.push({ path, key: key, title, query })
  56. }
  57. setStore('bar-menu-datas', barMenuData.value)
  58. }
  59. emit('load', barRoutes.value)
  60. }
  61. //跳转到数据看板
  62. const barDatavClick = () => {
  63. const { key, path } = barRoutes.value
  64. if (key !== 'datav') {
  65. router.push({ name: 'statistics-datav', query:{ from: path } })
  66. }
  67. }
  68. //菜单被点击
  69. const barMenuClick = (item) => {
  70. const { key } = barRoutes.value
  71. if (key !== item.key) {
  72. router.push({ name: item.key, query: item.query })
  73. }
  74. }
  75. //鼠标右键菜单
  76. const contextMenuRef = ref(null)
  77. const barItem = ref({})
  78. const barItemIndex = ref(0)
  79. const menusData = ref([
  80. { label: '关闭当前', key: 'close' },
  81. { label: '关闭所有', key: 'all' },
  82. { label: '关闭其它', key: 'other' },
  83. ])
  84. const barMenuContextMenu = (event, item, index) => {
  85. event.preventDefault()
  86. barItem.value = item
  87. barItemIndex.value = index
  88. contextMenuRef.value?.showMenu(event)
  89. }
  90. //鼠标右键菜单被点击
  91. const handleMenuSelect = ({ key }) => {
  92. if (key === 'close') {
  93. barMenuCloseClick(barItem.value, barItemIndex.value)
  94. } else if (key === 'all') {
  95. barMenuData.value = []
  96. setStore('bar-menu-datas', [])
  97. router.push({ name: store.homeUrl })
  98. } else if (key === 'other') {
  99. const { key } = barRoutes.value
  100. barMenuData.value = barMenuData.value.filter(item => item.key === key)
  101. setStore('bar-menu-datas', barMenuData.value)
  102. }
  103. }
  104. //菜单关闭被点击
  105. const barMenuCloseClick = (item, index) => {
  106. const total = barMenuData.value.length - 1
  107. const { key } = barRoutes.value
  108. barMenuData.value.splice(index, 1)
  109. if (key === item.key) {
  110. let items = {}
  111. const indexs = barMenuData.value.length - 1
  112. if (total > index) {
  113. items = barMenuData.value[index]
  114. } else if (indexs >= 0) {
  115. items = barMenuData.value[indexs]
  116. }
  117. if (indexs < 0) {
  118. setStore('bar-menu-datas', barMenuData.value)
  119. router.push({ name: store.homeUrl })
  120. } else {
  121. barRoutes.value = items
  122. setStore('bar-menu-datas', barMenuData.value)
  123. router.push({ name: items.key, query: items.query })
  124. }
  125. } else {
  126. setStore('bar-menu-datas', barMenuData.value)
  127. }
  128. }
  129. </script>