【微信小程序】 列表查询功能

 

对应本地生活案例:

https://www.bilibili.com/video/BV1834y1676P?p=52

 

HTML代码部分:

就是普通的wx-for指令遍历

<!--pages/classPage/classPage.wxml-->
<!-- <text>pages/classPage/classPage.wxml</text> -->
<!-- <text> id: {{query.id}} | 分类: {{query.name}} </text> -->
<view
  class="item"
  wx:for="{{list}}"
  wx:key="id"
  wx:for-index="idx"
  wx:for-item="item"
>
  <!-- 左边展示图片 -->
  <view class="thumb">
    <image src="{{item.images[0]}}"></image>
  </view>
  <!-- 右边展示文本 -->
  <view class="content">
    <text class="title">{{item.name}}</text>
    <text>电话:{{tools.phoneNoHandle(item.phone)}}</text>
    <text>地址:{{item.address}}</text>
    <text>营业时间:{{item.businessHours}}</text>
  </view>
</view>

<!-- 导入wxs脚本 -->
<wxs src="../../utils/tools.wxs" module="tools"></wxs>

CSS样式代码:

/* pages/classPage/classPage.wxss */

/* 左右布局 */
.item {
  display: flex;
  justify-content: space-around;

  padding: 15rpx;
  border: 1rpx solid #efefef;
  border-radius: 8rpx;
  margin: 15rpx;

  /* 盒子阴影 */
  box-shadow: 1rpx 1rpx 15rpx #ddd;
}

/* 图片控制 */
.thumb image  {
  width: 250rpx;
  height: 250rpx;
  display: block;

  margin-right: 15rpx;
  border-radius: 8rpx;
}
/* 文本布局 */
.content {
  display: flex;
  flex-direction: column;
  justify-content: space-around;
  /* 字体拉小 */
  font-size: 24rpx;
}

.title {
  font-weight: bolder;
}

JS代码部分:

1、完成接口请求初始化数据列表加载

2、配置上拉触底功能开启,在上拉加载的钩子函数中编写翻页请求,

  - 1、注意是叠加数据列表,而不是重置

  - 2、配置微信加载提示弹窗

3、如何判断翻到了最后一页,数据全部查完的状态

4、设置节流阀变量,控制请求加载的时候不能重复请求

5、配置下拉刷新功能开启

  - 1、重置翻页变量

  - 2、将停止下拉效果入参到请求方法中实现调用

// pages/classPage/classPage.js
Page({

  /**
   * 页面的初始数据
   * 小程序的data 不能使用嵌套对象,this.setData方法会覆盖data属性
   */
  data: {
    query: {}, // 导航接参
    list:[], // 列表容器
    pageIndex: 1, // 翻页参数
    pageSize: 10, // 每次请求10条数据
    total: 0, // 总记录数

    isLoading: false // 请求阀门
  },

  /**
   * 生命周期函数--监听页面加载
   */
  onLoad(options) {
    // 导航接参
    this.setData({ query: options})

    // 请求接口
    this.getListData()
  },
  /**
   * 获取每个具体分类的数据列表
   * GET请求
   * https://www.escook.cn/categories/:cate_id/shops
   * _page 表示请求第几页的数据
   * _limit 表示每页请求几条数据
   * 
   */
  getListData(callBack) {
    // 打开阀门
    this.setData({ isLoading: true })
    // 开启加载提示
    wx.showLoading({ title: '数据加载中' })

    // 请求数据
    wx.request({
      url: `https://www.escook.cn/categories/${this.data.query.id}/shops`,
      method: 'GET',
      data: {
        _page: this.data.pageIndex,
        _limit: this.data.pageSize
      },
      success: ( { data: res, header }) => {
        console.log(res)
        // 保存加载的数据
        this.setData({
          list: [
            ...this.data.list,
            ...res
          ],
          total: parseInt(header['X-Total-Count']),

          //  内部对象不会保存起来
          pageIndex: this.data.pageIndex,
          pageSize: this.data.pageSize
        })

        console.log(this.data.total)
      },
      complete: () => {
        // 关闭加载提示
        wx.hideLoading()
        // 关闭阀门
        this.setData({ isLoading: false })

        // 停止下拉刷新的操作也放在这里
        // wx.stopPullDownRefresh()
        callBack && callBack()
      }
    })
  },

  /**
   * 生命周期函数--监听页面初次渲染完成
   * 页面初次渲染完成时触发。
   * 一个页面只会调用一次,代表页面已经准备妥当,可以和视图层进行交互。
   * 注意:对界面内容进行设置的API如wx. setNavigationBarTitle,请在onReady之后进行。
   */
  onReady() {
    // 从onLoad函数加载到query参数后 改变导航标题
    wx.setNavigationBarTitle({
      title: this.data.query.name
    })
  },

  /**
   * 生命周期函数--监听页面显示
   */
  onShow() {

  },

  /**
   * 生命周期函数--监听页面隐藏
   */
  onHide() {

  },

  /**
   * 生命周期函数--监听页面卸载
   */
  onUnload() {

  },

  /**
   * 页面相关事件处理函数--监听用户下拉动作
   */
  onPullDownRefresh() {
    // 重置页数、总记录数、和容器
    this.setData({
      pageIndex: 1,
      total: 0,
      list: []
    })
    // 重新请求 并且请求完成停止刷新效果
    this.getListData(() => {
      wx.stopPullDownRefresh()
    })
  },

  /**
   * 页面上拉触底事件的处理函数
   */
  onReachBottom() {
    /**
     * 判断翻页是否超过总数据
     * 3.判断是否还有下一页数据,如果下面的公式成立,则证明没有下一页数据了:
     *  页码值 * 每页显示多少条数据 >= 总数据条数
     *  page * pageSize >= total
     * 
     */
    let pageCount = 
      this.data.pageIndex * this.data.pageSize
    if (pageCount >= this.data.total) {
      wx.showToast({
        icon: 'none', // 不设置任何图标
        title: '已经到底了', // 提示文本
        duration: 3000, // 持续3秒
      })
      return 
    }

    // 根据阀门状态判断是否继续请求
    if (this.data.isLoading) return 
    // 上拉加载翻一页
    this.setData({ pageIndex: this.data.pageIndex + 1 })
    this.getListData()
  },

  /**
   * 用户点击右上角分享
   */
  onShareAppMessage() {

  },
})

页面JSON配置:

{
  "usingComponents": {},
  "onReachBottomDistance": 200,

  "enablePullDownRefresh": true,
  "backgroundColor": "#efefef",
  "backgroundTextStyle": "dark"
}

  

WXS模块:

将电话号码加入横杠分隔符的方法

13888888888 -> 138-8888-8888

// utils/tools.wxs
/**
 * 手机号处理
 * @param {} phone 
 */
function phoneNoHandle(phone) {
  if (11 !== phone.length) return phone
  var arr = phone.split('')
  
  // 插入减号
  arr.splice(3, 0, '-')
  arr.splice(8, 0, '-')
  return arr.join('')
}

/**
 * 导出wxs模块
 */
module.exports = {
  phoneNoHandle: phoneNoHandle
}

  

 

 

posted @ 2022-05-06 11:29  emdzz  阅读(935)  评论(0编辑  收藏  举报