小兔鲜儿---商品分类

目录

准备工作​

渲染轮播图​

一级分类​

获取数据​

Tab 交互​

二级分类​

骨架屏​


准备工作​

参考效果

商品分类页中的广告位,可复用之前定义的轮播图组件 XtxSwiper

小兔鲜儿---商品分类_第1张图片

静态结构

商品分类页静态结构: src/pages/category/category.vue





渲染轮播图​

接口调用

渲染轮播图数据业务功能对于前端来说比较简单,只需调用后端提供的接口将获得的数据展现。

注意:传递参数 2 标识获取商品分类页广告。

接口地址:/home/banner

请求方式:GET

请求参数:

Query:

字段名称 是否必须 默认值 备注
distributionSite 1 活动 banner 位置,1 代表首页,2 代表商品分类页,默认为 1
import { getHomeBannerAPI } from "@/services/home";
import type { BannerItem } from "@/types/home";
import { onLoad } from "@dcloudio/uni-app";
import { ref } from "vue";

const bannerList = ref([]);
const getHomeBannerData = async () => {
  const res = await getHomeBannerAPI(2);
  bannerList.value = res.result;
};
onLoad(() => {
  getHomeBannerData();
});

/**
 * 首页-广告区域-小程序
 * @param distributionSite 广告区域展示位置(投放位置 投放位置,1为首页,2为分类商品页) 默认是1
 */
export const getHomeBannerAPI = (distributionSite = 1) => {
  return http({
    method: 'GET',
    url: '/home/banner',
    data: {
      distributionSite,
    },
  })
}

一级分类​

获取数据​

该接口同时包含一级分类和二级分类数据,二级分类数据需要先对数据进行处理,再进行渲染。

接口调用

接口地址:/category/top

请求方式:GET

请求参数:无

请求封装

// src/services/category.ts
/**
 * 分类列表-小程序
 */
export const getCategoryTopAPI = () => {
  return http({
    method: 'GET',
    url: '/category/top',
  })
}

类型声明

// 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
}

接下来,先把一级分类数据结合模板语法渲染到页面中。

Tab 交互​

当用户点击一级分类时,需要高亮显示,即给它添加 .active 类名即可。



二级分类​

商品二级分类是从属于某个一级分类的,通过 computed 配合高亮下标提取当前二级分类数据



提取当前二级分类数据后,剩下的就是列表渲染。

骨架屏​

参考效果

实现步骤参考首页的骨架屏。

小兔鲜儿---商品分类_第2张图片

 小兔鲜儿---商品分类_第3张图片

// PageSkeleton.vue


  
    //省略...
  
  

const isFinish = ref(false);
onLoad(async () => {
  await Promise.all([getHomeBannerData(), getCategoryTopData()]);
  isFinish.value = true;
});

你可能感兴趣的:(小兔鲜,uniapp,uniapp)