|
@@ -0,0 +1,81 @@
|
|
|
+<template>
|
|
|
+ <div v-if="detail" class="birds-detail">
|
|
|
+ <div class="birds-detail-swipe">
|
|
|
+ <van-swipe ref="swipeRef" height="420">
|
|
|
+ <van-swipe-item v-for="(img, index) in detail.imgs" :key="img">
|
|
|
+ <van-image
|
|
|
+ lazy-load
|
|
|
+ fit="cover"
|
|
|
+ width="100%"
|
|
|
+ height="100%"
|
|
|
+ :src="img"
|
|
|
+ @click="handlePreview(index)"
|
|
|
+ />
|
|
|
+ </van-swipe-item>
|
|
|
+ <template #indicator="{ active, total }">
|
|
|
+ <div class="birds-detail__indicator">{{ active + 1 }}/{{ total }}</div>
|
|
|
+ </template>
|
|
|
+ </van-swipe>
|
|
|
+ <img
|
|
|
+ class="birds-detail-swipe__lf-icon"
|
|
|
+ src="@/assets/images/btn_left_beita@2x.png"
|
|
|
+ @click="handleSwipe('left')"
|
|
|
+ />
|
|
|
+ <img
|
|
|
+ class="birds-detail-swipe__rg-icon"
|
|
|
+ src="@/assets/images/btn_right_beita@2x.png"
|
|
|
+ @click="handleSwipe('right')"
|
|
|
+ />
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <div class="birds-detail-main">
|
|
|
+ <p class="birds-detail-main__title">{{ detail.title }}</p>
|
|
|
+ <p class="birds-detail-main__subtitle">{{ detail.subtitle }}</p>
|
|
|
+ <p class="birds-detail-main__author">{{ detail.author }}</p>
|
|
|
+ <p class="birds-detail-main__info" v-html="detail.content" />
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <van-image-preview
|
|
|
+ v-model:show="showPreview"
|
|
|
+ :images="detail?.imgs"
|
|
|
+ @change="(idx) => (previewIndex = idx)"
|
|
|
+ >
|
|
|
+ <template v-slot:index>第{{ previewIndex + 1 }}页</template>
|
|
|
+ </van-image-preview>
|
|
|
+</template>
|
|
|
+
|
|
|
+<script lang="ts" setup>
|
|
|
+import { ref, computed } from 'vue'
|
|
|
+import { useRoute } from 'vue-router'
|
|
|
+import { type SwipeInstance } from 'vant'
|
|
|
+import { useBirdsStore } from '@/stores/birds'
|
|
|
+
|
|
|
+const route = useRoute()
|
|
|
+const birds = useBirdsStore()
|
|
|
+const swipeRef = ref<SwipeInstance>()
|
|
|
+const showPreview = ref(false)
|
|
|
+const previewIndex = ref(0)
|
|
|
+const model = computed(() => birds.data.find((item) => item.id === Number(route.params.id)))
|
|
|
+const list = computed(() => model.value?.list.find((item) => item.id === Number(route.params.sid)))
|
|
|
+const detail = computed(
|
|
|
+ () => list.value?.list.find((item) => item.id === Number(route.params.detailId))
|
|
|
+)
|
|
|
+
|
|
|
+const handleSwipe = (type: 'left' | 'right') => {
|
|
|
+ if (type === 'left') {
|
|
|
+ swipeRef.value?.prev()
|
|
|
+ } else {
|
|
|
+ swipeRef.value?.next()
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+const handlePreview = (idx: number) => {
|
|
|
+ previewIndex.value = idx
|
|
|
+ showPreview.value = true
|
|
|
+}
|
|
|
+</script>
|
|
|
+
|
|
|
+<style lang="scss" scoped>
|
|
|
+@import url('./index.scss');
|
|
|
+</style>
|