Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
DCloud
uni-app
提交
8bedd228
U
uni-app
项目概览
DCloud
/
uni-app
4 个月 前同步成功
通知
730
Star
38707
Fork
3642
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
7
列表
看板
标记
里程碑
合并请求
1
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
U
uni-app
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
7
Issue
7
列表
看板
标记
里程碑
合并请求
1
合并请求
1
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
未验证
提交
8bedd228
编写于
10月 25, 2020
作者:
W
wanganxp
提交者:
GitHub
10月 25, 2020
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Update uni-clientdb-component.md
上级
24446616
变更
1
显示空白变更内容
内联
并排
Showing
1 changed file
with
96 addition
and
67 deletion
+96
-67
docs/uniCloud/uni-clientdb-component.md
docs/uniCloud/uni-clientdb-component.md
+96
-67
未找到文件。
docs/uniCloud/uni-clientdb-component.md
浏览文件 @
8bedd228
#
uni-clientdb
#
# uni-clientdb组件
uni-clientdb组件是一个数据库查询组件,它是对uni-clientdb
的js库的再封装。
`<uni-clientdb>`
组件是一个数据库查询组件,它是对
`uni-clientdb`
的js库的再封装。
前端
可以以组件方式非常方便的
获取uniCloud的云端数据库中的数据,并绑定在界面上进行渲染。
前端
通过组件方式直接
获取uniCloud的云端数据库中的数据,并绑定在界面上进行渲染。
在传统开发中,开发者需要在前端定义data、通过request联网获取接口数据、然后赋值给data。同时后端还
是
写接口来查库和反馈数据。
在传统开发中,开发者需要在前端定义data、通过request联网获取接口数据、然后赋值给data。同时后端还
需要
写接口来查库和反馈数据。
有了
uni-clientdb组件,
**上述工作只需要1行代码**
!写组件,设组件的属性,在组件
中指定要查什么表、哪些字段、以及查询条件,就OK了!
有了
`<uni-clientdb>`
组件,
**上述工作只需要1行代码**
!写组件,设组件的属性,在属性
中指定要查什么表、哪些字段、以及查询条件,就OK了!
尤其适用于列表、详情等展示类页面。开发效率可以大幅度的提升。
如下:
同时,它的查询写法也比sql语句和nosql语法更简洁、更符合js开发者的习惯。没学过sql或nosql的前端,也可以轻松掌握。
```
html
<uni-clientdb
v-slot:default=
"{data, loading, error, options}"
collection=
"table1"
field=
"field1"
:getone=
"true"
where=
"id=='1'"
>
<view>
{{ data.name}}
</view>
</uni-clientdb>
```
`<uni-clientdb>`
组件尤其适用于列表、详情等展示类页面。开发效率可以大幅度的提升。
`<uni-clientdb>`
组件的查询语法是
`jql`
,这是一种比sql语句和nosql语法更简洁、更符合js开发者习惯的查询语法。没学过sql或nosql的前端,也可以轻松掌握。
[
jql详见
](
https://uniapp.dcloud.net.cn/uniCloud/uni-clientDB?id=jsquery
)
`<uni-clientdb>`
组件只支持查询。如果要对数据库进行新增修改删除操作,仍需使用clientDB的js API进行add、update、remove操作。
`<uni-clientdb>`
组件没有预置到基础库,需单独下载插件到工程中。下载地址为:
[
https://ext.dcloud.net.cn/plugin?id=3256
](
https://ext.dcloud.net.cn/plugin?id=3256
)
**平台差异及版本说明**
**平台差异及版本说明**
...
@@ -18,31 +32,50 @@ uni-clientdb组件是一个数据库查询组件,它是对uni-clientdb的js库
...
@@ -18,31 +32,50 @@ uni-clientdb组件是一个数据库查询组件,它是对uni-clientdb的js库
|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
|√(2.9.5+)|√|√|√|√|√|√|x|√|
|√(2.9.5+)|√|√|√|√|√|√|x|√|
从HBuilderX 2.9.5+ 起支持
`<uni-clientdb>`
组件,与小程序基础库版本无关。
###
#
属性
### 属性
|属性|类型|描述|
|属性|类型|描述|
|:-|:-|:-|
|:-|:-|:-|
|v-slot:default||查询状态(失败、联网中)及结果(data)|
|v-slot:default||查询状态(失败、联网中)及结果(data)|
|ref|string|vue组件引用标记|
|ref|string|vue组件引用标记|
|collection|string|表名|
|collection|string|表名
。支持输入多个表名,用
`,`
分割
|
|field|string|查询字段,多个字段用
`,`
分割|
|field|string|查询字段,多个字段用
`,`
分割|
|where|string|查询条件,内容较多,另见文档:
[
详情
](
https://uniapp.dcloud.net.cn/uniCloud/uni-clientDB?id=jsquery
)
|
|where|string|查询条件,内容较多,另见
`jql`
文档:
[
详情
](
https://uniapp.dcloud.net.cn/uniCloud/uni-clientDB?id=jsquery
)
|
|orderby|string|排序字段及正序倒叙设置|
|orderby|string|排序字段及正序倒叙设置|
|page-data|String|分页策略选择。值为
`add`
代表下一页的数据追加到之前的数据中,常用于滚动到底加载下一页;值为
`replace`
时则替换当前data数据,常用于PC式交互,列表底部有页码分页按钮|
|page-current|Number|当前页|
|page-current|Number|当前页|
|page-size|Number|每页数据数量|
|page-size|Number|每页数据数量|
|page-data|String|
`add`
多次查询的集合,
`replace`
当前查询的集合|
|getcount|Boolan|是否查询总数据条数,默认
`false`
,需要分页模式时指定为
`true`
|
|getcount|Boolan|是否查询总数据条数,默认
`false`
,需要分页模式时指定为
`true`
|
|getone|Boolean|指定查询结果是否
返回数组第一条数据,默认 false。在false情况下返回的是数组,即便只有一条结果,也需要[0]的方式获取。在true下,直接返回结果数据,少一层数组。应用场景:
详情页|
|getone|Boolean|指定查询结果是否
仅返回数组第一条数据,默认 false。在false情况下返回的是数组,即便只有一条结果,也需要[0]的方式获取。在值为 true 时,直接返回结果数据,少一层数组。一般用于非列表页,比如
详情页|
|action|string|云端执行数据库查询的前或后,触发某个action函数操作,进行预处理或后处理,
[
详情
](
https://uniapp.dcloud.net.cn/uniCloud/uni-clientDB?id=%e4%ba%91%e7%ab%af%e9%83%a8%e5%88%86
)
。场景:前端无权操作的数据,比如阅读数+1|
|action|string|云端执行数据库查询的前或后,触发某个action函数操作,进行预处理或后处理,
[
详情
](
https://uniapp.dcloud.net.cn/uniCloud/uni-clientDB?id=%e4%ba%91%e7%ab%af%e9%83%a8%e5%88%86
)
。场景:前端无权操作的数据,比如阅读数+1|
|manual|Boolean|是否手动加载数据,默认为 false,页面onready时自动联网加载数据。如果设为 true,则需要自行指定时机通过方法
`this.$refs.udb.loadData()`
来触发联网,其中的
`udb`
指组件的ref值|
|manual|Boolean|是否手动加载数据,默认为 false,页面onready时自动联网加载数据。如果设为 true,则需要自行指定时机通过方法
`this.$refs.udb.loadData()`
来触发联网,其中的
`udb`
指组件的ref值|
|@load|EventHandle|成功回调。
如联网返回结果后,想
修改下数据再渲染界面,则在本方法里对data进行修改|
|@load|EventHandle|成功回调。
联网返回结果后,若希望先
修改下数据再渲染界面,则在本方法里对data进行修改|
|@error|EventHandle|失败回调|
|@error|EventHandle|失败回调|
**提示:支持跨表查询,后续会补充、groupby等高级功能**
TODO:暂不支持groupby、in子查询功能。后续会补充
**示例**
比如云数据库有个user的表,里面有字段id、name,查询id=1的数据,那么写法如下:
```
html
<template>
<view>
<uni-clientdb
v-slot:default=
"{data, loading, error, options}"
collection=
"user"
field=
"name"
:getone=
"true"
where=
"id=='1'"
>
<view>
{{ data.name}}
</view>
</uni-clientdb>
</view>
</template>
```
**注意:除非使用admin账户登录操作,否则需要在 uniCloud 控制台对要查询的表增加 Schema 权限配置。至少配置读取权限,否则无权查询**
,详情
[
https://uniapp.dcloud.net.cn/uniCloud/schema
](
https://uniapp.dcloud.net.cn/uniCloud/schema
)
###
#
v-slot:default
### v-slot:default
```
```
<uni-clientdb v-slot:default="{data, pagination, loading, error, options}"></uni-clientdb>
<uni-clientdb v-slot:default="{data, pagination, loading, error, options}"></uni-clientdb>
...
@@ -60,17 +93,20 @@ uni-clientdb组件是一个数据库查询组件,它是对uni-clientdb的js库
...
@@ -60,17 +93,20 @@ uni-clientdb组件是一个数据库查询组件,它是对uni-clientdb的js库
**提示:如果不指定分页模式, `data` 为多次查询的集合**
**提示:如果不指定分页模式, `data` 为多次查询的集合**
###
#
orderby
### orderby
格式为
`字段名`
空格
`asc`
(升序)/
`desc`
(降序)
`,多个字段用 `
,
` 分割,优先级为字段顺序
格式为
`字段名`
空格
`asc`
(升序)/
`desc`
(降序)
`,多个字段用 `
,
` 分割,优先级为字段顺序
<!-- 升序可以不写,不写默认就是升序。 -->
示例代码
示例代码
```
```
<uni-clientdb orderby="createTime desc"></uni-clientdb>
<uni-clientdb orderby="createTime desc"></uni-clientdb>
```
```
### 事件
####
事件
- load
事件
load事件在查询执行后、渲染前触发,一般用于查询数据的二次加工。比如查库结果不能直接渲染时,可以在load事件里先对data进行预处理。
load事件在查询执行后、渲染前触发,一般用于查询数据的二次加工。比如查库结果不能直接渲染时,可以在load事件里先对data进行预处理。
...
@@ -86,6 +122,10 @@ handleLoad(data, ended, pagination) {
...
@@ -86,6 +122,10 @@ handleLoad(data, ended, pagination) {
}
}
```
```
数据库里的时间一般是时间戳,不能直接渲染。虽然可以在load事件中对时间格式化,但简单的方式是使用[`
<uni-dateformat>
`组件](https://ext.dcloud.net.cn/plugin?id=3279),无需写js处理。
- error事件
error事件在查询报错时触发
error事件在查询报错时触发
``` html
``` html
...
@@ -99,14 +139,17 @@ handleError(e) {
...
@@ -99,14 +139,17 @@ handleError(e) {
```
```
#### 方法
### 方法
- loadData
当
uni-clientdb
组件的 manual 属性设为为 true 时,不会在页面初始化时联网查询数据,此时需要通过本方法手动加载数据
当
`
<uni-clientdb>
`
组件的 manual 属性设为为 true 时,不会在页面初始化时联网查询数据,此时需要通过本方法手动加载数据
```js
```js
this.$refs.udb.loadData() //udb为uni-clientdb组件的ref属性值
this.$refs.udb.loadData() //udb为uni-clientdb组件的ref属性值
```
```
- loadMore
在列表的加载下一页场景下,使用ref方式访问组件方法,加载更多数据,每加载成功一次,当前页 +1
在列表的加载下一页场景下,使用ref方式访问组件方法,加载更多数据,每加载成功一次,当前页 +1
...
@@ -114,26 +157,20 @@ this.$refs.udb.loadData() //udb为uni-clientdb组件的ref属性值
...
@@ -114,26 +157,20 @@ this.$refs.udb.loadData() //udb为uni-clientdb组件的ref属性值
this.$refs.udb.loadMore() //udb为uni-clientdb组件的ref属性值
this.$refs.udb.loadMore() //udb为uni-clientdb组件的ref属性值
```
```
- dataList
#### 示例代码
在js中,可以打印`
<uni-clientdb>
` 组件的data
**需要在 uniCloud 控制台对要查询的表增加 Schema 权限配置。至少配置读取权限,否则无权查询**,详情 [https://uniapp.dcloud.net.cn/uniCloud/schema](https://uniapp.dcloud.net.cn/uniCloud/schema)
```js
console.log(this.$refs.udb.dataList);
```
比如云数据库有个user的表,里面有字段id、name,查询id=1的数据,那么写法如下:
但是在浏览器控制台里无法使用this来打印查看数据,为此特别新增了`
unidev.clientDB.data
`方法以优化调试体验。
```html
<template>
H5平台,开发模式下浏览器控制台输入 `
unidev.clientDB.data
`,可查看组件内部数据,多个组件通过索引查看 `
unidev.clientDB.data[0]
`
<view>
<uni-clientdb v-slot:default="{data, loading, error, options}" collection="user" field="name" :getone="true" where="id=='1'">
<view>
{{ data.name}}
</view>
</uni-clientdb>
</view>
</template>
```
跨表查询示例
### 联表查询
```html
```html
// 注意 `collection` 属性需要传入所有用到的表名,用逗号分隔,主表需要放在第一位
// 注意 `collection` 属性需要传入所有用到的表名,用逗号分隔,主表需要放在第一位
...
@@ -143,17 +180,19 @@ this.$refs.udb.loadMore() //udb为uni-clientdb组件的ref属性值
...
@@ -143,17 +180,19 @@ this.$refs.udb.loadMore() //udb为uni-clientdb组件的ref属性值
<view>
<view>
<uni-clientdb v-slot:default="{data, loading, error, options}" collection="order,book" where="'book.title == "三国演义"'" field="book{title,author},quantity">
<uni-clientdb v-slot:default="{data, loading, error, options}" collection="order,book" where="'book.title == "三国演义"'" field="book{title,author},quantity">
<view>
<view>
{{ data.name}}
<view v-for="(item, index) in data" :key="index" class="list-item">
{{ item.name}}
</view>
</view>
</view>
</uni-clientdb>
</uni-clientdb>
</view>
</view>
</template>
</template>
```
```
跨
表查询详情参考 [https://uniapp.dcloud.net.cn/uniCloud/database?id=lookup](https://uniapp.dcloud.net.cn/uniCloud/database?id=lookup)
联
表查询详情参考 [https://uniapp.dcloud.net.cn/uniCloud/database?id=lookup](https://uniapp.dcloud.net.cn/uniCloud/database?id=lookup)
### 列表分页@page
模式1:上拉加载上一页。下一页的查询结果会追加合并到data里
- 列表分页
模式1:上拉加载上一页。下一页的查询结果会追加合并到data里
```html
```html
<template>
<template>
...
@@ -170,6 +209,7 @@ this.$refs.udb.loadMore() //udb为uni-clientdb组件的ref属性值
...
@@ -170,6 +209,7 @@ this.$refs.udb.loadMore() //udb为uni-clientdb组件的ref属性值
<view v-if="error" class="error">{{error.message}}</view>
<view v-if="error" class="error">{{error.message}}</view>
<view v-else class="list">
<view v-else class="list">
<view v-for="(item, index) in data" :key="index" class="list-item">
<view v-for="(item, index) in data" :key="index" class="list-item">
{{item.name}}
<!-- 使用日期格式化组件,详情见插件 https://ext.dcloud.net.cn/search?q=date-format -->
<!-- 使用日期格式化组件,详情见插件 https://ext.dcloud.net.cn/search?q=date-format -->
<uni-dateformat :date="item.createTime" />
<uni-dateformat :date="item.createTime" />
</view>
</view>
...
@@ -188,30 +228,19 @@ this.$refs.udb.loadMore() //udb为uni-clientdb组件的ref属性值
...
@@ -188,30 +228,19 @@ this.$refs.udb.loadMore() //udb为uni-clientdb组件的ref属性值
where: {} // 类型为对象或字符串
where: {} // 类型为对象或字符串
}
}
},
},
onReady() {
onPullDownRefresh() { //下拉刷新
// 当 uni-clientdb manual 属性设为为 true 时,手动加载数据
// this.$refs.udb.loadData()
},
onPullDownRefresh() {
this.$refs.udb.loadData({
this.$refs.udb.loadData({
clear: true
clear: true
}, () => {
}, () => {
uni.stopPullDownRefresh()
uni.stopPullDownRefresh()
})
})
},
},
onReachBottom() {
onReachBottom() {
//滚动到底翻页
this.$refs.udb.loadMore()
this.$refs.udb.loadMore()
},
},
methods: {
methods: {
onqueryload(data, ended) {
onqueryload(data, ended) {
// 格式化数据, 模板中已使用日期格式化组件,不在需要下面的js格式化
// 可在此处预处理数据,然后再渲染界面
// data.forEach((item) => {
// item.createTime = new Date(item.createTime).toLocaleString()
// })
if (ended) {
// 没有更多数据了
}
},
},
onqueryerror(e) {
onqueryerror(e) {
// 加载数据失败
// 加载数据失败
...
@@ -246,7 +275,7 @@ this.$refs.udb.loadMore() //udb为uni-clientdb组件的ref属性值
...
@@ -246,7 +275,7 @@ this.$refs.udb.loadMore() //udb为uni-clientdb组件的ref属性值
```
```
模式2:使用分页控件,点击第二页则只显示第二页数据,第一页数据清空。data会重置为下一页的查询结果,上一页数据丢弃
- 列表分页
模式2:使用分页控件,点击第二页则只显示第二页数据,第一页数据清空。data会重置为下一页的查询结果,上一页数据丢弃
```html
```html
<template>
<template>
...
@@ -262,7 +291,9 @@ this.$refs.udb.loadMore() //udb为uni-clientdb组件的ref属性值
...
@@ -262,7 +291,9 @@ this.$refs.udb.loadMore() //udb为uni-clientdb组件的ref属性值
<view v-if="error" class="error">{{error.errMsg}}</view>
<view v-if="error" class="error">{{error.errMsg}}</view>
<view v-else class="list">
<view v-else class="list">
<view v-for="(item, index) in data" :key="index" class="list-item">
<view v-for="(item, index) in data" :key="index" class="list-item">
{{ item.createTime }}
{{item.name}}
<!-- 使用日期格式化组件,详情见插件 https://ext.dcloud.net.cn/search?q=date-format -->
<uni-dateformat :date="item.createTime" />
</view>
</view>
</view>
</view>
<view class="loading" v-if="loading">加载中...</view>
<view class="loading" v-if="loading">加载中...</view>
...
@@ -279,7 +310,7 @@ this.$refs.udb.loadMore() //udb为uni-clientdb组件的ref属性值
...
@@ -279,7 +310,7 @@ this.$refs.udb.loadMore() //udb为uni-clientdb组件的ref属性值
options: {}, // 插槽不能访问外面的数据,通过此参数传递, 不支持传递函数
options: {}, // 插槽不能访问外面的数据,通过此参数传递, 不支持传递函数
}
}
},
},
onPullDownRefresh() {
onPullDownRefresh() {
//下拉刷新
this.$refs.udb.loadData({
this.$refs.udb.loadData({
clear: true
clear: true
}, () => {
}, () => {
...
@@ -288,13 +319,7 @@ this.$refs.udb.loadMore() //udb为uni-clientdb组件的ref属性值
...
@@ -288,13 +319,7 @@ this.$refs.udb.loadMore() //udb为uni-clientdb组件的ref属性值
},
},
methods: {
methods: {
onqueryload(data, ended) {
onqueryload(data, ended) {
data.forEach((item) => {
// 可在此处预处理数据,然后再渲染界面
item.createTime = new Date(item.createTime).toLocaleString()
})
// 上述时间格式化仅为演示,实际开发中推荐在组件里直接使用`<uni-dateformat>`组件,不用在load事件中通过js格式化数据
if (ended) {
// 没有更多数据了
}
},
},
onqueryerror(e) {
onqueryerror(e) {
// 加载数据失败
// 加载数据失败
...
@@ -333,8 +358,15 @@ this.$refs.udb.loadMore() //udb为uni-clientdb组件的ref属性值
...
@@ -333,8 +358,15 @@ this.$refs.udb.loadMore() //udb为uni-clientdb组件的ref属性值
```
```
使用分页控件,常见于PC端。在这个uniCloud Admin的[权限管理插件](https://ext.dcloud.net.cn/plugin?id=3269)插件中,有完整的分页展示数据、新增删除数据的示例代码。
### 组件嵌套
组件嵌套示例,访问父组件 data
`
<uni-clientdb>
` 组件支持嵌套。
子组件中访问父组件 data 时,需options传递数据
如下示例演示了2个组件的嵌套,以及在子组件中如何访问父组件 data
``` html
``` html
...
@@ -364,13 +396,10 @@ this.$refs.udb.loadMore() //udb为uni-clientdb组件的ref属性值
...
@@ -364,13 +396,10 @@ this.$refs.udb.loadMore() //udb为uni-clientdb组件的ref属性值
```
```
完整项目示例见插件市场: [https://ext.dcloud.net.cn/plugin?id=3256](https://ext.dcloud.net.cn/plugin?id=3256)
完整项目示例见插件市场
的示例项目
: [https://ext.dcloud.net.cn/plugin?id=3256](https://ext.dcloud.net.cn/plugin?id=3256)
**调试小技巧**
**调试小技巧**
- H5平台,开发模式下浏览器控制台输入 `
unidev.clientDB.data
`,可查看组件内部数据,多个组件通过索引查看 `
unidev.clientDB.data[0]
`
- H5平台,开发模式下浏览器控制台输入 `
unidev.clientDB.data
`,可查看组件内部数据,多个组件通过索引查看 `
unidev.clientDB.data[0]
`
**Tips**
- 时间显示,推荐使用`
<uni-dateformat>
`
组件,可以避免在 load 事件中写代码对时间进行格式处理。
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录