unicloud-db组件

2024-01-29 06:44
文章标签 组件 db database unicloud

本文主要是介绍unicloud-db组件,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

unicloud-db组件简介

属性

v-slot:default

collection

where

orderby

联表查询

loadtime

方法:loadData

方法:remove

方法:add

方法:refresh

方法:dataList

扩展:jql语句内云端环境变量


unicloud-db组件简介

<unicloud-db> 组件是一个数据库查询组件,它是对clientDB的js库的再封装。

前端通过组件方式直接获取uniCloud的云端数据库中的数据,并绑定在界面上进行渲染。

在传统开发中,开发者需要在前端定义data、通过request联网获取接口数据、然后赋值给data。同时后端还需要写接口来查库和反馈数据。

有了<unicloud-db> 组件,上述工作只需要1行代码!写组件,设组件的属性,在属性中指定要查什么表、哪些字段、以及查询条件,就OK了!

HBuilderX中敲下udb代码块,得到如下代码,然后通过collection属性指定要查询表“table1”,通过field属性指定要查询字段“field1”,并且在where属性中指定查询id为1的数据。查询结果data就可以直接渲染在界面上。

<unicloud-db v-slot:default="{data, loading, error, options}" collection="table1" field="field1" :getone="true" where="id=='1'"><view>{{ data}}</view>
</unicloud-db>

<unicloud-db> 组件尤其适用于列表、详情等展示类页面。开发效率可以大幅度的提升。

<unicloud-db> 组件的查询语法是jql,这是一种比sql语句和nosql语法更简洁、更符合js开发者习惯的查询语法。没学过sql或nosql的前端,也可以轻松掌握。jql详见

<unicloud-db> 组件不仅支持查询。还自带了add、remove、update方法,见下文方法章节

属性

属性类型描述
v-slot:default查询状态(失败、联网中)及结果(data)
refstringvue组件引用标记
spaceInfoObject服务空间信息,新增于HBuilderX 3.2.11。同uniCloud.init参数,参考:uniCloud.init
collectionstring表名。支持输入多个表名,用 , 分割,自HBuilderX 3.2.6起也支持传入tempCollection组成的数组
fieldstring指定要查询的字段,多个字段用 , 分割。不写本属性,即表示查询所有字段。支持用 oldname as newname方式对返回字段重命名
wherestring查询条件,对记录进行过滤。见下
orderbystring排序字段及正序倒序设置
foreign-keyString手动指定使用的关联关系,HBuilderX 3.1.10+ 详情
page-dataString分页策略选择。值为 add 代表下一页的数据追加到之前的数据中,常用于滚动到底加载下一页;值为 replace 时则替换当前data数据,常用于PC式交互,列表底部有页码分页按钮,默认值为add
page-currentNumber当前页
page-sizeNumber每页数据数量
getcountBoolean是否查询总数据条数,默认 false,需要分页模式时指定为 true
getoneBoolean指定查询结果是否仅返回数组第一条数据,默认 false。在false情况下返回的是数组,即便只有一条结果,也需要[0]的方式获取。在值为 true 时,直接返回结果数据,少一层数组,一般用于非列表页,比如详情页
actionstring云端执行数据库查询的前或后,触发某个action函数操作,进行预处理或后处理,详情。场景:前端无权操作的数据,比如阅读数+1
manualBoolean已过时,使用 loadtime 替代 是否手动加载数据,默认为 false,页面onready时自动联网加载数据。如果设为 true,则需要自行指定时机通过方法this.$refs.udb.loadData()来触发联网,其中的udb指组件的ref值。一般onLoad因时机太早取不到this.$refs.udb,在onReady里可以取到
gettreeBoolean是否查询树状结构数据,HBuilderX 3.0.5+ 详情
startwithStringgettree的第一层级条件,此初始条件可以省略,不传startWith时默认从最顶级开始查询,HBuilderX 3.0.5+
limitlevelNumbergettree查询返回的树的最大层级。超过设定层级的节点不会返回。默认10级,最大15,最小1,HBuilderX 3.0.5+
groupbyString对数据进行分组,HBuilderX 3.1.0+
group-fieldString对数据进行分组统计
distinctBoolean是否对数据查询结果中重复的记录进行去重,默认值false,HBuilderX 3.1.0+
loadtimeString加载数据时机,默认auto,可选值 auto|onready|manual,详情 HBuilderX3.1.10+
ssr-keyString详情 HBuilderX 3.4.11+
@loadEventHandle成功回调。联网返回结果后,若希望先修改下数据再渲染界面,则在本方法里对data进行修改
@errorEventHandle失败回调

