本文主要介绍微信小程序如何分页获取数据。Git项目地址
扫码体验Demo小程序
gh_befcdcf5b827_258.jpg

一、表数据

suject题目表

{"_id":"0ayVvucaRNEceEzD4dMn1tUS1pZG3VcrqXdpXfrtmk9YHyDD","question":"正方形是有角的图形,这个图形没有角。所以,这个图形是个圆。","option":[{"key":"A","value":"Yes"},{"key":"B","value":"No"}],"answer":"B","analysis":"没有角的图形有很多","status":"1","position":70,"create_at":"2020-05-11 15:46:36","update_at":"2020-05-11 15:46:36"}
{"_id":"0e5d9911-34cd-4e83-b056-ba0d6c634878","answer":"C","analysis":"两个孩子可能情况为(男,男)(男,女)(女,男)(女,女),又已知其中一个是女的,故排除(男,男),剩下三种情况两个是符合的,故2/3","status":"1","create_at":"2020-03-27 15:46:36","update_at":"2020-03-27 15:46:36","question":"有一对夫妇,先后生了两个孩子,其中一个孩子是女孩,另一个孩子是男孩的概率是多少?","option":[{"key":"A","value":"1/2"},{"key":"B","value":"1/3"},{"key":"C","value":"2/3"},{"key":"D","value":"3/4"}],"position":5.0}
{"_id":"1AylrC3OIgv2nrQEe2v6qBRqPZxZKR5LkOuggoqbkJnfwmP6","question":"韦利是个和斯坦一样强的棒球击球手,斯坦是个比大多数人都要强的棒球击球手。所以,斯坦应是这些选手中最出色的。","option":[{"key":"A","value":"Yes"},{"key":"B","value":"No"}],"answer":"B","analysis":"斯坦只比大多数人强,中等偏上","status":"1","position":65,"create_at":"2020-05-11 15:46:36","update_at":"2020-05-11 15:46:36"}
{"_id":"1fWuVJVFUKOUmjfdRaqnAiLPr15XlNtZwKtru3ctduX48fcn","question":"绿色深时,红色就浅;黄色浅时,蓝色就适中;但是要么绿色深,要么黄色浅。所以,红色浅,或者蓝色适中。","option":[{"key":"A","value":"Yes"},{"key":"B","value":"No"}],"answer":"A","analysis":"无","status":"1","position":78,"create_at":"2020-05-11 15:46:36","update_at":"2020-05-11 15:46:36"}
{"_id":"29ca2b1c-ebab-4b7d-bd96-8b0b668089c2","status":"1","create_at":"2020-03-27 15:46:36","update_at":"2020-03-27 15:46:36","analysis":"排列组合,C(45,2)","question":"一次朋友聚会,大家见面时总共握手45次。如果参加聚会的人和其余的每个人只握手一次,问参加聚会的共有多少人?","option":[{"key":"A","value":"22"},{"key":"B","value":"11"},{"key":"C","value":"12"},{"key":"D","value":"10"}],"answer":"D","position":3.0}
{"_id":"2G1Yeqpw97xK7iIsq89qBZmlgq2GFOdBNg8sopjHS63UrDTT","question":"前进不见得死得光荣,后退没死也不见得是耻辱。所以,后退意为死得光荣。","option":[{"key":"A","value":"Yes"},{"key":"B","value":"No"}],"answer":"B","analysis":"可能是耻辱","status":"1","position":99,"create_at":"2020-05-11 15:46:36","update_at":"2020-05-11 15:46:36"}
{"_id":"2NqPCHgKe4Gej83LAK6tDq44OCGrQhgzFSGrU4ItYJqi1zlB","question":"一个在运动中骨折的患者(女性)康复出院了,家里庆祝并大摆宴席。喝饮料的时候,患者的哥哥说今天的可乐怎么味道有点怪,然后患者的父亲和母亲也喝了纷纷表示可乐味道的确不对。但患者喝后坚称味道正常。患者死于当天晚上洗澡的澡盆里。为什么?","option":[{"key":"A","value":"已知,下一题"},{"key":"B","value":"查看解析"}],"answer":"A","analysis":"患者在受伤过程中,把感觉神经也给弄坏了,感觉不到味道和疼痛,在泡澡过程中,水太热,被烫死了","status":"1","position":56,"create_at":"2020-05-07 15:46:36","update_at":"2020-05-07 15:46:36"}
{"_id":"2c8JA7ky2BNmiSlpIQRcktzvZ53KHe2h8zlbPkt5T3puoXvV","question":"从前有一个女人,他的老公非常喜欢搞外遇,这个女人实在忍受不了这种状况,就决定吃药自杀,自杀前他留了一封遗书给她的初恋情人。初恋情人看到遗书后,十万火急地赶到女人家里,还好女人没有死,女人看到初恋情人来了表现得很激动,二人缠绵不已。初恋情人对女人说他一定帮忙教训她的老公。第二天,警察登门,告诉女人说她老公已经死了,在和情妇幽会的时候死了。请问这是怎么一回事?","option":[{"key":"A","value":"已知,下一题"},{"key":"B","value":"查看解析"}],"answer":"A","analysis":"女人将毒药藏在普通瓶子里以掩饰毒药,然后把药服了。她等待着死亡的到来,可是她的身体没有出现丝毫痛苦的征兆,相反,却有一种微妙的藏东在上升。这时她的初恋男友来了,女人见了男友表现的十分热情,主动和他唱秒。而在另一个角落,女人的老公和情妇也要将上演另一幕激情戏的时候,男人拿出了事先准备好的秘密武器---平日藏在柜子里装在普通瓶子里以掩饰的春药,这一次,他像往常一样吞了一粒,可是没过多久,他突然全身痉挛,表情极为痛苦,过了一会就死了。","status":"1","position":46,"create_at":"2020-05-07 15:46:36","update_at":"2020-05-07 15:46:36"}
{"_id":"2f826e24-397c-43d6-8193-1014ce858759","status":"1","create_at":"2020-03-27 15:46:36","update_at":"2020-03-27 15:46:36","question":"36匹马赛跑,跑道同时只能容许6匹马。而且36匹马速度不同,但是每次跑的速度恒定。问不计时跑多少次可以选出第一,第二,第三名?","option":[{"key":"A","value":"7"},{"key":"B","value":"8"},{"key":"C","value":"9"},{"key":"D","value":"6"}],"answer":"B","analysis":"36匹马,分6组,赛6次,留下每组前3名;6个小组的第一名赛一次,选出前三,这3组可以去争夺前3名,从第一组选出3名,从第二名组选出前2名,从第三名组选第一名赛一次,前三就是第一名、第二名、第三名","position":12.0}
{"_id":"33242856-03df-49ad-b409-75e20455fbea","status":"1","create_at":"2020-03-27 15:46:36","update_at":"2020-03-27 15:46:36","question":"在一个平面上有三个不在一条直线上的点。请问在这个平面能够作出几条与这些点距离相同的线?","option":[{"key":"A","value":"1"},{"key":"B","value":"0"},{"key":"C","value":"2"},{"value":"3","key":"D"}],"answer":"D","analysis":"三角形的三条中垂线的交点到三个点的距离相等","position":4.0}
{"_id":"33d27b4d-d22d-4def-ac32-49e7a0a1fcdf","update_at":"2020-03-27 15:46:36","question":"1元钱一瓶汽水,喝完后两个空瓶换1瓶汽水,你有20元钱,最多可以喝到几瓶水?(可以借)","option":[{"key":"A","value":"40"},{"key":"B","value":"38"},{"key":"C","value":"39"},{"key":"D","value":"37"}],"answer":"A","analysis":"先买20瓶,再借20个空瓶去换20瓶,再还20个空瓶,所以可以喝40瓶水","status":"1","create_at":"2020-03-27 15:46:36","position":10.0}
{"_id":"3FSAYgEna4l1uyLaZvk7tU9s97hH8ikBiAZyH0EnrPHHaFsI","question":"水平高的音乐家演奏古典音乐,要成为水平高的音乐家就得练习演奏。所以演奏古典音乐比演奏爵士乐需要更多的练习时间。","option":[{"key":"A","value":"Yes"},{"key":"B","value":"No"}],"answer":"B","analysis":"看天赋","status":"1","position":67,"create_at":"2020-05-11 15:46:36","update_at":"2020-05-11 15:46:36"}
{"_id":"3HeRjxEADVVhVxoAHWKuyFq4y51rWQelhMXtI3UHoDoPCDW9","question":"我住在农场和城市之间,农场位于城市和机场之间。所以,我的住处到农场比到机场要近。","option":[{"key":"A","value":"Yes"},{"key":"B","value":"No"}],"answer":"A","analysis":"无","status":"1","position":84,"create_at":"2020-05-11 15:46:36","update_at":"2020-05-11 15:46:36"}
{"_id":"5MWFCg2NYcxbXA06AeTN3Inv6AHh9zwoDfgFUBYi8QK2NYAF","question":"当B等于Y时,A等于Z;当A不等于Z时,E要么等于Y,要么等于Z。所以, 当B不等于Y时,E不等于Y也不等于Z。","option":[{"key":"A","value":"Yes"},{"key":"B","value":"No"}],"answer":"B","analysis":"当B不等于Y时,A不等于Z,E要么等于Y,要么等于Z","status":"1","position":90,"create_at":"2020-05-11 15:46:36","update_at":"2020-05-11 15:46:36"}

