1. 程式人生 > >用雲開發資料庫實現列表觸底自動載入功能丨雲開發101

用雲開發資料庫實現列表觸底自動載入功能丨雲開發101

雲開發資料庫之觸底自動載入

在前面的兩篇文章中,我們簡單的談了談雲開發資料庫與傳統資料庫的差異,以及雲開發資料庫中的許可權機制,今天我們來分享一些實用的程式碼,快速幫助大家完成自己的小程式的部分功能。

微信小程式實現觸底自動載入

在開發小程式類資訊流型別的應用時,我們經常會有一個需求,就是當用戶將列表滑動到列表的底部時,自動載入新的資料中,從而實現無限下拉,獲得一個更好的體驗。

大部分使用者在進行傳統應用開發時,能夠實現類似的功能,但在進行雲開發相關的開發時,就迷茫了。在雲開發中,同樣可以實現類似的功能,這一部分,我們就來看一看這部分的實現細節。

原理說明

在小程式中,觸底自動載入的功能是基於頁面的 onReachBottom

事件完成的,當觸發此生命週期函式時,則說明小程式已經滑動到頁面的底部,需要進行資料的載入。

在使用雲開發進行資料載入時,我們可以通過在資料庫查詢語句中加入 skip(20) 來完成跳過所查詢資料的前 20 條,從第 21 條開始查詢,這樣就得出了第二次載入的資料。

這裡的 20 是因為雲開發資料庫 API 單次只能載入 20 條資料,如果你希望其每次只加載10條,可以在程式碼中加入一個 limit(10) 來實現

因此,如果實現頁面的觸底自動載入的功能,只需要在頁面的 onReachBottom 中使用 skip 進行資料查詢,並將該資料附加到原有的資料中,即可完成資料的觸底自動載入功能。

實現程式碼

首先, 我們需要在 Page 例項中定義 onReachBottom 事件,並定義一個 loadData 函式,用於資料載入,後續,我們可以在 onLoadonReachBottom 中呼叫 loadData 函式。

Page({
  data:{
    items:[] // 用於放置資料的陣列。
  },
  onLoad:function(opt){
    // 頁面載入完成後,呼叫此函式
  },
  onReachBottom:function(){
  // 頁面滑動觸底後,呼叫此函式
  },
  loadData:function(){
  // 載入資料所用函式
  }
})

為了確保呼叫時能夠不寫重複程式碼,我們可以在 onLoad 和 onReachBottom 中都呼叫 loadData 方法,從而減少重複程式碼量,則我們得到的程式碼如下。

Page({
  data: {
    items: [] // 用於放置資料的陣列。
  },
  onLoad: function (opt) {
    this.loadData()
  },
  onReachBottom: function () {
    this.loadData
  },
  loadData: function () {
  // 載入資料所用函式
  }
})

這樣,我們就完成了 Page 中的基礎程式碼的編寫,接下來我們來編寫 loadData 中的程式碼,實現資料的載入。

對於 loadData 函式,我們需要它首先獲取到當前已有資料(預設初始化進入頁面時,預設資料為空),然後基於已有資料的長度,進行跳過查詢,從而查詢當前從未查詢的資料。

在獲取到新的資料以後,使用 Array 的 concat 方法,將新的資料拼接進入到老的資料中,從而獲得了一個更大的陣列,完成資料的新增。具體程式碼例項如下:

loadData: function () {
    let old_data = this.data.items;
    const db = wx.cloud.database();
    db.collection('items').where({
      done: false,
    }).skip(old_data.length).get().then(res => {
      this.setData({
        items:old_data.concat(res.data.data)
      })
    })
  }

最終,我們得到的 Page 例項的程式碼如下

Page({
  data: {
    items: []
  },
  onLoad: function (opt) {
    this.loadData()
  },
  onReachBottom: function () {
    this.loadData
  },
  loadData: function () {
    let old_data = this.data.items;
    const db = wx.cloud.database();
    db.collection('items').where({
      done: false,
    }).skip(this.data.items.length).get().then(res => {
      this.setData({
        items:old_data.concat(res.data.data)
      })
    })
  }
})

在完成了 Page 例項的程式碼以後,我們需要調整頁面結構的程式碼,從而確保我們的資料在進行迴圈時,不會因為新增資料導致資料錯位。這需要我們使用一個唯一的 Key 作為 wx:key 的值,具體的實現程式碼如下:

<view wx:for="{{items}}" wx:key="_id"> {{item}} </view>

這段程式碼實現了使用雲開發所自帶的 ObjectId 作為 wx:key 的的值,從而確保我們的資料更新完成以後,不會出現資料錯位的情況。

這樣,我們就完成了觸底自動載入的功能。

參考文獻:

  • 小程式 Page 構造器說明:https://developers.weixin.qq.com/miniprogram/dev/reference/api/Page.html

如果你想要了解更多關於雲開發CloudBase相關的技術故事/技術實戰經驗,請掃碼關注【騰訊云云開發】公眾號~

相關推薦

開發資料庫實現列表自動載入功能開發101

雲開發資料庫之觸底自動載入 在前面的兩篇文章中,我們簡單的談了談雲開發資料庫與傳統資料庫的差異,以及雲開發資料庫中的許可權機制,今天我們來分享一些實用的程式碼,快速幫助大家完成自己的小程式的部分功能。 微信小程式實現觸底自動載入 在開發小程式類資訊流型別的應用時,我們經常會有一個需求,就是當用戶將列表滑動到列

​藉助開發資料庫實現小程式列表上拉重新整理功能開發101

上一期101專欄中,我們介紹瞭如何藉助雲開發資料庫實現小程式的列表觸底自動載入功能,相對應的,小程式列表上拉重新整理又該如何實現呢?本期專欄就來為大家解答。 原理說明 在小程式中,如果我們希望實現上拉重新整理的功能,則需要我們監聽小程式頁面的 onPullDownRefresh 事件,我們可以在這個方法中實現

