index.vue 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. <template>
  2. <el-row>
  3. <el-col :span="24">
  4. <el-segmented v-model="value" :options="options" @change="viewChange" block>
  5. <template #default="{ item }"> {{ item.label }} </template>
  6. </el-segmented>
  7. <el-divider />
  8. <template v-if="!value">
  9. <el-alert title="请在上方选择您要查看的数据" type="warning" effect="dark" :closable="false" />
  10. </template>
  11. <template v-else>
  12. <component :is="viewComponent"></component>
  13. </template>
  14. </el-col>
  15. </el-row>
  16. </template>
  17. <script setup>
  18. import { get } from 'lodash-es'
  19. import { defineAsyncComponent } from 'vue'
  20. const componentList = ref({
  21. 'admin-menus': defineAsyncComponent(() => import('./parts/admin-menus.vue')),
  22. 'user-menus': defineAsyncComponent(() => import('./parts/user-menus.vue')),
  23. dict: defineAsyncComponent(() => import('./parts/dict.vue')),
  24. region: defineAsyncComponent(() => import('./parts/region.vue')),
  25. 'system-func': defineAsyncComponent(() => import('./parts/system-func.vue')),
  26. })
  27. const value = ref()
  28. const viewComponent = ref()
  29. /**
  30. * 子页面设置
  31. * @param label 子页面名称
  32. * @param value 子页面id
  33. * @param component 子页面文件名,需要与代码中的页面对应,上面componentList设置的key
  34. */
  35. const route = useRoute()
  36. const path = get(route, 'path')
  37. import { UserStore } from '@/store/user'
  38. const userStore = UserStore()
  39. const menus = userStore.menus
  40. const thisRouteConfig = menus.find((f) => f.path === path)
  41. const children = get(thisRouteConfig, 'children', [])
  42. const options = children.map((i) => {
  43. const obj = {
  44. label: get(i, 'name'),
  45. value: get(i, 'id'),
  46. component: get(i, 'component')
  47. }
  48. return obj
  49. })
  50. const viewChange = (val) => {
  51. const i = options.find((f) => f.value === val)
  52. if (!i) return
  53. const componentName = get(i, 'component')
  54. if (!componentName) return
  55. const component = componentList.value[componentName]
  56. if (!component) return
  57. viewComponent.value = component
  58. }
  59. </script>
  60. <style scoped></style>