微信小程序开发--分类页面实现

本文介绍了如何在微信小程序中使用VantWeapp UI库创建分类页面,包括引入Tab标签页组件、获取接口数据展示商品分类、实现侧边导航栏展示品牌,以及处理页面初次加载时的内容显示。详细讲解了从数据获取到组件使用的全过程。
摘要由CSDN通过智能技术生成

微信小程序开发–分类页面实现

之前在详情页面利用Vant WeappUI库构建出了GoodsAction 商品导航功能,接着需要在分类页面(kind.wxml)实现商品分类

1.引入第三方组件

用到的是Tab标签页

kind.json中写入:

"usingComponents": {
  "van-tab": "/miniprogram_npm/@vant/weapp/tab/index",
  "van-tabs": "/miniprogram_npm/@vant/weapp/tabs/index"
}

注意路径要正确!!!

2.使用组件

kind.wxml中使用组件:

<van-tabs active="{{ active }}" bind:change="onChange">
  <van-tab title="标签 1">内容 1</van-tab>
  <van-tab title="标签 2">内容 2</van-tab>
  <van-tab title="标签 3">内容 3</van-tab>
  <van-tab title="标签 4">内容 4</van-tab>
</van-tabs>

如果报错可能是因为js文件中没有对应的数据变量和方法:

Page({
  data: {
    active: 1,
  },

  onChange(event) {
    wx.showToast({
      title: `切换到标签 ${event.detail.name}`,
      icon: 'none',
    });
  },
});

3.获取接口数据

1.获取Tab标签内容
onLoad: function (options) {
    // 获取顶部分类
    this.loadTopCategory()
  },
/**
* 获取顶部分类
*/
loadTopCategory () {
    request ({
      url: '/pro/category',
      data : {
        type: 'type'
      }
    }).then(res => {
      console.log(res.data.data)
        this.setData({
        	titles: res.data.data
      	})
    })
},

然后在页面上遍历数据:

<van-tabs active="{{ active }}" bind:change="onChange">
  <van-tab wx:for="{{titles}}" wx:key="index" title="{{item}}">内容 1</van-tab>
</van-tabs>
2.获取tab标签下的大分类内容

在大分类里面用到的是侧边导航栏来显示各个品牌,首先还是引入组件

"usingComponents": {
  "van-sidebar": "@vant/weapp/sidebar/index",
  "van-sidebar-item": "@vant/weapp/sidebar-item/index"
}

在页面上使用组件:

<van-sidebar active-key="{{ activeKey }}">
	<van-sidebar-item wx:for="{{brandlist}}" wx:key="index" title="{{item.brand}}" />
</van-sidebar>

编写js逻辑:

data: {
    brandlist: [], //tab下面大分类的内容
    activeKey: 0,
},
/**
* tab标签点击事件
*/
onChange(event) {
    console.log(event)
    const {index,name,title} = event.detail
    // 请求大分类下的品牌详细数据
    this.requestCategoryToBrand(title)
    // wx.showToast({
    //   title: `切换到标签 ${event.detail.name}`,
    //   icon: 'none',
    // });
},
/**
* 请求大分类下的品牌详细数据
*/
requestCategoryToBrand (title) {
    request({
      url: '/pro/categorybrand',
      data: {
        category: title
      }
    }).then(res => {
      console.log(res.data.data)
      this.setData({
        brandlist: res.data.data
      })
    })
  },

这里还有一个问题就是在你第一次进入小程序时,品牌信息不会显示,所以需要在请求大分类的时候同时选择一个分类的品牌数据进行请求作为默认显示

loadTopCategory () {
    request ({
      url: '/pro/category',
      data : {
        type: 'type' //传递的参数
      }
    }).then(res => {
      console.log(res.data.data)
      this.setData({
        titles: res.data.data
      })
      //在上面的data中的active指明了默认显示的tab,因此默认的品牌信息也应该是该tab下的
      // this.data.titles --- 大分类的数组
      // this.data.active --- 当前选中的大分类的索引值
      this.requestCategoryToBrand(this.data.titles[this.data.active]);
    })
},
3.获取大分类下的品牌下的数据内容

首先在kind.json文件中引入之前详情页面的prolist自定义组件:

 "prolist": "/components/prolist/prolist"

然后编写js逻辑:

data: {
    kindlist: [], //大分类下的品牌下的数据列表内容 
},
...
onTabChange(event) {
    console.log(event)
    const {index,name,title} = event.detail
    this.setData({ //每次切换tab栏的时候就将active的值动态变化
      active: index
    })
    ...
},
...
 /**
   * 请求大分类下的品牌下的数据列表内容
   */
getKindList (event) {
    const { brand } = event.currentTarget.dataset
    console.log(brand)
    request({
      url: '/pro/categorybrandlist',
      data: {
        category: this.data.titles[this.data.active],
        brand: brand,
      }
    }).then(res => {
      console.log(res.data.data)
      this.setData({
        kindlist: res.data.data
      })
    })
},

最后在页面上渲染:

<van-sidebar-item wx:for="{{brandlist}}" data-brand="{{item.brand}}" wx:key="index" title="{{item.brand}}" bindtap="getKindList" class="van-sidebar-item"/>
</van-sidebar>
<prolist prolist="{{ kindlist }}" class="prolist"/>

