通过微信开发者工具 商城模板 创建新小程序
This commit is contained in:
		
							
								
								
									
										131
									
								
								mini-program/pages/home/home.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										131
									
								
								mini-program/pages/home/home.js
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,131 @@
 | 
			
		||||
import { fetchHome } from '../../services/home/home';
 | 
			
		||||
import { fetchGoodsList } from '../../services/good/fetchGoods';
 | 
			
		||||
import Toast from 'tdesign-miniprogram/toast/index';
 | 
			
		||||
 | 
			
		||||
Page({
 | 
			
		||||
  data: {
 | 
			
		||||
    imgSrcs: [],
 | 
			
		||||
    tabList: [],
 | 
			
		||||
    goodsList: [],
 | 
			
		||||
    goodsListLoadStatus: 0,
 | 
			
		||||
    pageLoading: false,
 | 
			
		||||
    current: 1,
 | 
			
		||||
    autoplay: true,
 | 
			
		||||
    duration: '500',
 | 
			
		||||
    interval: 5000,
 | 
			
		||||
    navigation: { type: 'dots' },
 | 
			
		||||
    swiperImageProps: { mode: 'scaleToFill' },
 | 
			
		||||
  },
 | 
			
		||||
 | 
			
		||||
  goodListPagination: {
 | 
			
		||||
    index: 0,
 | 
			
		||||
    num: 20,
 | 
			
		||||
  },
 | 
			
		||||
 | 
			
		||||
  privateData: {
 | 
			
		||||
    tabIndex: 0,
 | 
			
		||||
  },
 | 
			
		||||
 | 
			
		||||
  onShow() {
 | 
			
		||||
    this.getTabBar().init();
 | 
			
		||||
  },
 | 
			
		||||
 | 
			
		||||
  onLoad() {
 | 
			
		||||
    this.init();
 | 
			
		||||
  },
 | 
			
		||||
 | 
			
		||||
  onReachBottom() {
 | 
			
		||||
    if (this.data.goodsListLoadStatus === 0) {
 | 
			
		||||
      this.loadGoodsList();
 | 
			
		||||
    }
 | 
			
		||||
  },
 | 
			
		||||
 | 
			
		||||
  onPullDownRefresh() {
 | 
			
		||||
    this.init();
 | 
			
		||||
  },
 | 
			
		||||
 | 
			
		||||
  init() {
 | 
			
		||||
    this.loadHomePage();
 | 
			
		||||
  },
 | 
			
		||||
 | 
			
		||||
  loadHomePage() {
 | 
			
		||||
    wx.stopPullDownRefresh();
 | 
			
		||||
 | 
			
		||||
    this.setData({
 | 
			
		||||
      pageLoading: true,
 | 
			
		||||
    });
 | 
			
		||||
    fetchHome().then(({ swiper, tabList }) => {
 | 
			
		||||
      this.setData({
 | 
			
		||||
        tabList,
 | 
			
		||||
        imgSrcs: swiper,
 | 
			
		||||
        pageLoading: false,
 | 
			
		||||
      });
 | 
			
		||||
      this.loadGoodsList(true);
 | 
			
		||||
    });
 | 
			
		||||
  },
 | 
			
		||||
 | 
			
		||||
  tabChangeHandle(e) {
 | 
			
		||||
    this.privateData.tabIndex = e.detail;
 | 
			
		||||
    this.loadGoodsList(true);
 | 
			
		||||
  },
 | 
			
		||||
 | 
			
		||||
  onReTry() {
 | 
			
		||||
    this.loadGoodsList();
 | 
			
		||||
  },
 | 
			
		||||
 | 
			
		||||
  async loadGoodsList(fresh = false) {
 | 
			
		||||
    if (fresh) {
 | 
			
		||||
      wx.pageScrollTo({
 | 
			
		||||
        scrollTop: 0,
 | 
			
		||||
      });
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    this.setData({ goodsListLoadStatus: 1 });
 | 
			
		||||
 | 
			
		||||
    const pageSize = this.goodListPagination.num;
 | 
			
		||||
    let pageIndex = this.privateData.tabIndex * pageSize + this.goodListPagination.index + 1;
 | 
			
		||||
    if (fresh) {
 | 
			
		||||
      pageIndex = 0;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    try {
 | 
			
		||||
      const nextList = await fetchGoodsList(pageIndex, pageSize);
 | 
			
		||||
      this.setData({
 | 
			
		||||
        goodsList: fresh ? nextList : this.data.goodsList.concat(nextList),
 | 
			
		||||
        goodsListLoadStatus: 0,
 | 
			
		||||
      });
 | 
			
		||||
 | 
			
		||||
      this.goodListPagination.index = pageIndex;
 | 
			
		||||
      this.goodListPagination.num = pageSize;
 | 
			
		||||
    } catch (err) {
 | 
			
		||||
      this.setData({ goodsListLoadStatus: 3 });
 | 
			
		||||
    }
 | 
			
		||||
  },
 | 
			
		||||
 | 
			
		||||
  goodListClickHandle(e) {
 | 
			
		||||
    const { index } = e.detail;
 | 
			
		||||
    const { spuId } = this.data.goodsList[index];
 | 
			
		||||
    wx.navigateTo({
 | 
			
		||||
      url: `/pages/goods/details/index?spuId=${spuId}`,
 | 
			
		||||
    });
 | 
			
		||||
  },
 | 
			
		||||
 | 
			
		||||
  goodListAddCartHandle() {
 | 
			
		||||
    Toast({
 | 
			
		||||
      context: this,
 | 
			
		||||
      selector: '#t-toast',
 | 
			
		||||
      message: '点击加入购物车',
 | 
			
		||||
    });
 | 
			
		||||
  },
 | 
			
		||||
 | 
			
		||||
  navToSearchPage() {
 | 
			
		||||
    wx.navigateTo({ url: '/pages/goods/search/index' });
 | 
			
		||||
  },
 | 
			
		||||
 | 
			
		||||
  navToActivityDetail({ detail }) {
 | 
			
		||||
    const { index: promotionID = 0 } = detail || {};
 | 
			
		||||
    wx.navigateTo({
 | 
			
		||||
      url: `/pages/promotion-detail/index?promotion_id=${promotionID}`,
 | 
			
		||||
    });
 | 
			
		||||
  },
 | 
			
		||||
});
 | 
			
		||||
							
								
								
									
										19
									
								
								mini-program/pages/home/home.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										19
									
								
								mini-program/pages/home/home.json
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,19 @@
 | 
			
		||||
{
 | 
			
		||||
  "navigationBarTitleText": "首页",
 | 
			
		||||
  "onReachBottomDistance": 10,
 | 
			
		||||
  "backgroundTextStyle": "light",
 | 
			
		||||
  "enablePullDownRefresh": true,
 | 
			
		||||
  "usingComponents": {
 | 
			
		||||
    "t-search": "tdesign-miniprogram/search/search",
 | 
			
		||||
    "t-loading": "tdesign-miniprogram/loading/loading",
 | 
			
		||||
    "t-swiper": "tdesign-miniprogram/swiper/swiper",
 | 
			
		||||
    "t-swiper-nav": "tdesign-miniprogram/swiper-nav/swiper-nav",
 | 
			
		||||
    "t-image": "/components/webp-image/index",
 | 
			
		||||
    "t-icon": "tdesign-miniprogram/icon/icon",
 | 
			
		||||
    "t-toast": "tdesign-miniprogram/toast/toast",
 | 
			
		||||
    "t-tabs": "tdesign-miniprogram/tabs/tabs",
 | 
			
		||||
    "t-tab-panel": "tdesign-miniprogram/tab-panel/tab-panel",
 | 
			
		||||
    "goods-list": "/components/goods-list/index",
 | 
			
		||||
    "load-more": "/components/load-more/index"
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										58
									
								
								mini-program/pages/home/home.wxml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										58
									
								
								mini-program/pages/home/home.wxml
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,58 @@
 | 
			
		||||
<view style="text-align: center; color: #b9b9b9" wx:if="{{pageLoading}}">
 | 
			
		||||
  <t-loading theme="circular" size="40rpx" text="加载中..." inherit-color />
 | 
			
		||||
</view>
 | 
			
		||||
<view class="home-page-header">
 | 
			
		||||
  <view class="search" bind:tap="navToSearchPage">
 | 
			
		||||
    <t-search
 | 
			
		||||
      t-class-input="t-search__input"
 | 
			
		||||
      t-class-input-container="t-search__input-container"
 | 
			
		||||
      placeholder="iphone 13 火热发售中"
 | 
			
		||||
      leftIcon=""
 | 
			
		||||
      disabled
 | 
			
		||||
    >
 | 
			
		||||
      <t-icon slot="left-icon" prefix="wr" name="search" size="40rpx" color="#bbb" />
 | 
			
		||||
    </t-search>
 | 
			
		||||
  </view>
 | 
			
		||||
  <view class="swiper-wrap">
 | 
			
		||||
    <t-swiper
 | 
			
		||||
      wx:if="{{imgSrcs.length > 0}}"
 | 
			
		||||
      current="{{current}}"
 | 
			
		||||
      autoplay="{{autoplay}}"
 | 
			
		||||
      duration="{{duration}}"
 | 
			
		||||
      interval="{{interval}}"
 | 
			
		||||
      navigation="{{navigation}}"
 | 
			
		||||
      imageProps="{{swiperImageProps}}"
 | 
			
		||||
      list="{{imgSrcs}}"
 | 
			
		||||
      bind:click="navToActivityDetail"
 | 
			
		||||
    />
 | 
			
		||||
  </view>
 | 
			
		||||
</view>
 | 
			
		||||
<view class="home-page-container">
 | 
			
		||||
  <view class="home-page-tabs">
 | 
			
		||||
    <t-tabs
 | 
			
		||||
      t-class="t-tabs"
 | 
			
		||||
      t-class-active="tabs-external__active"
 | 
			
		||||
      t-class-item="tabs-external__item"
 | 
			
		||||
      defaultValue="{{0}}"
 | 
			
		||||
      space-evenly="{{false}}"
 | 
			
		||||
      bind:change="tabChangeHandle"
 | 
			
		||||
    >
 | 
			
		||||
      <t-tab-panel
 | 
			
		||||
        wx:for="{{tabList}}"
 | 
			
		||||
        wx:for-index="index"
 | 
			
		||||
        wx:key="index"
 | 
			
		||||
        label="{{item.text}}"
 | 
			
		||||
        value="{{item.key}}"
 | 
			
		||||
      />
 | 
			
		||||
    </t-tabs>
 | 
			
		||||
  </view>
 | 
			
		||||
 | 
			
		||||
  <goods-list
 | 
			
		||||
    wr-class="goods-list-container"
 | 
			
		||||
    goodsList="{{goodsList}}"
 | 
			
		||||
    bind:click="goodListClickHandle"
 | 
			
		||||
    bind:addcart="goodListAddCartHandle"
 | 
			
		||||
  />
 | 
			
		||||
  <load-more list-is-empty="{{!goodsList.length}}" status="{{goodsListLoadStatus}}" bind:retry="onReTry" />
 | 
			
		||||
  <t-toast id="t-toast" />
 | 
			
		||||
</view>
 | 
			
		||||
							
								
								
									
										107
									
								
								mini-program/pages/home/home.wxss
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										107
									
								
								mini-program/pages/home/home.wxss
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,107 @@
 | 
			
		||||
page {
 | 
			
		||||
  box-sizing: border-box;
 | 
			
		||||
  padding-bottom: calc(env(safe-area-inset-bottom) + 96rpx);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.t-tabs.t-tabs--top .t-tabs__scroll {
 | 
			
		||||
  border-bottom: none !important;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.home-page-header {
 | 
			
		||||
  background: linear-gradient(#fff, #f5f5f5);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.home-page-container {
 | 
			
		||||
  background: #f5f5f5;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.home-page-container,
 | 
			
		||||
.home-page-header {
 | 
			
		||||
  display: block;
 | 
			
		||||
  padding: 0 24rpx;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.home-page-header .t-search__input-container {
 | 
			
		||||
  border-radius: 32rpx !important;
 | 
			
		||||
  height: 64rpx !important;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.home-page-header .t-search__input {
 | 
			
		||||
  font-size: 28rpx !important;
 | 
			
		||||
  color: rgb(116, 116, 116) !important;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.home-page-header .swiper-wrap {
 | 
			
		||||
  margin-top: 20rpx;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.home-page-header .t-image__swiper {
 | 
			
		||||
  width: 100%;
 | 
			
		||||
  height: 300rpx;
 | 
			
		||||
  border-radius: 10rpx;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.home-page-container .t-tabs {
 | 
			
		||||
  background: #f5f5f5 !important;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.home-page-container .t-tabs .t-tabs-nav {
 | 
			
		||||
  background-color: transparent;
 | 
			
		||||
  line-height: 80rpx;
 | 
			
		||||
  font-size: 28rpx;
 | 
			
		||||
  color: #333;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.home-page-container .t-tabs .t-tabs-scroll {
 | 
			
		||||
  border: none !important;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* 半个字 */
 | 
			
		||||
.home-page-container .tab.order-nav .order-nav-item.scroll-width {
 | 
			
		||||
  min-width: 165rpx;
 | 
			
		||||
}
 | 
			
		||||
.home-page-container .tab .order-nav-item.active {
 | 
			
		||||
  color: #fa550f !important;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.home-page-container .tab .bottom-line {
 | 
			
		||||
  border-radius: 4rpx;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.home-page-container .tab .order-nav-item.active .bottom-line {
 | 
			
		||||
  background-color: #fa550f !important;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.home-page-container .tabs-external__item {
 | 
			
		||||
  /* color: #666 !important; */
 | 
			
		||||
  font-size: 28rpx;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.home-page-container .tabs-external__active {
 | 
			
		||||
  color: #333333 !important;
 | 
			
		||||
  font-size: 32rpx;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.home-page-container .tabs-external__track {
 | 
			
		||||
  /* background-color: #fa4126 !important; */
 | 
			
		||||
  height: 6rpx !important;
 | 
			
		||||
  border-radius: 4rpx !important;
 | 
			
		||||
  width: 48rpx !important;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.t-tabs.t-tabs--top .t-tabs__item,
 | 
			
		||||
.t-tabs.t-tabs--bottom .t-tabs__item {
 | 
			
		||||
  height: 86rpx !important;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.home-page-container .goods-list-container {
 | 
			
		||||
  background: #f5f5f5 !important;
 | 
			
		||||
  margin-top: 16rpx;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.home-page-tabs {
 | 
			
		||||
  --td-tab-nav-bg-color: transparent;
 | 
			
		||||
  --td-tab-border-color: transparent;
 | 
			
		||||
  --td-tab-item-color: #666;
 | 
			
		||||
  --td-tab-track-color: red;
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										8
									
								
								mini-program/pages/home/readme
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								mini-program/pages/home/readme
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,8 @@
 | 
			
		||||
首页功能设定
 | 
			
		||||
1. loading入场
 | 
			
		||||
2. 下拉刷新
 | 
			
		||||
3. 搜索栏
 | 
			
		||||
4. 分类切换
 | 
			
		||||
5. 商品列表
 | 
			
		||||
6. 规格弹层
 | 
			
		||||
7. 加载更多
 | 
			
		||||
		Reference in New Issue
	
	Block a user