小程序云开发快速入门(2/4)

news2025/4/9 3:11:50

前言

我们对《微信小程序云开发快速入门(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>

显示效果:

image.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.value
    getMemoList(value).then(res=>{
      console.log(res.data)
      this.udpateList(res.data)
    })
  }

实现效果:

image.png
但是实际场景下,很多时候我们都是通过模糊匹配,因为有可能备忘录的标题过长了,不便于用户记住。

模糊查询

在这里主要是查询条件用正则匹配,使用 RegExp 构造器构造正则对象。

memo.where({
      title: db.RegExp({
        regexp: value, //从搜索栏中获取的value作为规则进行匹配。
        options: 'i', //大小写不区分
    })

实现效果:

image.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: '数据加载中...',
      })
      // 当前页+1
      this.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()
}

数据返回

image.png
在实际业务场景也是列表通常不会查询出所有数据,点击详情才会把所有数据通过id查询出来,所以在列表页面到详情页面参数也是最佳做法是传递id字段,而不是把列表点击对象传递到详情页面。

总结

今日学习:

  1. 数据库 orderBy 排序条件
  2. 使用扩展库WeUI组件库
  3. 数据库 where 查询条件
  4. 数据库 skip、limit、count 组合实现分页查询
  5. 数据库 field 指定返回字段

学习更多小程序云开发快速入门知识请关注CRMEB

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/830089.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

选读SQL经典实例笔记16_逻辑否定

