import {useEffect, useState} from 'react' import {View} from '@tarojs/components' import {Swiper} from '@nutui/nutui-react-taro' import {CmsAd} from "@/api/cms/cmsAd/model"; import {Image} from '@nutui/nutui-react-taro' import {getCmsAdByCode} from "@/api/cms/cmsAd"; import navTo from "@/utils/common"; import {pageCmsArticle} from "@/api/cms/cmsArticle"; type AdImage = { url?: string path?: string title?: string // Compatible keys (some backends use different fields) src?: string imageUrl?: string } function normalizeAdImages(ad?: CmsAd): AdImage[] { const list = ad?.imageList if (Array.isArray(list) && list.length) return list as AdImage[] // Some APIs only return `images` as a JSON string. const raw = ad?.images if (!raw) return [] try { const parsed = JSON.parse(raw) return Array.isArray(parsed) ? (parsed as AdImage[]) : [] } catch { return [] } } function toNumberPx(input: unknown, fallback: number) { const n = typeof input === 'number' ? input : Number.parseInt(String(input ?? ''), 10) return Number.isFinite(n) ? n : fallback } const MyPage = () => { const [carouselData, setCarouselData] = useState() const [loading, setLoading] = useState(true) // const [disableSwiper, setDisableSwiper] = useState(false) // 用于记录触摸开始位置 // const touchStartRef = useRef({x: 0, y: 0}) // 加载数据 const loadData = async () => { setLoading(true) try { const [flashRes] = await Promise.allSettled([ getCmsAdByCode('mp-ad'), getCmsAdByCode('hot_today'), pageCmsArticle({ limit: 1, recommend: 1 }), ]) if (flashRes.status === 'fulfilled') { console.log('flashflashflash', flashRes.value) setCarouselData(flashRes.value) } else { console.error('Failed to fetch flash:', flashRes.reason) } } catch (error) { console.error('Banner数据加载失败:', error) } finally { setLoading(false) } } useEffect(() => { loadData().then() }, []) // 轮播图高度,默认300px const carouselHeight = toNumberPx(carouselData?.height, 300) const carouselImages = normalizeAdImages(carouselData) console.log(carouselImages,'carouselImages') // 骨架屏组件 const BannerSkeleton = () => ( {/* 左侧轮播图骨架屏 */} {/* 右侧骨架屏 */} {/* 上层骨架屏 */} {[1, 2].map(i => ( ))} {/* 下层骨架屏 */} ) // 如果正在加载,显示骨架屏 if (loading) { return } return ( {carouselImages.map((img, index) => { const src = img.url || img.src || img.imageUrl if (!src) return null return ( (img.path ? navTo(`${img.path}`) : undefined)} lazyLoad={false} style={{ height: `${carouselHeight}px`, borderRadius: '4px', touchAction: 'manipulation' // 关键修改:优化触摸操作 }} /> ) })} ) } export default MyPage