微信小程序项目的简单功能合集(二)

122 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第3天,点击查看活动详情

接着上一篇文章,继续总结此小程序项目实现的简单功能。

1. tab切换功能

主要由tab栏和展示内容的模块组成,tab栏展示几种不同的状态(订单的状态:全部、已预订、已退订、已完成),点击切换tab栏的状态,下面的内容就展示当前的状态下的数据(订单列表)

a. tab栏使用三元表达式判断status(订单状态值) == num(设置的状态值) 是否为真,如果为真,动态添加active类名,改变当前tab样式。

b. 并且给每个tab设置自定义属性传入当前num的值,在绑定的点击事件中,得到当前的num值,改变data中设置的status状态值,并重新请求订单列表数据

<view class="tabbar">
    <view class="item {{status == '0' ? 'active' : ''}}" bindtap="onChange" data-id="0">全部
      <text wx:if="{{totalNum}}">({{totalNum}})</text>
    </view>
    <view class="item {{status == '1' ? 'active' : ''}}" bindtap="onChange" data-id="1">已预订</view>
    <view class="item {{status == '3' ? 'active' : ''}}" bindtap="onChange" data-id="3">已退订</view>
    <view class="item {{status == '2' ? 'active' : ''}}" bindtap="onChange" data-id="2">已完成</view>
  </view>
  <view class="order-lists">
    <view class="container">
      <navigator wx:for="{{orderLists}}" wx:key="index" class="list" url="/pages/orderdetail/orderdetail?order={{item.order_no}}" hover-class="none">
        ...
      </navigator>
      <view class="nodata" wx:if="{{orderLists.length == 0}}">暂无数据</view>
    </view>
    <image class="some-bg" src="/assets/images/order-bg.png" mode="aspectFill"></image>
  </view>

initData() {
    this.setData({
      page: 0,
      listStatus: 1,
      orderLists: [],
    })
    this.getOrderData()
},
onChange(e){
    let status = e.currentTarget.dataset.id;
    this.setData({
      status
    })
    this.initData()
},

注:

  1. 因为每次点击切换tab,都需要把之前请求的订单列表数据清空,因此设置了一个专门的函数initData实现数据清除之后,再实现数据请求
  2. 如果订单列表数据为空(也就是设置的这个数据变量长度为0),可以在内容区域显示‘暂无数据’

2.上拉加载功能

根据微信小程序官方提供的监听用户上拉触底事件onReachBottom实现,它会在页面滚动到底部的时候自动触发。

可以在app.jsonwindow选项中或页面配置中设置触发距离onReachBottomDistance

a. 上拉加载数据,其实是分页加载数据。在data中设置当前数据页数page: 0和数据的状态listStatus:1(根据这个状态控制是否请求数据,这里设置两种状态, 1:加载、 -1:没有数据了)。

b. 在请求数据函数中,首先判断listStatus是否为-1,如果为真,直接return出去,不请求数据了。

c. 每次请求数据都要增加一页数据页数,当数据页数等于请求数据的最后一页,就改变listStatus为-1,并且使用扩展运算符...合并每次请求的数据。

d. 在上拉触底事件onReachBottom中,执行请求数据的函数

getOrderData(){
    if (this.data.listStatus == -1) {
      return false;
    }
    let page = ++this.data.page
    $api.orderLists({
        page,
        status:this.data.status
      })
      .then(res => {
        console.log(res)
        if (page == res.data.last_page) {
          this.data.listStatus = -1
        }
        const orderLists = [...this.data.orderLists, ...res.data.data]
        this.setData({ orderLists,  page })
        
      })
      .catch(err => {
        if (err.code == 202) {
          wx.showToast({
            icon: 'none',
            title: err.msg
          })
        }
      })
  },
onReachBottom (){
    this.getOrderData()
  },