TabsPage.vue 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. <script setup lang="ts">
  2. import { ref, type PropType } from 'vue';
  3. import { useTheme } from '../theme/ThemeDefine';
  4. import Tabs, { type TabsItemData, type TabsProps } from './Tabs.vue';
  5. const props = defineProps({
  6. tabs: {
  7. type: Object as PropType<TabsItemData[]>,
  8. default: () => []
  9. },
  10. tabProps: {
  11. type: Object as PropType<Omit<TabsProps, 'tabs'|'currentIndex'>>,
  12. default: () => ({})
  13. },
  14. firstActiveIndex: {
  15. type: Number,
  16. default: 0,
  17. },
  18. innerStyle: {
  19. type: Object,
  20. default: () => ({})
  21. },
  22. });
  23. defineOptions({
  24. options: {
  25. virtualHost: true,
  26. styleIsolation: "shared",
  27. }
  28. })
  29. const activeIndex = ref(props.firstActiveIndex);
  30. const loadedState = ref<boolean[]>([]);
  31. const theme = useTheme();
  32. </script>
  33. <template>
  34. <view class="nana-tabs-page" :style="innerStyle">
  35. <Tabs
  36. v-model:currentIndex="activeIndex"
  37. :tabs="tabs"
  38. />
  39. <view
  40. v-for="(t, i) in tabs"
  41. v-show="activeIndex===i"
  42. class="nana-tabs-page-inner"
  43. :key="i"
  44. >
  45. <slot v-if="!t.lazy || loadedState[i]"
  46. name="page"
  47. :key="i"
  48. :text="tabs[i].text"
  49. />
  50. </view>
  51. </view>
  52. </template>
  53. <style lang="scss">
  54. .nana-tabs-page {
  55. position: relative;
  56. width: 100%;
  57. .nana-tabs-page-inner {
  58. width: 100%;
  59. min-height: 200rpx;
  60. flex: 1;
  61. }
  62. }
  63. </style>