二、首页分页

1. 在index.json文件里设置页面上拉触底事件触发时距页面底部距离为50px

image.png

2. 创建list云函数,获取分页数据。请求参数为startId(从哪条记录开始,默认为0),每页数据为15条,只获取所需要的列(_id,question,position),减轻流量。```备注:创建新的云函数后一定要执行 npm install --save wx-server-sdk@latest```
// 云函数入口文件
cloud = require('wx-server-sdk')
cloud.init()

const db = cloud.database()
const _ = db.command
const $ = db.command.aggregate

// 云函数入口函数
exports.main = async (event, context) => {
    var startId = parseInt(event.startId)
    
    const subject = await getListByStartId(startId)
    return {subject:subject.result.list}
}

function getListByStartId(startId, size=15, field={ question: 1, position: 1 }) {
  if (startId > 0) {
    return db.collection('subject').aggregate()
      .match({
        position: _.lt(startId)
      })
      .sort({ position: -1 })
      .limit(size)
      .project(field).end()
  }

  return db.collection('subject').aggregate()
    .sort({ position: -1 })
    .limit(size)
    .project(field).end()
}
3. 设置页面初始数据,questionList-题目列表,lastId-题目最后一个Id,noMore-全部加载
Page({
  data: {
    questionList: null,
    lastId: 0,
    noMore: false
  }
 )}
