七、实现商品分类页面功能
7.1 完成商品分类的顶部导航
- 使用已封装好的 NavBar 组件来实现
- 在组件 Category 中引入、注册并使用
- 调试好样式
7.2 完成左侧tab菜单分类栏
- 创建
TabMenu组件,在组件Category中引入、注册并使用 - 在组件
Category中实现获取分类数据的功能- 创建获取分类数据的请求文件
category.jsimport { request } from './request' export function getCategory() { return request({ url: "/category" }) } - 并在组件
Category中引入和使用 - 创建获取商品分类数据的请求
_getCategory(){} - 在
data中初始化商品分类数据categories,用来存储请求中获取到的分类列表数据
- 创建获取分类数据的请求文件
- 通过父子组件传值的方式将
categories中的数据传递给TabMenu组件中props的menuCategories - 再在
TabMenu组件中通过v-for指令进行循环遍历,来渲染分类列表 - 引入
Scroll组件来实现分类列表可以手动滚动,并完成组件TabMenu的样式,使其左侧的分类列表栏可以单独滚动
7.3 完成点击菜单,右侧显示菜单对应的内容
- 实现点击左侧菜单标题选择当前标题
- 通过vue的对象语法将
active属性绑定在:class中,通过判断active的true或false来显示- 需要在
data 中初始化一个currentIndex,通过判断currentIndex是否与当前的 index 索引是否相等来判断active` 的值 - 因此需要在点击标题时调用
clickTitle(index){}方法来将当前 index 的值赋给currentIndex - 完成点击标题时的
active的样式来显示
- 需要在
- 获取分类标题下的子分类的数据
- 在请求文件
category.js中创建getSubCategory(maitKey){}请求 - 并在组件
Category中引用 - 由于进入分类页面时就需要获取到第一个分类下的子分类,因此在获取
tab菜单时,也要获取第一个菜单的子分类,即调用getSubCategory(this.categories[0].maitKey){} - 并在
data中初始化数据currentIndex(当前菜单标题的索引)和subCategories(当前子分类的数据) - 并将获取到的第一个子分类的数据存储到
subCategories中 - 监控点击的菜单标题事件
selectTitle(index){},由子节TabMenu点发送事件给父节点方法,通过$emit(“selectTitle”, index)发送同时需要传当前标题的索引参数index - 在
selectTitle(index){}中调获取分类列表下的子分类请求方法_getSubCategory(index){} - 在
_getSubCategory(index){}方法中所调接口请求getSubCategory(maitKey)需要传maitKey参数,因此需要知道点击的是哪个菜单标题下的maitKey - 即将子节点
TabMenu发送过来的 index 赋值给currentIndex,并拿到对应currentIndex下的categories中的maitKey - 并将该
maitKey下的请求数据res.data赋值给初始化的subCategories
- 在请求文件
- 创建子分类组件
TabSubcategory并在Category组件中引入、注册和使用 - 将
subCategories存储的数据通过prop父子组件传值的方式传递给TabSubcategory中的subCategories - 再通过
v-for指令渲染subCategories中需要的数据在界面上,此时需要判断subCategories中有值的时候才去渲染页面的数据,并完成样式 - 由于子分类栏的部分也是要可以手动滚动的,因此需要在
Category组件中引入Scroll组件,并将TabSubcategory组件包裹在里面,并设置滚动的区域样式
7.4 完成商品分类右边的 TabControl 栏
- 引入
TabControl组件,注册并使用 - 并给组件传递
:title=“['综合', '新品', '销量']” - 当点击
title标签时,需要监控用户点击事件,并能获取到用户对应点击的是哪个title- 需要在
data中初始话一个currentType用来存储用户点击的title标签 - 在
TabControl组件上绑定titleClick点击事件,即@tabclick=“titleClick” -
tabclick事件属性是子组件TabControl中发送给父组件Category的监听事件// 监控用户点击tabcontrol titleClick(index) { switch (index) { case 0: this.currentType = "pop"; break; case 1: this.currentType = "new"; break; case 2: this.currentType = "sell"; break; } // console.log(this.currentType); }
- 需要在
7.5 完成点击 title 标签显示对应的商品列表
- 在
category.js创建子分类下的商品列表信息数据的请求getCategoryDetail(){}- 该请求需要传
miniWallkey参数,miniWallkey为对应菜单栏的商品信息key - 也需要传
type参数,type参数为TabControl上的对应title标签
- 该请求需要传
- 创建
_getCategoryDetail(type){}方法来获取TabControl的对应title的商品数据 - 将当前
categories 中的miniWallkey,赋值给常量miniWallkey` - 通过请求
getCategoryDetail获取返回的res数据,并赋值给categoryDetail- 需要在
data中初始化categoryDetail对象数据,用来存储getCategoryDetail获取的对应title标签下请求返回的数据 -
categoryDetail数据结构为categoryDetail: { pop: [], new: [], sell: [] },
- 需要在
- 由于用户在进入当前
category页面或者点击tab菜单列表时,就需要获取对应tab菜单下单的所有商品数据,因此需要将_getCategoryDetail方法放在_getSubCategory方法中去调用- 即在调用分类列表菜单的子分类请求
getSubCategory(){}中去调用_getSubCategory
- 即在调用分类列表菜单的子分类请求
- 商品列表可以使用已封装好的
GoodsList组件来显示- 需要在
Category组件中引入、注册和使用GoodsList组件 - 由于商品列表展示的是当前对应的 title 标签下的商品数据
showCategoryDetail,因此需要使用计算属性computed - 用来处理返回传递给子组件需要的
showCategoryDetail数据showCategoryDetail() { return this.categoryDetail[this.currentType]; }
- 需要在