1. 示例数据 1.1. student insert into student values (1,AARON,20) insert into student values (2,CHUCK,21) insert into student values (3,DOUG,20) insert into student values (4,MAGGIE,19) insert into student values (5,STEVE,22) insert into student values (6…

Java内存溢出的排查工具和方法

JVM内存溢出事故回顾 JVM内存溢出的排查方法个工具介绍 事故回顾 • 9:58收到报警&#xff0c;资讯延时1小时。 • 10:10排查出接口全部超时&#xff0c;超时时间2s。 • 去运维那边执行jstat发现元空间沾满了&#xff0c;疯狂fgc。 • 执行jmap -dump 并下载。 • 使用MAT分…

VLAN原理+配置

目录 一&#xff0c; 以太网二层交换机 二&#xff0c;三层架构&#xff1a; 三&#xff0c;VLAN配置思路 1.创建vlan 2.接口划入vlan 3.trunk干道 4.vlan间路由器 5.DHCP池塘配置 四&#xff0c;华为VLAN部分的接口模式讲解&#xff1a; 五&#xff0c;华为VLAN部分的…

【雕爷学编程】MicroPython动手做(30)——物联网之Blynk 2

知识点&#xff1a;什么是掌控板&#xff1f; 掌控板是一块普及STEAM创客教育、人工智能教育、机器人编程教育的开源智能硬件。它集成ESP-32高性能双核芯片&#xff0c;支持WiFi和蓝牙双模通信&#xff0c;可作为物联网节点&#xff0c;实现物联网应用。同时掌控板上集成了OLED…

阿里云出品—高分计算机好书推荐榜

1、云原生架构白皮书 云原生是一种构建和运行应用程序的方法&#xff0c;它能实现构建应用简便快捷&#xff0c;部署应用轻松自如&#xff0c;越来越多公司和个人选择使用云原生技术。《云原生架构白皮书》作为业界首本全方位构建云原生架构规划与实践全景图的白皮书&#xff…

【牛客】统计字符

⭐️ 题目描述 &#x1f31f; OJ链接&#xff1a;HJ40 统计字符 ps&#xff1a; 判断字符可以直接使用头文件自带的函数。 函数作用iscntrl判断是否为控制字符isspace判断是否为空白字符&#xff08;空格、换页’\f’、换行’\n’、回车’\r’、制表符’\t&#xff09;isdigi…

「应用实时监控 ARMS 」斩获「根因分析技术」先进级认证

阿里云云原生可观测 ARMS 率先斩获「根因分析技术」先进级认证 7 月 25 日&#xff0c;由中国信通院发起的“2023 可信云-系统稳定性”首批评估结果在可信云大会现场公布&#xff0c;应用实时监控服务 ARMS 斩获《可观测性标准体系要求 - 根因分析技术分级能力要求》“先进级”…

Pytorch深度学习之余弦退火学习率设置

1. 什么是余弦退火学习率&#xff1f; 余弦退火学习速率调度是改进深度神经网络学习过程的常用方法。当深度神经网络在大型数据集上训练时&#xff0c;它尤其有用&#xff0c;因为在大型数据集中&#xff0c;学习过程可能会陷入局部极小值。在训练过程中&#xff0c;学习率以不…

OpenMMLab【超级视客营】——把类别信息加入可视化结果中(MMSegmentation的第二个PR)

文章目录 1. 任务说明1.0 新手指引1.1 任务目标1.2 提交格式 2. 实施2.1 可视化的形式2.2 拉分支和提交PR2.2.1 拉分支2.2.2 提交PR 2.3 MMSegmentation中关于可视化的内容2.3.1 文档说明2.3.2 相关PR&#xff08;确定要修改的文件&#xff09;2.3.3 提交时的代码测试 2.4 发现…

java实现5种不同的验证码图片,包括中文、算式等,并返回前端

导入以下依赖 <!--图片验证码--><dependency><groupId>com.github.whvcse</groupId><artifactId>easy-captcha</artifactId><version>1.6.2</version></dependency> 编写controller package com.anXin.user.controlle…

Tessy 4.3.18

Tessy 4.3.18 windows 2692407267qq.com&#xff0c;更多内容请见http://user.qzone.qq.com/2692407267/

【无标题】uniapp引入萤石云 真机无法运行 踩坑集合

Uniapp 接入萤石云 踩坑 1.先用了 UIKit Javascript 就是在 pc端 那套流程 npm install ezuikit-jsimport EZUIKit from ezuikit-js;这套流程貌似只适用于pc端&#xff0c;我在接入uniapp的时候没看官网 以为都是一套流程&#xff0c;然后就在uniapp中也来了这一套&#xff0…

vue+neo4j(neo4j desktop安装和使用)

vueneo4j&#xff08;neo4j desktop安装和使用&#xff09; 本文目录 vueneo4j&#xff08;neo4j desktop安装和使用&#xff09;官网下载安装基本使用创建项目新增数据库连接数据库 使用cypher构建简单知识图谱创建节点创建关系删除节点及关系查询节点和关系 数据导出为json文…

分布式锁(Redis分布式锁)

Redis分布式锁原理及应用 前言一、基本原理1.1 什么是分布式锁1.2 分布式锁满足的条件1.3 常见的分布式锁 二、Redis分布式锁的实现核心思路2.1 实现分布式锁时需要实现的两个基本方法2.2 核心思路 三、实现分布式锁版本四、Redis分布式锁误删情况说明4.1 逻辑说明4.2 解决方案…

FreeRTOS(4):软件定时器、中断管理

目录 一、延时函数 延时函数分类 vTaskDelay 与 HAL_Delay 的区别 二、软件定时器 什么是定时器&#xff1f; 软件定时器优缺点 软件定时器原理 软件定时器相关配置 单次定时器和周期定时器 1. 创建软件定时器 2. 开启软件定时器 3. 停止软件定时器 4. 复位软件定时…

【剑指 Offer 27】二叉树的镜像

题目&#xff1a; 请完成一个函数&#xff0c;输入一个二叉树&#xff0c;该函数输出它的镜像。 输入&#xff1a;root [4,2,7,1,3,6,9] 输出&#xff1a;[4,7,2,9,6,3,1] 输入输出样例 思考1&#xff1a; 二叉树的镜像&#xff0c;就是交换二叉树的每个节点的左右结点 所…

应用在多媒体手机中的低功率立体声编解码器

多媒体手机一般是指可以录制或播放视频的手机。多媒体的定义是多种媒体的综合&#xff0c;一般是图像、文字、声音等多种结合&#xff0c;所以多媒体手机是可以处理和使用图像文字声音相结合的移动设备。目前流行的多媒体概念&#xff0c;主要是指文字、图形、图像、声音等多种…

【数据结构】图文并茂,通过逻辑图带你轻松拿捏链表,实现各种接口功能(2)

君兮_的个人主页 勤时当勉励 岁月不待人 C/C 游戏开发 Hello,米娜桑们&#xff0c;这里是君兮_&#xff0c;我们接着之前讲过的顺序表来继续介绍初阶数据结构的内容&#xff0c;今天给大家带来的是有关链表的基本知识和各种接口功能的实现的第二部分。 好了&#xff0c;废话不…

Gitignore忽略文件

默认情况下&#xff0c;Git会监视我们项目中的所有内容&#xff0c;但是有些内容比如mode_modules中的内容&#xff0c;我们不希望他被Git所管理。 我们可以在我们项目目录中添加一个 .gitignore 文件来设置那些需要git忽略的文件。

Burpxss自动化测试工具validator配置和使用教程

一、配置教程 下载Phantomjs&#xff1a; http://phantomjs.org/download.html 下载xss.js https://github.com/nVisium/xssValidator 将xss.js和phantomjs.exe放在一起 利用phantomjs运行xss.js C:\xss>phantomjs.exe xss.js Bapp store里搜索xss validator,然后安装它 安…