TODO:暂不支持in子查询功能。后续会补充

注意:page-current/page-size 改变不重置数据(page-data="replace") 和 (loadtime="manual") 除外,collection/action/field/getcount/orderby/where 改变后清空已有数据

示例

比如云数据库有个user的表,里面有字段id、name,查询id=1的数据,那么写法如下:

注意下面示例使用了getone会返回一条对象形式的data,如不使用getone,data将会是数组形式,即多一层

<template><view><unicloud-db v-slot:default="{data, loading, error, options}" collection="user" field="name" :getone="true" where="id=='1'"><view>{{ data.name}}</view></unicloud-db></view>
</template>

注意:除非使用admin账户登录操作,否则需要在 uniCloud 控制台对要查询的表增加 Schema 权限配置。至少配置读取权限,否则无权在前端查询,详见 DB Schema

v-slot:default

<unicloud-db v-slot:default="{data, pagination, loading, hasMore, error, options}"></unicloud-db>

属性类型描述
dataArray|Object查询结果,默认值为Array, 当 getone 指定为 true 时,值为数组中第一条数据,类型为 Object,减少了一层
paginationObject分页属性
loadingBoolean查询中的状态。可根据此状态,在template中通过v-if显示等待内容,如<view v-if="loading">加载中...</view>
hasMoreBoolean是否有更多数据。可根据此状态,在template中通过v-if显示没有更多数据了,如<uni-load-more v-if="!hasMore" status="noMore"></uni-load-more><uni-load-more>详情 uni-load-more 加载更多 - DCloud 插件市场
errorObject查询错误。可根据此状态,在template中通过v-if显示等待内容,如<view v-if="error">加载错误</view>
optionsObject在小程序中,插槽不能访问外面的数据,需通过此参数传递, 不支持传递函数

提示:如果不指定分页模式, data 为多次查询的集合

状态示例:

<unicloud-db v-slot:default="{data, loading, error, options}" collection="user"><view v-if="error">{{error.message}}</view><view v-else-if="loading">正在加载...</view><view v-else>{{data}}</view>
</unicloud-db>

collection

collection有以下几种形式

单个collection字符串

<unicloud-db v-slot:default="{data, loading, error, options}" collection="user"><view v-if="error">{{error.message}}</view><view v-else-if="loading">正在加载...</view><view v-else>{{data}}</view>
</unicloud-db>

多个collection字符串拼接

用于联表查询,注意主表副表之间需要在schema内以foreignKey关联(副表支持多个)。如下示例以book作为主表,关联author表进行查询,在book表的schema内设置author_id字段指向author表

<unicloud-db v-slot:default="{data, loading, error, options}" collection="book,author"><view v-if="error">{{error.message}}</view><view v-else-if="loading">正在加载...</view><view v-else>{{data}}</view>
</unicloud-db>

多个临时表组成的数组

同样用于联表查询,但是与直接拼接多个字符串的方式不同,可以先对主表进行处理再关联。和直接使用多个表名字符串拼接相比,在主表数据量大的情况下性能有明显提升

<template><unicloud-db v-slot:default="{data, loading, error, options}" :collection="colList"><view v-if="error">{{error.message}}</view><view v-else-if="loading">正在加载...</view><view v-else>{{data}}</view></unicloud-db>
</template>
<script>const db = uniCloud.database()export default {data() {return {colList: [db.collection('book').where('name == "水浒传"').getTemp(),db.collection('author').getTemp()]}},onReady() {},methods: {}}
</script>

where

where中指定要查询的条件。比如只查询某个字段的值符合一定条件的记录。