js滾動事件實現滾動加載

ans spa 網頁 寫法 round 移動 text som ul li 移動端觸底加載時前端開發過程中常用功能,主要是通過三個值的大小來進行判斷; 首先介紹jquery的寫法,代碼如下: $(window).scroll(function(){ var wind

[python] pickle模塊實現“增刪改查”的簡易功能

python pyckle模塊 #!/usr/bin/env python2 #coding:utf-8 """ pickle的作用: 1:pickle.dump(dict,file)把字典轉為二進制存入文件. 2:pickle.load(file)把文件二進制內容轉為字典. """ im

頁面自動加載數據

區間 這不 fse 分別是 offset 距離 加載數據 scrolltop eight 首先理解三個dom元素,分別是:clientHeight、offsetHeight、scrollTop。 clientHeight:這個元素的高度,占用整個空間的高度,所以,如果一個d

Sybase資料庫實現等效的mysql中group_concat功能

在MySQL中,如果想實現將分組之後的多個數據合併到一列,可以使用group_concat函式,如下圖所示: 但是,在Sybase中沒有這樣的函式(別問我為什麼使用Sybase,因為公司用的Syb

Android開發實現系統自帶截圖功能 需要獲取System許可權

在一個service介面上,點選一個button按鈕,可以截圖 貼上程式碼: mButton.setOnClickListener(new OnClickListener(){          public void onClick(View arg0) {       

百度地圖的簡單開發實現地圖全景,內景展示功能(四)

今天,我就接著來淺談一下關於百度地圖的內景,外景的展示功能。今天具體要實現的功能就是輸入該地點的名稱然後就展示該地點的內景圖片,有內景就展示內景,沒有則顯示該地點的街景,該功能是參考百度地圖官方的API來實現。      實現街景展示的地點的搜尋,需要涉及到幾個

MVC設計模式實現簡單的JavaWeb登入註冊功能

MVC 全稱Model(模型)-View(檢視)-Controller(控制器),這是一種開發模式,他的好處是可以將介面和業務邏輯分離。 Model(模型),是程式的主體部分,主要包含業務資料和業務邏輯。在模型層,還會涉及到使用者釋出的服務,在服務中會根據不

經驗及技巧:MediaElement 控制元件實現全屏並自動旋轉至橫屏!

如何實現搜狐視訊開始一部分螢幕播放,點選後實現全屏並自動橫屏。我剛開始思路是自己控制進行旋轉,不過最後還是有些問題。其實不用那麼麻煩,方法很簡單。只要設定MediaElement的AreTransportControlsEnabled 屬性均為true即可。AreTrans

jQuery實現列表內容的動態載入特效

<div class="main"> <div class="ListView"> <div class="c"> <div class="Item"> <span>test</span> <span>男/0<

C++結構體實現順序表的諸多功能

hnu type 結構體 clu 刪除 ace break 輸入數據 環境 編譯運行環境為visual studio 2017 for community #include <iostream> #include<stdlib.h> #defi

使用Angularjs jQuery在手機上實現滑動條到底自動載入更多功能

                關鍵詞:directive infiniteScroll infiniteScrollDistance infiniteScrollDisabled $window.on $window.off在網上查了很多相關技術,在電腦瀏覽器上能正常的實現自動載入更多功能,但是放到手機AP

[Android6.0][RK3399] 實現耳機和喇叭自動切換功能

Platform: RK3399 OS: Android 6.0 Kernel: Linux4.4 Version: v2017.03 需求分析 RK 預設的音效卡 RT5651(Card 0)是從耳機(device 0)輸出。 但是

簡單實現安卓app自動更新功能

一般的安卓app都有自動更新功能,實現app的更新,以讓使用者體驗新版本的功能,這裡也是專案中用到的,今天就來總結一下,程式碼應該有點多,還請耐心點哈。 安卓應用實現自動更新比較簡單,這裡跟大家介紹下: 第一步 伺服器端: 服務端提供一個藉口,或者網

基於Oozie實現MapReduce作業的自動提交功能

Oozie是一個Hadoop工作流管理系統。OozieClient RestFul API官方參考如下。它提供了JAVA API 和 RESTFul API 兩種形式使用Oozie客戶端可以向Oozie服務端提交workflow。 workflow即工作流,在Oozie中使

手把手教你實現Android RecyclerView上拉載入功能

心靈雞湯:知之者不如好之者,好之者不如樂之者。 摘要 一直在用到RecyclerView時都會微微一顫,因為一直都沒去了解怎麼實現上拉載入,受夠了每次去Github找開源引入,因為感覺就為了一個上拉載入功能而去引入一大堆你不知道有多少BUG的程式碼,不僅增加了專案的冗

基於JS實現表單的自動驗證功能

注:本文程式碼是在Github上找到的原始碼,在此基礎上進行了修改。 表單驗證的功能是通過JS程式碼實現的,在作者的驗證JS程式碼中有已經設定好的資料格式,使用的是正則表示式,如果你想要設定自己的資料格式,可以在js檔案最後找到datatype進行修改。作者的後端程式碼使用

案例:vue開發網易音樂(已實現線上播放和下載)

效果如圖: 完整程式碼: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content

【庫存】看懂開發資料庫事務

####在正常使用資料庫(CRUD)的情況下,這些操作都會順利進行所有資料都會被成功更新,由於某些特定的業務場景,需要進行一系列的操作,在這過程中必須保證每一步的操作都正常執行,如果任何一個環節出了差錯,比如更新庫存資訊發生異常,這終將會導致資料庫的資訊混亂而不可預測,資料庫事務正是用來保證這種一系列操作的穩