微信小程序云開發快速入門(2/4)

前言

我們對《微信小程序云開發快速入門(1/4)》的知識進行回顧一下。在上章節我們知道了云開發的優勢以及能力,并且我們還完成了碼仔備忘錄的本地版到網絡版的改造,主要學習了云數據庫同時還通過在小程序使用云API直接操作了云數據庫:

  • 使用 get() 進行了數據庫的查詢
  • 使用 add() 進行了數據添加
  • 使用 update() 進行了數據修改
  • 使用 remove() 進行了數據刪除

本章節給大家帶來「排序」「精準」「模糊」「分頁」這四種查詢方式在實際業務種也是經常用到的。

列表排序

默認情況下小程序查詢出來的列表是按時間來排序的,最新添加的數據在最后面。但是實際需求是需要最新添加的在最前面,那么這個時候我們就需要用排序函數 orderBy 來改變它的排序規則。

在 orderBy 具體使用方法(通過數據庫對象直接鏈式調用的方法,在使用 get 方法之前使用):
文檔示例代碼:按進度排升序取待辦事項

db.collection('todos').orderBy('progress', 'asc').get().then(console.log).catch(console.error)

參數分別:

  1. 需要排序的字段名
  2. 排序具體的規則
  • asc:升序,從小到大
  • desc:降序,從大到小

同時支持多個字段組合排序,優先級根據調用順序來決定
當我們學習到這個API到時候,再來思考下如何實現具體需求,實現這個需求一共有兩種方式:

新增時間字段排序

這個時候我們可以在新增/修改的時候去設置時間戳字段 createTime ,然后通過時間戳字段進行排序。
添加 createTime 屬性代碼寫在編輯頁面的 save 保存方法中
時間戳獲取的4種方式

let createTime1 = Date.parse(new Date()); // 精確到秒
let createTime2 = new Date().getTime(); // 精確到毫秒
let createTime3 = new Date().valueOf(); // 精確到毫秒
let createTime4 = Date.now(); // 精確到毫秒,實際上是new Date().getTime()

排序代碼:

db.collection('memo').orderBy('createTime', 'desc').get()

組合時間字段排序

除此之外還有同學在沒有新增字段的情況下也完成了同樣的效果,使用了多個字段組合排序。

db.collection('memo').orderBy('date','desc').orderBy('time','desc').get()

先對日期進行了排序,然后再對時間進行排序。在這里要注意有的同學只對時間進行了排序,這種情況下如果是同一天的數據排序正常,但是是多天的情況下順序就會亂掉。

根據內容查詢

為了更高效的找到備忘錄,那么搜索是必不可少的,接下來我們會使用 where 函數來實現搜索功能。首先我們需要來一個搜索框,在這里再告訴大家一個小技巧一些常用的組件我們可以通過引用的成熟UI組件庫來進行快速實現,上次我們學習了用npm應用時間工具包,接下來我們擴展庫引入WeUI組件。

使用UI組件庫

  1. 在app.json中配置:
{"useExtendedLib": {"weui": true}
}

相當于引入了對應擴展庫相關的最新版本的 npm 包,同時也不占用小程序的包體積。
2. 在使用的頁面json配置搜索組件

{"usingComponents": {"mp-searchbar": "weui-miniprogram/searchbar/searchbar"}
}

  1. 在頁面需要的位置添加布局代碼,插入到列表之上,頭部之下的位置
<view><!-- 頭部布局 --><view class="page__bd"><mp-searchbar bindinput="searchTitle" ></mp-searchbar></view><!-- 列表布局 -->
</view>

顯示效果:

6fec9202308041703293100.png

4. 監聽輸入框數據

searchTitle: function (event) {console.log('search',event.detail.value)}

到這里,我相信大家一定有對UI組件庫相見恨晚對感覺,寫樣式實在是太痛苦了!但是話說回來,組件庫只是覆蓋了我們常用組件,如果組件庫沒有的組件我們還是要老老實實自己寫,所以在樣式的編寫能力還是非常重要的,在學習的過程中一定要多加練習。

精準查詢

當我們拿到數據后就開始去查詢,在這里我們需要改造下我們的 getMemoList 函數。

