banner.vue 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. <script setup lang="ts">
  2. import { getBanners } from '../../../core/libs/requests'
  3. import { BannerMode } from '../../../core/libs/models'
  4. import { useRouter } from '../../../core/utils/router'
  5. const props = defineProps<{ mode: BannerMode; aspect?: string }>()
  6. const router = useRouter()
  7. const { data: banners, run: setBanners } = useRequest(() => getBanners({ mode: props.mode }), {
  8. initialData: [],
  9. })
  10. const current = ref<number>(0)
  11. const swiperList = computed(() => banners.value.map((it) => it.bannerImgUrl))
  12. const handleClick = ({ index }: { index: number }) => {
  13. const banner = banners.value[index]
  14. console.log(banner)
  15. if (!banner.bannerLinkUrl && !banner.bannerDetailsContent) return
  16. if (banner.bannerDetailsType === '2') {
  17. if (banner.bannerLinkUrl?.startsWith('http')) {
  18. router.push(`/pages-sub/common/webview/index?url=${banner.bannerLinkUrl}`)
  19. } else {
  20. router.push(banner.bannerLinkUrl)
  21. }
  22. }
  23. if (banner.bannerDetailsType === '1') {
  24. router.push(`/pages-sub/home/content/index?type=banner&id=${banner.id}`)
  25. }
  26. }
  27. function onChange(e) {
  28. // console.log(e)
  29. }
  30. onMounted(() => {
  31. setBanners()
  32. })
  33. </script>
  34. <template>
  35. <div v-if="swiperList.length">
  36. <wd-swiper
  37. custom-class="rounded-2xl overflow-hidden aspect-[2.71/1]"
  38. :custom-style="`aspect-ratio: ${props.aspect ?? '2.71/1'}`"
  39. width="100%"
  40. height="100%"
  41. :list="swiperList"
  42. autoplay
  43. v-model:current="current"
  44. :indicator="{ type: 'dots-bar' } as any"
  45. @click="handleClick"
  46. @change="onChange"
  47. ></wd-swiper>
  48. </div>
  49. </template>