<template> <view class="container"> <!--搜索栏--> <u-sticky style="top: 0" offset-top="0"> <view class="search-wrap"> <u-search placeholder="搜索" disabled height="32" :show-action="false" @click="handleSearchClick"></u-search> </view> </u-sticky> <!--轮播图--> <u-swiper :list="swiperList" previousMargin="20" nextMargin="20" circular height="200" @change="e => (current = e.current)" :autoplay="true" @click="handleSwiperClick"> <view slot="indicator" class="indicator"> <view class="indicator__dot" v-for="(item, index) in swiperList" :key="index" :class="[index === current && 'indicator__dot--active']"> </view> </view> </u-swiper> <u-gap height="20px"></u-gap> <!--宫格菜单按钮--> <u-grid :border="false" col="4" ><u-grid-item v-for="(item, index) in menuList" :key="index"> <u-icon :name="item.icon" :size="40"></u-icon> <text class="grid-title">{{ item.title }}</text> </u-grid-item> </u-grid> <u-gap height="15px"></u-gap> <!--消息滚动栏--> <u-notice-bar style="padding: 13px 12px" :text="noticeList" mode="link" direction="column" @click="click"></u-notice-bar> <!--商品展示栏--> <view> <u-gap height="180" bgColor="#398ade"></u-gap> <view class="prod-block"> <view class="bloc-header"> <text class="bloc-title">每日上新</text> <text class="see-more">查看更多</text> </view> <view class="prod-grid"> <view class="prod-item" v-for="(item, index) in productList" :key="item.id" @click="handleProdItemClick(item.id)"> <image class="prod-image" :src="item.image"></image> <view class="item-info"> <view class="info-text"> <u--text :lines="2" size="14px" color="#333333" :text="item.title"></u--text> </view> <view class="price-and-cart"> <custom-text-price color="red" size="12" intSize="18" :price="item.price"></custom-text-price> <u-icon name="shopping-cart" color="#2979ff" size="28"></u-icon> </view> </view> </view> </view> </view> </view> <view> <view class="prod-block half"> <view class="bloc-header"> <text class="bloc-title">商品热卖</text> <text class="more">更多 ></text> </view> <view class="prod-grid half"> <view class="prod-item" v-for="(item, index) in productList" :key="item.id" @click="handleProdItemClick(item.id)"> <image class="prod-image" :src="item.image"></image> <view class="item-info"> <view class="info-text"> <u--text :lines="1" size="14px" color="#333333" :text="item.title"></u--text> <u--text :lines="1" size="12px" color="#939393" :text="item.desc"></u--text> </view> <view class="price-and-cart"> <custom-text-price color="red" size="12" intSize="18" :price="item.price"></custom-text-price> <u-icon name="shopping-cart" color="#2979ff" size="28"></u-icon> </view> </view> </view> </view> </view> </view> <view> <view class="prod-block list"> <view class="bloc-header"> <text class="bloc-title">更多宝贝</text> <text></text> </view> <view class="prod-list" v-for="(item, index) in productList" :key="item.id"> <view class="prod-item" @click="handleProdItemClick(item.id)"> <image class="prod-image" :src="item.image"></image> <view class="item-info"> <view class="info-text"> <u--text :lines="1" size="14px" color="#333333" :text="item.title"></u--text> <u-gap height="2px"></u-gap> <u--text class="info-desc" :lines="2" size="12px" color="#939393" :text="item.desc"></u--text> </view> <view class="price-and-cart"> <custom-text-price color="red" size="12" intSize="18" :price="item.price"></custom-text-price> <u-icon name="shopping-cart" color="#2979ff" size="28"></u-icon> </view> </view> </view> </view> </view> </view> <!--加载更多--> <u-loadmore fontSize="28rpx" :status="status" :loading-text="loadingText" :loadmore-text="loadmoreText" :nomore-text="nomoreText" /> </view> </template> <script> import { getBannerData, getNoticeData } from '../../api/index' export default { components: {}, data() { return { current: 0, currentNum: 0, bannerList: ['https://cdn.uviewui.com/uview/swiper/swiper3.png', 'https://cdn.uviewui.com/uview/swiper/swiper2.png', 'https://cdn.uviewui.com/uview/swiper/swiper1.png'], menuList: [ { icon: 'gift', title: '热门推荐' }, { icon: 'star', title: '收藏转发' }, { icon: 'thumb-up', title: '点赞投币' }, { icon: 'heart', title: '感谢支持' } ], noticeList: ['寒雨连江夜入吴', '平明送客楚山孤', '洛阳亲友如相问', '一片冰心在玉壶'], productList: [ { id: 1, image: 'https://cdn.uviewui.com/uview/album/1.jpg', title: '山不在高,有仙则名。水不在深,有龙则灵。斯是陋室,惟吾德馨。', desc: '山不在于高,有了神仙就会有名气。水不在于深,有了龙就会有灵气。这是简陋的房子,只是我品德好就感觉不到简陋了。', price: '13.00' }, { id: 2, image: 'https://cdn.uviewui.com/uview/album/2.jpg', title: '商品222', desc: '', price: '23.00' }, { id: 3, image: 'https://cdn.uviewui.com/uview/album/3.jpg', title: '商品333', desc: '商品描述信息2', price: '33.00' }, { id: 4, image: 'https://cdn.uviewui.com/uview/album/4.jpg', title: '商品444', desc: '商品描述信息4', price: '43.00' }, { id: 5, image: 'https://cdn.uviewui.com/uview/album/5.jpg', title: '商品555', desc: '商品描述信息5', price: '53.00' } ], status: 'nomore', loadingText: '努力加载中...', loadmoreText: '轻轻上拉', nomoreText: '实在没有了...' } }, onLoad() { this.loadBannerData(); this.loadNoticeData(); }, methods: { loadBannerData() { getBannerData().then(res => { this.bannerList = res.data }) }, loadNoticeData() { getNoticeData().then(res => { this.noticeList = res.data }) }, handleSearchClick(e) { uni.$u.route('/pages/search/search') }, handleSwiperClick(index) { console.log('点击了图片索引值:', index) }, handleProdItemClick(productId) { uni.$u.route('/pages/product/product', { productId: productId }) } }, computed: { swiperList() { return this.bannerList.map(item => { if (item) { return item } }) }, noticeTextList() { return this.noticeList.map(item => { if (item.title) { return item.title } }) } } } </script> <style lang="scss" scoped> .search-wrap { background: $custom-bg-color; padding: 20rpx; } .indicator { @include flex(row); justify-content: center; &__dot { height: 15rpx; width: 15rpx; border-radius: 100rpx; background-color: rgba(255, 255, 255, 0.35); margin: 0 10rpx; transition: background-color 0.3s; &--active { background-color: $custom-bg-color; } } } .grid-title { line-height: 50rpx; font-size: 26rpx; } .prod-block { margin-top: -160px; .bloc-header { @include flex-space-between; padding: 10rpx 20rpx; .bloc-title { color: $custom-bg-color; font-size: 34rpx; } .see-more { color: $custom-bg-color; background: $u-primary; padding: 0 30rpx; height: 50rpx; line-height: 50rpx; border-radius: 50rpx; font-size: 24rpx; } } &.half, &.list { margin-top: 0; .bloc-header { margin-top: 50rpx; margin-bottom: 20rpx; .bloc-title { color: #333333; } .more { font-size: 24rpx; } } } .prod-grid { width: 730rpx; margin: 0 auto; @include flex; flex-wrap: wrap; justify-content: left; &.half { .prod-item { width: 346rpx; margin: 10rpx; .prod-image { width: 346rpx; height: 346rpx; } } } .prod-item { width: 224rpx; margin: 10rpx; background: #ffffff; border-radius: 10rpx; box-shadow: 0rpx 6rpx 8rpx rgba(58,134,185,0.2); .prod-image { width: 224rpx; height: 224rpx; border-radius: 10rpx 10rpx 0 0; } .item-info { padding: 15rpx; .info-text { height: 70rpx; padding-bottom: 10rpx; } .price-and-cart { @include flex-space-between; } } } } } .prod-list { .prod-item { background: #ffffff; @include flex-space-between; border-bottom: $custom-border-style; padding: 20rpx; .prod-image { width: 200rpx; height: 200rpx; border-radius: 10rpx; } .item-info { flex: 1; padding: 20rpx 20rpx 0; .info-text { height: 100rpx; padding-bottom: 10rpx; } .price-and-cart { @include flex-space-between; } } } } </style>