// 獲取備忘錄列表,支持搜索標題
function getMemoList(value) {// 1. 獲取數據庫引用const db = wx.cloud.database()// 2. 找到集合獲取數據let memo = db.collection('memo')// 3. 判斷是否有查詢數據if (value) {memo = memo.where({title: value})}// 4. 判斷查詢返回數據return memo.orderBy('createTime', 'desc').get()
}

然后在監聽的時候調用

searchTitle: function (event) {let value = event.detail.valuegetMemoList(value).then(res=>{console.log(res.data)this.udpateList(res.data)})}

實現效果:

598bc202308041703525165.png

但是實際場景下,很多時候我們都是通過模糊匹配,因為有可能備忘錄的標題過長了,不便于用戶記住。

模糊查詢

在這里主要是查詢條件用正則匹配,使用 RegExp 構造器構造正則對象。

memo.where({title: db.RegExp({regexp: value, //從搜索欄中獲取的value作為規則進行匹配。options: 'i', //大小寫不區分})

實現效果:

34724202308041704078885.png

分頁查詢

當備忘錄使用的時間越來越長的時候,那么數據也會隨著變多,這個時候實際需求也不需要一次性全部加載出來,那么分頁的需求就隨之而來。小程序端操作云數據庫的 get() 獲取數據API,一次性最多拉取20條。

那么如何進行數據分頁?官方給出了案例:

db.collection('todos').where({_openid: 'xxx', // 填入當前用戶 openid}).skip(10) // 跳過結果集中的前 10 條,從第 11 條開始返回.limit(10) // 限制返回數量為 10 條.get().then(res => {console.log(res.data)}).catch(err => {console.error(err)})

主要是通過 skip 和 limit 。
skip:從第多少條開始取
limit:一次性取多少條數據

我們來根據實際業務來實現下

  1. 定義頁數和每頁數量
 /*** 頁面的初始數據*/data: {pageNo:0, // 默認第一頁pageSize:5, // 一頁5條數據},

  1. 改造列表數據查詢函數
function getMemoList(pageNo, pageSize) {const db = wx.cloud.database()return db.collection('memo').skip(pageNo * pageSize).limit(pageSize).orderBy('createTime', 'desc').get()
}

  1. 首次調用方式傳入參數
onShow() {getMemoList(this.data.pageNo,this.data.pageSize).then(res => {this.udpateList(res.data)})}

  1. 監聽頁面上拉回調事件
// 上拉加載onReachBottom (){this.loadList()}

  1. 實現具體數據加載邏輯
async loadList(){// 1. 獲取總條數let {total} = await getListTotal()// 2. 判斷是否全部已經加載完畢if(this.data.list.length<total){// 如果沒有加載完// 提示數據加載中wx.showLoading({title: '數據加載中...',})// 當前頁+1this.data.pageNo ++// 獲取下一頁數據let {data} = await getMemoList(this.data.pageNo,this.data.pageSize)this.setData({// 拼接數據,頁面展示list:this.data.list.concat(data)})// 關閉加載提示wx.hideLoading()}else{// 加載完成提示:“無更多數據”wx.showToast({icon:'error',title: '無更多數據',})}},

注意:

  • 以上邏輯中使用async/await來減少了回調讓代碼可讀寫更強。
  • 以上邏輯中使用到獲取列表總數的 getListTotal 使用了 count 函數。
function getListTotal() {const db = wx.cloud.database()return db.collection('memo').count()
}

指定返回

在實際業務中通常列表子項詳情很多,但是列表只需要展示部分關鍵信息,那么這個時候我們就只需要查列表需要展示的字段,指定返回結果,沒有必要的字段就不需要返回,使用 field 進行實現。
如:當前列表只需要顯示標題字段數據。

// 獲取備忘錄列表
function getMemoList(pageNo, pageSize) {const db = wx.cloud.database()return db.collection('memo').field({title: true,}).get()
}

數據返回

26ad5202308041705045924.png

在實際業務場景也是列表通常不會查詢出所有數據,點擊詳情才會把所有數據通過id查詢出來,所以在列表頁面到詳情頁面參數也是最佳做法是傳遞id字段,而不是把列表點擊對象傳遞到詳情頁面。

總結

今日學習:

  1. 數據庫 orderBy 排序條件
  2. 使用擴展庫WeUI組件庫
  3. 數據庫 where 查詢條件
  4. 數據庫 skip、limit、count 組合實現分頁查詢
  5. 數據庫 field 指定返回字段

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/37655.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/37655.shtml
英文地址,請注明出處:http://en.pswp.cn/news/37655.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

SciencePub學術| 智能計量類重點SCIE征稿中

SciencePub學術 刊源推薦: 智能計量類重點SCIE征稿中&#xff01;信息如下&#xff0c;錄滿為止&#xff1a; 一、期刊概況&#xff1a; 智能計量類重點SCIE 【期刊簡介】IF&#xff1a;2.0-2.5&#xff0c;JCR3區&#xff0c;中科院4區&#xff1b; 【版面類型】正刊&#…

new BigDecimal(double val)注意事項 / JWT解析BigDecimal類型數據

前言&#xff1a; 公司項目中有一個板塊需要解析JWT令牌獲取載荷里面封裝的數據&#xff0c;遇到要解析一個BigDecimal類型的數據 問題發現過程&#xff1a; 正常來說&#xff0c;我們解析一個JWT令牌的步驟如下&#xff1a; public static Claims getDataFromToken(String tok…

極狐GitLab 企業級 CI/CD 規模化落地實踐指南(一)

目錄 template 引用&#xff0c;減少代碼冗余&#xff0c;增強 CI/CD 構建擴展性 問題 1&#xff1a;代碼冗余&#xff0c;低效實踐 問題 2&#xff1a;維護性難&#xff0c;工作量大 ? local ? file ? remote ? template 收益 1&#xff1a;一處修改&#xff0c;多…

TIOBE2023年8月榜單發布,Python超越老將C/C++蟬聯冠軍

TIOBE 編程社區指數是一個衡量編程語言受歡迎程度的指標&#xff0c;評判的依據來自世界范圍內的工程師、課程、供應商及搜索引擎&#xff0c;TIOBE 官網近日公布了 2023 年 8 月的編程語言排行榜。 此次的榜單中&#xff0c;Python依舊穩居第一&#xff0c;占比達到了13.33%。…

jpg圖片太大怎么壓縮?這樣做輕松壓縮圖片

圖片太大會給存儲、分享帶來麻煩&#xff0c;但其實現在壓縮圖片大小也不是什么難事&#xff0c;下面就給大家分享幾個一直用的圖片壓縮方法&#xff0c;包含批量壓縮、在線壓縮、免費壓縮等多種方式&#xff0c;大家按需自取哈~ 方法一&#xff1a;嗨格式壓縮大師 這是一個可…

Kotlin Executors線程池newSingleThreadExecutor單線程

Kotlin Executors線程池newSingleThreadExecutor單線程 import java.util.concurrent.Executorsfun main() {val mExecutorService Executors.newSingleThreadExecutor()for (i in 1..5) {mExecutorService.execute {println("seq-$i tid:${Thread.currentThread().threa…

typeScript 之 基礎

工具: PlayGround 源碼&#xff1a; GitHub TypeScript 變量聲明 typeScript中變量聲明注意&#xff1a; 開頭不能以數字開頭變量名稱可以包含數字和字母除了下劃線_和美元$符號外&#xff0c;不能包含其他任意特殊字符 聲明的結構&#xff1a; let 變量名&#xff1a; 類型…

面試經典150題——羅馬數字轉整數

羅馬數字包含以下七種字符: I&#xff0c; V&#xff0c; X&#xff0c; L&#xff0c;C&#xff0c;D 和 M。 字符 數值 I 1 V 5 X 10 L 50 C 100 D 500 M 1000 例如&#x…

docker 學習-- 01 基礎知識

docker 學習-- 01 基礎知識 文章目錄 docker 學習-- 01 基礎知識1.前言1.1 docker 是什么1.2 docker優點1.2.1 統一開發和生產環境:1.2.2 高性能:1.2.3 更輕松的維護和拓展&#xff1a;1.2.4 更輕松的遷移&#xff1a; 1.3 docker缺點1.3.1 運行環境受限1.3.2 文件管理和網絡端…

item_sku-獲取sku詳細信息

一、接口參數說明&#xff1a; item_sku-獲取sku詳細信息&#xff0c;點擊更多API調試&#xff0c;請移步注冊API賬號點擊獲取測試key和secret 公共參數 請求地址: https://api-gw.onebound.cn/taobao/item_sku 名稱類型必須描述keyString是調用key&#xff08;點擊獲取測試…

安全中間件的設計思路和簡單實踐

rasp 的侵入式特性和攔截特性導致開發和運維普通不太愿意配合&#xff0c;當生產環境出現問題時往往第一時間先把責任推給 rasp&#xff0c;逐漸的安全部門普遍只能把 rasp 設置為告警模式&#xff0c;而且越是大的集群攔截開的就越少&#xff0c;所以字節的 elkeid 和某外賣大…

P13-CNN學習1.3-ResNet(神之一手~)

論文地址:CVPR 2016 Open Access Repository https://arxiv.org/pdf/1512.03385.pdf Abstract 翻譯 深層的神經網絡越來越難以訓練。我們提供了一個殘差學習框架用來訓練那些非常深的神經網絡。我們重新定義了網絡的學習方式&#xff0c;讓網絡可以直接學習輸入信息與輸出信息…

Python-OpenCV中的圖像處理-圖像直方圖

Python-OpenCV中的圖像處理-圖像直方圖 圖像直方圖統計直方圖繪制直方圖Matplotlib繪制灰度直方圖Matplotlib繪制RGB直方圖 使用掩膜統計直方圖直方圖均衡化Numpy圖像直方圖均衡化OpenCV中的直方圖均衡化CLAHE 有限對比適應性直方圖均衡化 2D直方圖OpenCV中的2D直方圖Numpy中2D…

代碼隨想錄算法訓練營20期|第七天|哈希表part02|454.四數相加II ● 383. 贖金信 ● 15. 三數之和 ● 18. 四數之和 ● 總結

454.四數相加II 比較巧思的解法&#xff0c;先把nums1 和nums2的數兩兩相加&#xff0c;并存儲sum和次數 再在nums3和nums4里找對應和sum和為0的數值i,j Time: N^2 Space:N^2, 最壞情況下A和B的值各不相同&#xff0c;相加產生的數字個數為 n^2 class Solution {public int fo…

Spring AOP實踐:如何通過aop記錄日志?

目錄 一、依賴 二、自定義注解 三、切面 一、依賴 以SpringBoot工程為例&#xff0c;導入aop的依賴。 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId> </dependency> 二…

為什么要自動化Web測試?

Web自動化是更快地實現所需結果的較佳方式。自動化測試在市場上引起了巨大的轟動。此軟件測試過程可以讓您使用正確的自動化測試工具和技術集自動執行測試過程。我們執行它是為了檢查軟件應用程序是否具有完全按照我們希望它執行的方式執行的勇氣。 比以往更快地獲得反饋 自動化…

基于Promise.resolve實現Koa請求隊列中間件

本文作者為360奇舞團前端工程師 前言 最近在做一個 AIGC 項目&#xff0c;后端基于 Koa2 實現。其中有一個需求就是調用兄弟業務線服務端 AIGC 能力生成圖片。但由于目前兄弟業務線的 AIGC 項目也是處于測試階段&#xff0c;能夠提供的服務器資源有限&#xff0c;當并發請求資源…

kafka和rabbitmq之間的區別以及適用場景

Kafka 和 RabbitMQ 都是流行的消息傳遞系統&#xff0c;用于實現分布式系統中的消息傳遞、事件處理和數據流。它們在設計和適用場景上有一些不同&#xff0c;下面詳細介紹它們之間的區別和適用場景。 Kafka 特點和優勢&#xff1a; 高吞吐量&#xff1a; Kafka 的設計目標是實…

【Java】數據交換 Json 和 異步請求 Ajax

&#x1f384;歡迎來到邊境矢夢的csdn博文&#xff0c;本文主要講解Java 中 數據交換和異步請求 Json&Ajax 的相關知識&#x1f384; &#x1f308;我是邊境矢夢&#xff0c;一個正在為秋招和算法競賽做準備的學生&#x1f308; &#x1f386;喜歡的朋友可以關注一下&#…

go mod 添加私有庫GOPRIVATE

私有地址 形式倉庫域名/組織名形式倉庫域名形式*倉庫域名 示例私有地址&#xff1a; gitee.com/takujo_admin 或者igitlab.com 多個私有地址,分割&#xff0c;示例&#xff1a; gitee.com,igitlab.com 修改env go env -w GOPRIVATE"私有地址" go env -w …