查询构建器 Vue
@aiao/rxdb-model-vue 提供 Vue 版本的查询构建器组件与 composable,底层模型与类型来自 @aiao/rxdb-model。
安装
- npm
- Yarn
- pnpm
- Bun
npm install @aiao/rxdb-model @aiao/rxdb-model-vue
yarn add @aiao/rxdb-model @aiao/rxdb-model-vue
pnpm add @aiao/rxdb-model @aiao/rxdb-model-vue
bun add @aiao/rxdb-model @aiao/rxdb-model-vue
基础用法
使用组件
<script setup lang="ts">
import { QueryBuilder } from '@aiao/rxdb-model-vue';
import type { FieldMetadata } from '@aiao/rxdb-model';
const fields: FieldMetadata[] = [
{ name: 'name', displayName: '姓名', type: 'string' },
{ name: 'age', displayName: '年龄', type: 'number' },
{ name: 'active', displayName: '激活', type: 'boolean' }
];
function onQueryChange(query: unknown) {
console.log('查询:', query);
}
</script>
<template>
<QueryBuilder
:fields="fields"
:max-depth="3"
@query-change="onQueryChange"
@validation-change="v => console.log('校验:', v)"
/>
</template>
使用 Composable
<script setup lang="ts">
import { useQueryBuilder } from '@aiao/rxdb-model-vue';
const {
rootGroup,
validation,
fields,
hasRules,
addRule,
addGroup,
remove,
updateRule,
updateCombinator,
clear,
loadQuery,
moveItem,
toRxDBQuery
} = useQueryBuilder<User>({
fields: [
{ name: 'name', displayName: '姓名', type: 'string' },
{ name: 'age', displayName: '年龄', type: 'number' }
],
maxDepth: 3,
onQueryChange: query => fetchData(query)
});
function handleAddRule() {
addRule(rootGroup.value?.id, {
field: 'name',
operator: '=',
value: ''
});
}
</script>
<template>
<button @click="handleAddRule">添加条件</button>
<button @click="loadQuery(null)">重置</button>
<button @click="clear">清空</button>
<pre>{{ JSON.stringify(toRxDBQuery(), null, 2) }}</pre>
</template>
Composable API
useQueryBuilder
function useQueryBuilder<T extends object>(options?: UseQueryBuilderOptions<T>): UseQueryBuilderReturn<T>;
Options
schema: SchemaInfo:Schema 信息fields: FieldMetadata[]:字段列表,默认空数组initialQuery: RuleGroup<T> | QueryBuilderRuleGroup<T>:初始查询maxDepth: number:最大嵌套层级,默认5onQueryChange(query):查询变更回调onValidationChange(result):校验变更回调
返回值
rootGroup: ShallowRef<QueryBuilderRuleGroup<T> | undefined>:根规则组validation: ShallowRef<ValidationResult | undefined>:校验结果fields: Ref<FieldMetadata[]>:字段列表hasRules: ComputedRef<boolean>:当前是否已有规则addRule(parentId, rule):添加规则addGroup(parentId):添加分组remove(id):删除规则或分组updateRule(id, updates):更新规则updateCombinator(groupId, combinator):切换 AND/ORclear():清空所有规则loadQuery(query | null):加载查询toRxDBQuery():导出RuleGroup<T>moveItem(itemId, targetGroupId, targetIndex):拖拽排序
useSchemaFromEntity
从 RxDB EntityMetadata 自动解析字段列表:
<script setup lang="ts">
import { useSchemaFromEntity } from '@aiao/rxdb-model-vue';
import { getEntityMetadata } from '@aiao/rxdb';
const metadata = getEntityMetadata(Todo);
const { fields, hasFields } = useSchemaFromEntity(metadata, {
includeForeignKeys: false,
includeRelations: true
});
</script>
<template>
<QueryBuilder v-if="hasFields" :fields="fields" />
<p v-else>加载中...</p>
</template>
| 选项 | 类型 | 默认值 | 说明 |
|---|---|---|---|
enabled | boolean | true | 是否启用解析 |
includeForeignKeys | boolean | false | 包含外键字段 |
includeRelations | boolean | false | 包含关系字段 |
QueryBuilder 组件额外 Props
组件在 composable 参数之外,还支持:
class?: stringheight?: string,默认80vhenableDrag?: boolean,默认trueenableCollapse?: boolean,默认truetheme?: QueryBuilderTheme