4. 获取列表数据。当列表数据为空时,设置noMore为true; 当列表不空时,lastId为list[list.length - 1].position(position为排序的值), 将获取到的list数据concat进questionList。
Page({
  data: {
    questionList: null,
    lastId: 0,
    noMore: false
  },
  onShow: function () {
    this.setData({ 
      questionList: null,
      lastId: 0,
      noMore: false
     });
    this.getList()
  },
  getList: function () {
    wx.cloud.callFunction({
      name: 'list',
      data: {
        startId: this.data.lastId
      },
    })
      .then(res => {
        if (res.result == null || res.result.subject.length <= 0) {
          this.setData({ noMore: true })
          return;
        }

        let list = res.result.subject
        this.setData({lastId: list[list.length - 1].position}) 
        if (this.data.questionList !== null) {
          this.setData({
            questionList: this.data.questionList.concat(list)
          })
        } else {
          this.setData({ questionList: list });
        }
      })
      .catch(res => {
        wx.showToast({
          title: '系统异常,请稍后重试',
          icon: 'none',
          duration: 2000
        })
      })
  }
})
5. 设置触底事件,当noMore为true时,不再请求数据

Page({
  data: {
    questionList: null,
    lastId: 0,
    noMore: false
  },
  onShow: function () {
    this.setData({ 
      questionList: null,
      lastId: 0,
      noMore: false
     });
    this.getList()
  },
  onReachBottom: function (e) {
    if (this.data.noMore) {
      return;
    }
    this.getList()
  },
  getList: function () {
    wx.cloud.callFunction({
      name: 'list',
      data: {
        startId: this.data.lastId
      },
    })
      .then(res => {
        if (res.result == null || res.result.subject.length <= 0) {
          this.setData({ noMore: true })
          return;
        }

        let list = res.result.subject
        this.setData({lastId: list[list.length - 1].position}) 
        if (this.data.questionList !== null) {
          this.setData({
            questionList: this.data.questionList.concat(list)
          })
        } else {
          this.setData({ questionList: list });
        }
      })
      .catch(res => {
        wx.showToast({
          title: '系统异常,请稍后重试',
          icon: 'none',
          duration: 2000
        })
      })
  }
})
6. 页面wxml展示

index.wxml

<view class="title">题目</view>
<view class = "list-body">
  <block wx:for="{{questionList}}" wx:key="_id">
    <navigator class="navigator-block"  url="../question/detail?id={{item._id}}&type=all">
     <view class="question-redirect">{{item.question}}</view>
    </navigator>
  </block>
</view>
<view class="no-more">
      <view wx:if="{{noMore}}">我们是有底线的呦~</view>
</view>
index.wxss
 page {
    background-color: #f8f8f8;
  }
.list-body {
   background-color: #fff;
   margin-top: 15px; 
}
.navigator-block {
  border-bottom: 1px solid rgb(231, 227, 227);
  display: flex;
  flex-direction: row;
  height:40px;
  margin-left:5px;
}
.question-redirect {
  font-size:13px;
  color: #666;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space:nowrap;
  width: 90%;    
  margin-left:10px;
  line-height: 40px;
}
.list-detail{
   transform: rotate(45deg);
   border-right:  1px solid  #BDBDBD;
   border-top: 1px solid  #BDBDBD;
   width:8px;
   height:8px;
   float:right;
   margin-top:15px;
}
.no-more{
    color: #999;
    text-align: center;
    margin-top: .1rem;
    font-size: .1rem;
}
.title{
    margin-top: 20px;
    font-size: 15px;
    color: #333;
    line-height: .22rem;
    padding: .1rem .15rem;
    font-weight: 700;
}

小青蛙
19 声望0 粉丝

技术不精的小姐姐