商品分类-准备工作,渲染一级和二级分为以及tab交互,商品分类的骨架屏
1
静态结构:
<script setup lang="ts"> // </script> <template> <view class="viewport"> <!-- 搜索框 --> <view class="search"> <view class="input"> <text class="icon-search">女靴</text> </view> </view> <!-- 分类 --> <view class="categories"> <!-- 左侧:一级分类 --> <scroll-view class="primary" scroll-y> <view v-for="(item, index) in 10" :key="item" class="item" :class="{ active: index === 0 }"> <text class="name"> 居家 </text> </view> </scroll-view> <!-- 右侧:二级分类 --> <scroll-view class="secondary" scroll-y> <!-- 焦点图 --> <XtxSwiper class="banner" :list="[]" /> <!-- 内容区域 --> <view class="panel" v-for="item in 3" :key="item"> <view class="title"> <text class="name">宠物用品</text> <navigator class="more" hover-class="none">全部</navigator> </view> <view class="section"> <navigator v-for="goods in 4" :key="goods" class="goods" hover-class="none" :url="`/pages/goods/goods?id=`" > <image class="image" src="https://yanxuan-item.nosdn.127.net/674ec7a88de58a026304983dd049ea69.jpg" ></image> <view class="name ellipsis">木天蓼逗猫棍</view> <view class="price"> <text class="symbol">¥</text> <text class="number">16.00</text> </view> </navigator> </view> </view> </scroll-view> </view> </view> </template> <style lang="scss"> page { height: 100%; overflow: hidden; } .viewport { height: 100%; display: flex; flex-direction: column; } .search { padding: 0 30rpx 20rpx; background-color: #fff; .input { display: flex; align-items: center; justify-content: space-between; height: 64rpx; padding-left: 26rpx; color: #8b8b8b; font-size: 28rpx; border-radius: 32rpx; background-color: #f3f4f4; } } .icon-search { &::before { margin-right: 10rpx; } } /* 分类 */ .categories { flex: 1; min-height: 400rpx; display: flex; } /* 一级分类 */ .primary { overflow: hidden; width: 180rpx; flex: none; background-color: #f6f6f6; .item { display: flex; justify-content: center; align-items: center; height: 96rpx; font-size: 26rpx; color: #595c63; position: relative; &::after { content: ''; position: absolute; left: 42rpx; bottom: 0; width: 96rpx; border-top: 1rpx solid #e3e4e7; } } .active { background-color: #fff; &::before { content: ''; position: absolute; left: 0; top: 0; width: 8rpx; height: 100%; background-color: #27ba9b; } } } .primary .item:last-child::after, .primary .active::after { display: none; } /* 二级分类 */ .secondary { background-color: #fff; .carousel { height: 200rpx; margin: 0 30rpx 20rpx; border-radius: 4rpx; overflow: hidden; } .panel { margin: 0 30rpx 0rpx; } .title { height: 60rpx; line-height: 60rpx; color: #333; font-size: 28rpx; border-bottom: 1rpx solid #f7f7f8; .more { float: right; padding-left: 20rpx; font-size: 24rpx; color: #999; } } .more { &::after { font-family: 'erabbit' !important; content: '\e6c2'; } } .section { width: 100%; display: flex; flex-wrap: wrap; padding: 20rpx 0; .goods { width: 150rpx; margin: 0rpx 30rpx 20rpx 0; &:nth-child(3n) { margin-right: 0; } image { width: 150rpx; height: 150rpx; } .name { padding: 5rpx; font-size: 22rpx; color: #333; } .price { padding: 5rpx; font-size: 18rpx; color: #cf4444; } .number { font-size: 24rpx; margin-left: 2rpx; } } } } </style>
添加轮播图:
我们把焦点图区域替换成我们的轮播图
看一下效果:
下面来渲染一级分类和tab交互
先看一下请求参数
导入数据
为了方便观察效果小程序点开就是分类页面
下面我们定义类型
/ src/types/category.d.ts import type { GoodsItem } from './global' /** 一级分类项 */ export type CategoryTopItem = { /** 二级分类集合[ 二级分类项 ] */ children: CategoryChildItem[] /** 一级分类id */ id: string /** 一级分类图片集[ 一级分类图片项 ] */ imageBanners: string[] /** 一级分类名称 */ name: string /** 一级分类图片 */ picture: string } /** 二级分类项 */ export type CategoryChildItem = { /** 商品集合[ 商品项 ] */ goods: GoodsItem[] /** 二级分类id */ id: string /** 二级分类名称 */ name: string /** 二级分类图片 */ picture: string }
下面就可以开始渲染了
这样就完成了渲染我们来看一下效果
下面我们就要开始交互,这样就完成交互了
下面可以进行二级分类和商品渲染了
我们来看一下效果
商品分类的骨架屏
生成文件
放在vscode里面去
下面来判断数据是否加载完成
这里有一个地方很重要
就是这里我们一定要看好自动导入的是不是这个
如果不是重新修改一下,一定要找对对应的路径