首页 > 编程语言 >小程序云开发快速入门(2/4)

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

时间:2023-08-03 11:03:40浏览次数:35  
标签:查询 入门 get 程序 memo db 列表 排序 快速

前言

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

显示效果:

小程序云开发快速入门(2/4)_前端源码

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)
    })
  }

实现效果:

小程序云开发快速入门(2/4)_商城系统_02

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

模糊查询

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

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

实现效果:

小程序云开发快速入门(2/4)_小程序源码_03

分页查询

当备忘录使用的时间越来越长的时候,那么数据也会随着变多,这个时候实际需求也不需要一次性全部加载出来,那么分页的需求就随之而来。小程序端操作云数据库的 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()
}

数据返回

小程序云开发快速入门(2/4)_开源项目_04

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

总结

今日学习:

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

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

标签:查询,入门,get,程序,memo,db,列表,排序,快速
From: https://blog.51cto.com/u_15723831/6947349

相关文章

  • 微信小程序:富文本编辑器组件
    参考文章:微信小程序之实现封装一个富文本编辑器Editor的完整流程【附demo源码】欢迎点赞收藏地址:https://blog.csdn.net/XH_jing/article/details/115509316demo源码: https://github.com/jxh1997/Editor ,所以源代码均在Github上,下载即可使用。我个人在demo源码的基础上稍......
  • python教程 入门学习笔记 第5天 format函数拼接 两种打印方法 转义字符
    2)format函数拼接#format函数拼接s1="统计={0}{1}{2}".format("张三","工资",3400)#占位符{}中可以填写数字编号print(s1)s2="统计={}{}{}".format("李四","工资",4500)#用占位符{}拼接,占位符要与字符串数量一致print(s2)s3="统计={a}{b}{c}".forma......
  • SpringMVC入门案例
    坐标<!--Spring坐标--><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.0.5.RELEASE</version><......
  • SpringBoot 快速配置日志方法
     快速配置日志方法#loglogging.file=logs/stdout.loglogging.file.max-size=20KBlogging.pattern.file=%date[%thread][IP:%X{ip}|USER:%X{user}][%-5level%logger{80}]%msg%nlogging.pattern.console=%date[%thread][IP:%X{ip}|USER:%X{user}][%-5level%logger{80}]......
  • 程序员视角下的API数据接口对接指南
    ​ 在当今互联网时代,许多应用程序和网站都需要使用第三方的API接口来获取数据。API(ApplicationProgrammingInterface)允许不同的应用程序之间进行数据交互,从而提高开发效率和数据的可用性。本文将重点介绍如何对接API数据接口,包括请求方式、鉴权认证、参数传递等方面的内容。......
  • rock5b 尝试一次裸板程序
    在linux虚拟机里安装arm64交叉编译环境aptinstallgccmakebinutilsgcc-aarch64-linux-gnu binutils-aarch64-linux-gnuflexbison写一个helloworld.caarch64-linux-gnu-gcc-ohelloworldhelloworld.cfilehelloworld cpto/tftpanddownloadtoubootsetenvser......
  • C++入门到放弃(07)——构造函数和析构函数
    ​1.构造函数和析构函数是什么1.1构造函数通常一个类,其内部包含有变量和函数,当我们想要使用类的时候,总是会不得不面临这样一个问题,需要对类进行初始化,否则内部这些变量就会是随机值,导致程序出现异常。为此,我们需要在使用类之前对它进行初始化,C++就提供了这样一类特殊的函数——......
  • Redis宕机 快速恢复数据
    学习记录下 Redis中如何实现无畏宕机快速恢复和持久化-Redis-PHP中文网......
  • 使用快捷键在Unity中快速锁定和解锁Inspector右上角的锁功能
    使用快捷键在Unity中快速锁定和解锁Inspector右上角的锁功能在Unity中,Inspector窗口是一个非常重要的工具,它允许我们查看和编辑选定对象的属性。有时候,我们可能希望锁定Inspector窗口,以防止意外更改对象的属性。幸运的是,Unity提供了一种快捷键的方式来快速锁定和解锁Inspector窗口......
  • swoole-crontab基于swoole的定时器程序,支持秒级处理
    Swoole-Crontab(基于Swoole扩展)https://github.com/osgochina/Donkey1.概述基于swoole的定时器程序,支持秒级处理.异步多进程处理。完全兼容crontab语法,且支持秒的配置,可使用数组规定好精确操作时间单中心-多客户端模式,能够横向扩展web界面管理,增删改查任务,完整的权限控制.请使......