| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151 |
- <template>
- <!-- TAB分页的详情页 -->
- <view class="d-flex flex-col bg-base">
- <SimplePageContentLoader :loader="loader">
- <template v-if="loader.content.value">
- <view class="d-flex flex-col">
- <!-- 轮播大图 -->
- <ImageSwiper
- v-if="showHead"
- :images="loader.content.value.images"
- />
- <!-- 标题区域 -->
- <view class="d-flex flex-col mt-3 p-3">
- <slot name="title" :content="loader.content.value">
- <view class="d-flex flex-col">
- <view class="d-flex flex-row align-center">
- <text :class="'size-lll font-songti font-bold color-text-content flex-shrink-1 mr-2' + (props.showDeadBox && loader.content.value.titleBox ? ' border-all-text' : '')">
- {{ loader.content.value.title }}
- </text>
- <slot name="titleEnd" :content="loader.content.value" />
- </view>
- <text class="size-base color-text-content-second mt-2">{{ loader.content.value.desc }}</text>
- </view>
- </slot>
- <slot name="titleExtra" :content="loader.content.value" />
- </view>
- <!-- 内容切换标签 -->
- <view class="ml-2 mr-2">
- <Tabs
- :tabs="tabs"
- v-model:currentIndex="tabCurrentIndex"
- :autoScroll="true"
- :autoItemWidth="false"
- :defaultIndicatorWidth="130"
- :width="710"
- class="top-tab"
- />
- </view>
- <view class="d-flex flex-col radius-l bg-light p-25 mt-3" style="min-height:70vh">
- <slot name="extraTabs" :tabCurrentId="tabCurrentId" :content="loader.content.value" />
- </view>
- <ContentNote />
- </view>
- <LikeFooter :content="loader.content.value">
- <template #left>
- <ArticleCorrect :content="loader.content.value" />
- </template>
- </LikeFooter>
- </template>
- </SimplePageContentLoader>
- </view>
- </template>
- <script setup lang="ts">
- import { computed } from "vue";
- import { useSimplePageContentLoader } from "@/common/composeabe/SimplePageContentLoader";
- import { useLoadQuerys } from "@/common/composeabe/LoadQuerys";
- import { useTabControl } from "@/common/composeabe/TabControl";
- import SimplePageContentLoader from "@/common/components/SimplePageContentLoader.vue";
- import ImageSwiper from "@/pages/parts/ImageSwiper.vue";
- import ContentNote from "@/pages/parts/ContentNote.vue";
- import Tabs from "@/components/nav/Tabs.vue";
- import LikeFooter from "@/pages/parts/LikeFooter.vue";
- import ArticleCorrect from "@/pages/parts/ArticleCorrect.vue";
- import type { GetContentDetailItem } from "@/api/CommonContent";
- import type { DetailTabPageProps, DetailTabPageTabsArray } from "./DetailTabPage";
- const props = withDefaults(defineProps<DetailTabPageProps>(), {
- extraTabs: () => [],
- showHead: true,
- showDeadBox: false,
- })
- const emit = defineEmits([
- "tabChange",
- "loaded"
- ])
- const emptyContent = computed(() => {
- return !(loader.content.value?.intro as string || '').trim() && !(loader.content.value?.content || '').trim();
- })
- const loader = useSimplePageContentLoader<
- GetContentDetailItem,
- { id: number }
- >(async (params) => {
- if (!params)
- throw new Error("!params");
- if (!props.load)
- throw new Error("!props.load");
- const d = await props.load(params.id, tabsArrayObject);
- if (d.title)
- uni.setNavigationBarTitle({ title: d.title });
- setTimeout(() => {
- if (emptyContent.value) {
- if (d.video)
- tabCurrentIndex.value = 1;
- else if (d.video)
- tabCurrentIndex.value = 2;
- }
- }, 200);
- emit("loaded", d);
- return d;
- });
- const {
- tabCurrentId,
- tabCurrentIndex,
- tabsArray,
- tabs,
- } = useTabControl({
- tabs: props.extraTabs,
- onTabChange(a, b) {
- emit("tabChange", a, b);
- },
- })
- const tabsArrayObject : DetailTabPageTabsArray = {
- tabsArray,
- getTabById(id: number) {
- return tabsArray.value.find(t => t.id == id);
- }
- }
- useLoadQuerys({ id : 0 }, (p) => loader.loadData(p));
- defineExpose({
- load(params: { id: number }) {
- loader.loadData(params, true);
- },
- getPageShareData() {
- const content = loader.content.value;
- if (!content)
- return {};
- const res = {
- title: content.title,
- imageUrl: content.image,
- };
- return res;
- }
- })
- </script>
- <style lang="scss">
- </style>
|