组件的where属性,与clientDB的JS API是一致的,且内容较多,所以详见js API中相关jql文档:详情

但组件与js API有一个差别,就是组件的属性中若使用js中的变量,需额外注意。

例如查询uni-id-users表,字段username的值由js变量指定,有如下几种方式:

方式1. 使用模板字符串,用${}包裹变量

<template><view><unicloud-db collection="uni-id-users" :where="`username=='${tempstr}'`"></unicloud-db></view>
</template>
<script>export default {data() {return {tempstr: '123'}}}
</script>

方式2. 不在属性中写,而在js中拼接字符串

<template><view><unicloud-db ref="udb" collection="uni-id-users" :where="sWhere" loadtime="manual"></unicloud-db></view>
</template>
<script>export default {data() {return {tempstr: '123',sWhere: ''}}onLoad() {this.sWhere = "id=='" + this.tempstr + "'"// 组件上配置了 loadtime = "manual", 这里需要手动加载数据this.$nextTick(() => {this.$refs.udb.loadData()})}}
</script>

多条件查询示例:

方式1. 使用模板字符串,用${}包裹变量

<template><view><unicloud-db ref="udb" collection="uni-id-users" where="`id==${this.tempstr} && create_time > 1613960340000`"></unicloud-db></view>
</template>
<script>export default {data() {return {tempstr: '123'}}}
</script>

方式2. 使用js拼接字符串

<template><view><unicloud-db ref="udb" collection="uni-id-users" :where="sWhere" loadtime="manual"></unicloud-db></view>
</template>
<script>
export default {data() {return {tempstr: '123',sWhere: ''}}onLoad() {// id = this.tempstr 且 create_time > 1613960340000this.sWhere = "id=='" + this.tempstr + "' && create_time > 1613960340000"// id = this.tempstr 或 name != null// this.sWhere = "id=='" + this.tempstr + "' || name != null"// 组件上配置了 loadtime = "manual", 这里需要手动加载数据this.$nextTick(() => {this.$refs.udb.loadData()})}
}
</script>

上述示例使用的是==比较符,如需进行模糊搜索,则使用正则表达式。插件市场提供了完整的云端一体搜索模板,搜索类页面无需自行开发,可直接使用。详见

使用正则模糊查询示例:

<template><view class="content"><input @input="onKeyInput" placeholder="请输入搜索值" /><unicloud-db v-slot:default="{data, loading, error, options}" collection="goods" :where="where"><view v-if="error">{{error.message}}</view><view v-else></view></unicloud-db></view>
</template><script>
export default {data() {return {searchVal: ''}},computed: {where() {return `${new RegExp(this.searchVal, 'i')}.test(name)` // 使用计算属性得到完整where}},methods: {onKeyInput(e) {// 实际开发中这里应该还有防抖或者节流操作,这里不做演示this.searchVal = e.target.value}}
}
</script>

再次强调,where条件内容较多,组件和api用法相同,完整的where条件文档在api文档中,另见:JQL文档

orderby

格式为 字段名 空格 asc(升序)/desc(降序),多个字段用 , 分割,优先级为字段顺序

单字段排序,示例代码

<unicloud-db orderby="createTime desc"></unicloud-db>

多字段排序,示例代码

<unicloud-db orderby="createTime1 asc,createTime2 desc"></unicloud-db>

联表查询

联表查询有以下两种写法,对于数据量稍大的表推荐使用多个临时表组成的数组作为collection,可以在主表的getTemp内先进行过滤减小联表时的性能消耗。

更多关于联表查询的内容请参考:JQL联表查询

多个collection字符串拼接

用于联表查询,注意主表副表之间需要在schema内以foreignKey关联(副表支持多个)。如下示例以book作为主表,关联author表进行查询,在book表的schema内设置author_id字段指向author表

<unicloud-db v-slot:default="{data, loading, error, options}" collection="book,author"><view v-if="error">{{error.message}}</view><view v-else-if="loading">正在加载...</view><view v-else>{{data}}</view>
</unicloud-db>

多个临时表组成的数组

同样用于联表查询,但是与直接拼接多个字符串的方式不同,可以先对主表进行处理再关联。和直接使用多个表名字符串拼接相比,在主表数据量大的情况下性能有明显提升

<template><unicloud-db v-slot:default="{data, loading, error, options}" :collection="colList"><view v-if="error">{{error.message}}</view><view v-else-if="loading">正在加载...</view><view v-else>{{data}}</view></unicloud-db>
</template>
<script>const db = uniCloud.database()export default {data() {return {colList: [db.collection('book').where('name == "水浒传"').getTemp(),db.collection('author').getTemp()]}},onReady() {},methods: {}}
</script>

loadtime

类型描述
autoString页面就绪后或属性变化后加载数据,默认为auto
onreadyString页面就绪后不自动加载数据,属性变化后加载。适合在onready中接收上个页面的参数作为where条件时。
manualString手动模式,不自动加载数据。如果涉及到分页,需要先手动修改当前页,在调用加载数据

 

方法:loadData

当 <unicloud-db> 组件的 manual 属性设为 true 时,不会在页面初始化时联网查询数据,此时需要通过本方法在需要的时候手动加载数据。

this.$refs.udb.loadData() //udb为unicloud-db组件的ref属性值

一般onLoad因时机太早取不到this.$refs.udb,在onReady里可以取到。

举例常见场景,页面pagea在url中获取参数id,然后加载数据

请求地址:/pages/pagea?id=123

pagea.vue源码:

<template><view><unicloud-db ref="udb" collection="table1" :where="where" v-slot:default="{data,pagination,loading,error,options}" :options="options" manual>{{data}}</unicloud-db></view>
</template>
<script>
export default {data() {return {_id:'',where: ''}},onLoad(e) {const id = e.idif (id) {this._id = idthis.where = "_id == '" + this._id + "'"}else {uni.showModal({content:"页面参数错误",showCancel:false})}},onReady() {if (this._id) {this.$refs.udb.loadData()}}
}
</script>

下拉刷新示例

this.$refs.udb.loadData({clear: true}, callback)

可选参数 clear: true,是否清空数据和分页信息,true表示清空,默认false

callback 是回调函数,加载数据完成后触发(即使加载失败)

<script>export default {data() {return {}},// 页面生命周期,下拉刷新后触发onPullDownRefresh() {this.$refs.udb.loadData({clear: true}, () => {// 停止下拉刷新uni.stopPullDownRefresh()})}}
</script>

方法:remove

语法

this.$refs.udb.remove(id, options)

udb为unicloud-db组件的ref属性值

必选参数 id

属性类型默认值描述
idstring|Array传入数据库的_id

可选参数 options

属性类型默认值描述
actionstring云端执行数据库查询的前或后,触发某个action函数操作,进行预处理或后处理,详情。场景:前端无权操作的数据,比如阅读数+1
confirmTitlestring提示删除确认框标题
confirmContentstring是否删除该数据删除确认框提示
needConfirmbooleantrue控制是否有弹出框,HBuilderX 3.1.5+
needLoadingbooleantrue是否显示Loading,HBuilderX 3.1.5+
loadingTitlestring''显示loading的标题,HBuilderX 3.1.5+
successfunction删除成功后的回调
failfunction删除失败后的回调
completefunction完成后的回调

在列表页面,如果想删除一个item,原本要做很多事:

  1. 弹出删除确认框
  2. 弹出loading
  3. 调用clientDB的js api删除云端数据
  4. 接收云端删除结果,如果成功则关闭loading
  5. 进一步删除列表的data中对应的item,自动刷新页面

为减少重复开发,unicloud-db组件提供了remove方法,在列表渲染时绑定好index,直接调用remove方法即可一行代码完成上述5步。

首先在列表生成的时候给删除按钮绑定好id:

<unicloud-db ref="udb" :collection="collectionName" v-slot:default="{data,pagination,loading,error}"><uni-table :loading="loading" :emptyText="error.message || '没有更多数据'" border stripe ><uni-tr><uni-th>用户名</uni-th><uni-th>操作</uni-th></uni-tr><uni-tr v-for="(item,index) in data" :key="index"><uni-th>{{item.username}}</uni-th><uni-td><view><button @click="confirmDelete(item._id)" type="warn">删除</button></view></uni-td></uni-tr></uni-table>
</unicloud-db>

然后confirmDelete方法里面只有一行代码:

confirmDelete(id) {this.$refs.udb.remove(id)
}

clientDB组件的remove方法的参数只支持传入数据库的_id进行删除,不支持其他where条件删除。

参数传入的_id支持单个,也支持多个,即可以批量删除。多个id的格式是:

this.$refs.udb.remove(["5f921826cf447a000151b16d", "5f9dee1ff10d2400016f01a4"])

在uniCloud的web控制台的DB Schema界面,可自助生成数据表的admin管理插件,其中有多行数据批选批删示例。

完整实例,第二个是可选参数。

var ids = ["5f921826cf447a000151b16d", "5f9dee1ff10d2400016f01a4"]
this.$refs.udb.remove(ids, {action: '', // 删除前后的动作confirmTitle: '提示', // 确认框标题confirmContent: '是否删除该数据',  // 确认框内容success: (res) => { // 删除成功后的回调const { code, message } = res},fail: (err) => { // 删除失败后的回调const { message } = err},complete: () => { // 完成后的回调}
})

方法:add

语法

this.$refs.udb.add(value, options)

udb为unicloud-db组件的ref属性值

必选参数 value

属性类型默认值描述
valueObject新增数据

可选参数 options

属性类型默认值描述
actionstring云端执行数据库查询的前或后,触发某个action函数操作,进行预处理或后处理,详情。HBuilder 3.1.0+
showToastbooleantrue是否显示更新成功后的提示框
toastTitlestring新增成功新增成功后的toast提示
needLoadingbooleantrue是否显示Loading,HBuilderX 3.1.5+
loadingTitlestring''显示loading的标题,HBuilderX 3.1.5+
successfunction新增成功后的回调
failfunction新增失败后的回调
completefunction完成后的回调
<unicloud-db ref="udb" :collection="collectionName" v-slot:default="{data,pagination,loading,error}">
</unicloud-db>
this.$refs.udb.add(value)

完整实例

this.$refs.udb.add(value, {toastTitle: '新增成功', // toast提示语success: (res) => { // 新增成功后的回调const { code, message } = res},fail: (err) => { // 新增失败后的回调const { message } = err},complete: () => { // 完成后的回调}
})

方法:refresh

清空并重新加载当前页面数据

this.$refs.udb.refresh() //udb为unicloud-db组件的ref属性值

方法:dataList

在js中,获取<unicloud-db> 组件的data的方法如下:

console.log(this.$refs.udb.dataList);

如果修改了dataList的值,组件渲染的界面也会同步变化。

但是在浏览器控制台里无法使用this来打印查看数据,为此特别新增了unidev.clientDB.data方法以优化调试体验。

H5平台,开发模式下浏览器控制台输入 unidev.clientDB.data,可查看组件内部数据,多个组件通过索引查看 unidev.clientDB.data[0]

 

扩展:jql语句内云端环境变量

参数名说明
$cloudEnv_uid用户uid,依赖uni-id
$cloudEnv_now服务器时间戳
$cloudEnv_clientIP当前客户端IP

在字符串内使用

db.collection('user').where('_id==$cloudEnv_uid').get()

在对象内使用

db.collection('user').where({_id: db.getCloudEnv('$cloudEnv_uid')
}).get()

注意

  • 这些变量使用时并非直接获取对应的值,而是生成一个标记,在云端执行数据库操作时再将这个标记替换为实际的值

这篇关于unicloud-db组件的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/656067

相关文章

JS常用组件收集

收集了一些平时遇到的前端比较优秀的组件,方便以后开发的时候查找!!! 函数工具: Lodash 页面固定: stickUp、jQuery.Pin 轮播: unslider、swiper 开关: switch 复选框: icheck 气泡: grumble 隐藏元素: Headroom

SQL中的外键约束

外键约束用于表示两张表中的指标连接关系。外键约束的作用主要有以下三点: 1.确保子表中的某个字段(外键)只能引用父表中的有效记录2.主表中的列被删除时,子表中的关联列也会被删除3.主表中的列更新时,子表中的关联元素也会被更新 子表中的元素指向主表 以下是一个外键约束的实例展示

基于MySQL Binlog的Elasticsearch数据同步实践

一、为什么要做 随着马蜂窝的逐渐发展,我们的业务数据越来越多,单纯使用 MySQL 已经不能满足我们的数据查询需求,例如对于商品、订单等数据的多维度检索。 使用 Elasticsearch 存储业务数据可以很好的解决我们业务中的搜索需求。而数据进行异构存储后,随之而来的就是数据同步的问题。 二、现有方法及问题 对于数据同步,我们目前的解决方案是建立数据中间表。把需要检索的业务数据,统一放到一张M

如何去写一手好SQL

MySQL性能 最大数据量 抛开数据量和并发数,谈性能都是耍流氓。MySQL没有限制单表最大记录数,它取决于操作系统对文件大小的限制。 《阿里巴巴Java开发手册》提出单表行数超过500万行或者单表容量超过2GB,才推荐分库分表。性能由综合因素决定,抛开业务复杂度,影响程度依次是硬件配置、MySQL配置、数据表设计、索引优化。500万这个值仅供参考,并非铁律。 博主曾经操作过超过4亿行数据

性能分析之MySQL索引实战案例

文章目录 一、前言二、准备三、MySQL索引优化四、MySQL 索引知识回顾五、总结 一、前言 在上一讲性能工具之 JProfiler 简单登录案例分析实战中已经发现SQL没有建立索引问题,本文将一起从代码层去分析为什么没有建立索引? 开源ERP项目地址:https://gitee.com/jishenghua/JSH_ERP 二、准备 打开IDEA找到登录请求资源路径位置

MySQL数据库宕机,启动不起来,教你一招搞定!

作者介绍:老苏,10余年DBA工作运维经验,擅长Oracle、MySQL、PG、Mongodb数据库运维(如安装迁移,性能优化、故障应急处理等)公众号:老苏畅谈运维欢迎关注本人公众号,更多精彩与您分享。 MySQL数据库宕机,数据页损坏问题,启动不起来,该如何排查和解决,本文将为你说明具体的排查过程。 查看MySQL error日志 查看 MySQL error日志,排查哪个表(表空间

如何在页面调用utility bar并传递参数至lwc组件

1.在app的utility item中添加lwc组件: 2.调用utility bar api的方式有两种: 方法一,通过lwc调用: import {LightningElement,api ,wire } from 'lwc';import { publish, MessageContext } from 'lightning/messageService';import Ca

MySQL高性能优化规范

前言:      笔者最近上班途中突然想丰富下自己的数据库优化技能。于是在查阅了多篇文章后,总结出了这篇! 数据库命令规范 所有数据库对象名称必须使用小写字母并用下划线分割 所有数据库对象名称禁止使用mysql保留关键字(如果表名中包含关键字查询时,需要将其用单引号括起来) 数据库对象的命名要能做到见名识意,并且最后不要超过32个字符 临时库表必须以tmp_为前缀并以日期为后缀,备份

[MySQL表的增删改查-进阶]

🌈个人主页:努力学编程’ ⛅个人推荐: c语言从初阶到进阶 JavaEE详解 数据结构 ⚡学好数据结构,刷题刻不容缓:点击一起刷题 🌙心灵鸡汤:总有人要赢,为什么不能是我呢 💻💻💻数据库约束 🔭🔭🔭约束类型 not null: 指示某列不能存储 NULL 值unique: 保证某列的每行必须有唯一的值default: 规定没有给列赋值时的默认值.primary key:

MySQL-CRUD入门1

文章目录 认识配置文件client节点mysql节点mysqld节点 数据的添加(Create)添加一行数据添加多行数据两种添加数据的效率对比 数据的查询(Retrieve)全列查询指定列查询查询中带有表达式关于字面量关于as重命名 临时表引入distinct去重order by 排序关于NULL 认识配置文件 在我们的MySQL服务安装好了之后, 会有一个配置文件, 也就