另外在初次进入页面时虽然有了默认显示的菜单选项,但是默认内容并没有显示:

requestKindListData(brand) {
    console.log(brand)
    request({
        url: '/pro/categorybrandlist',
        data: {
        category: this.data.titles[this.data.active],
        brand: brand,
    }
    }).then(res => {
        console.log(res.data.data)
        this.setData({
        kindlist: res.data.data
    })
    })
}

该方法在获取大分类下的品牌后直接调用即可,并传递一个参数就是当前默认选中的品牌。另外,还要注意

在使用van-sidebarvan-sidebar-item标签的时候,默认显示的内容会被挤到页面的下方,解决方法有:1.可以在@vant下的weapp下去找到对应的组件的源码文件并修改css属性,另外还可以使用van-tree-select来实现左侧导航右侧显示自定义内容,具体代码如下:

kind.wxml

<!--pages/kind/kind.wxml-->
<van-tabs active="{{ active }}" bind:change="onTabChange">
  <van-tab wx:for="{{titles}}" wx:key="index" title="{{item}}">
    <van-tree-select class="select"
      items="{{ items }}"
      height="55vw"
      main-active-index="{{ mainActiveIndex }}"
      active-id="{{ activeId }}"
      bind:click-nav="onClickNav"
      height="500px"
    >
    <prolist prolist="{{ kindlist }}" class="prolist" slot="content" />
    </van-tree-select>
  </van-tab>
</van-tabs>

kind.js

// pages/kind/kind.js
import { request } from './../../utils/index.js'
Page({
  /**
   * 页面的初始数据
   */
  data: {
    active: 0, //默认选中的tab标签
    titles: [], //tab标签的内容
    brandlist: [], //tab下面分类的内容
    activeKey: 0, //默认选中的品牌
    kindlist: [], //大分类下的品牌下的数据列表内容 
    mainActiveIndex: 0,
    activeId: null,
    items:[] //每个大类下面的品牌名数据
  },

  /**
   * 生命周期函数--监听页面加载
   */
  onLoad: function (options) {
    // 获取顶部分类
    this.loadTopCategory()
  },
  /**
   * 获取顶部分类
   */
  loadTopCategory () {
    request ({
      url: '/pro/category',
      data : {
        type: 'type' //传递的参数
      }
    }).then(res => {
      console.log(res.data.data)
      this.setData({
        titles: res.data.data,
      })
      //在上面的data中的active指明了默认显示的tab,因此默认的品牌信息也应该是该tab下的
      // this.data.titles --- 大分类的数组
      // this.data.active --- 当前选中的大分类的索引值
      this.requestCategoryToBrand(this.data.titles[this.data.active]); //刚进入时默认选择的大分类下面有哪些品牌
    })
  },
  /**
   * tab标签点击事件
   */
  onTabChange(event) {
    console.log(event)
    const {index,name,title} = event.detail
    this.setData({
      active: index
    })
    // 请求大分类下的品牌详细数据
    this.requestCategoryToBrand(title)
    // wx.showToast({
    //   title: `切换到标签 ${event.detail.name}`,
    //   icon: 'none',
    // });
  },
  /**
   * 侧边栏标签点击事件(二级菜单栏)
   */
  onClickNav(event) {
    console.log("11111")
    console.log(event)
    const {index} = event.detail //获取当前在左侧sidebar点击的索引值
    console.log(index)
    const brand = this.data.items[index].text
    console.log(brand)
    this.getKindList(brand)
  },
  /**
   * 初次进入页面请求的默认显示的商品数据
   */
  requestKindListData(brand) {
    console.log(brand)
    request({
      url: '/pro/categorybrandlist',
      data: {
        category: this.data.titles[this.data.active],
        brand: brand,
      }
    }).then(res => {
      console.log(res.data.data)
      this.setData({
        kindlist: res.data.data
      })
    })
  },
  /**
   * 请求大分类下的品牌数据
   */
  requestCategoryToBrand (title) {
    request({
      url: '/pro/categorybrand',
      data: {
        category: title
      }
    }).then(res => {
      console.log(res.data.data)
      this.setData({
        brandlist: res.data.data,
      })
      this.getBrandListData(this.data.brandlist)
      this.requestKindListData(this.data.brandlist[this.data.activeKey].brand) //初次进入时请求的商品数据要确保品牌数据已经获取到才可以
    })
  },
  /**
   * 获取每个大分类下的品牌信息作为二级菜单栏
   */
  getBrandListData(brandlist) {
    this.setData({
      items:brandlist.map((target) => {
        return {
          text: target.brand
        }
      })
    })
  },
  /**
   * 请求大分类下的品牌下的数据列表内容
   */
  getKindList (brand) {
    console.log(brand)
    request({
      url: '/pro/categorybrandlist',
      data: {
        category: this.data.titles[this.data.active],
        brand: brand,
      }
    }).then(res => {
      console.log(res.data.data)
      this.setData({
        kindlist: res.data.data
      })
    })
  },
...
})

至此为止,该小程序基本功能全部结束

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

偶尔躲躲乌云_0

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值