查询构建器 React
@aiao/rxdb-model-react 提供 React 版本的查询构建器组件与 Hook,底层模型与类型来自 @aiao/rxdb-model。
安装
- npm
- Yarn
- pnpm
- Bun
npm install @aiao/rxdb-model @aiao/rxdb-model-react
yarn add @aiao/rxdb-model @aiao/rxdb-model-react
pnpm add @aiao/rxdb-model @aiao/rxdb-model-react
bun add @aiao/rxdb-model @aiao/rxdb-model-react
基础用法
使用组件
import { QueryBuilder } from '@aiao/rxdb-model-react';
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 SearchPage() {
return (
<QueryBuilder<User>
fields={fields}
maxDepth={3}
onQueryChange={query => console.log('查询:', query)}
onValidationChange={result => console.log('校验:', result)}
/>
);
}
使用 Hook
import { useQueryBuilder } from '@aiao/rxdb-model-react';
function SearchPage() {
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)
});
const handleAddRule = () => {
addRule(rootGroup?.id, {
field: 'name',
operator: '=',
value: ''
});
};
return (
<div>
<button onClick={handleAddRule}>添加条件</button>
<button onClick={() => loadQuery(null)}>重置</button>
<button onClick={clear}>清空</button>
<pre>{JSON.stringify(toRxDBQuery(), null, 2)}</pre>
</div>
);
}
Hook 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: QueryBuilderRuleGroup<T> | undefined:根规则组validation: ValidationResult | undefined:校验结果fields: FieldMetadata[]:字段列表hasRules: boolean:当前是否已有规则addRule(parentId, rule):添加规则addGroup(parentId):添加分组remove(id):删除规则或分组updateRule(id, updates):更新规则updateCombinator(groupId, combinator):切换 AND/ORclear():清空所有规则toRxDBQuery():导出RuleGroup<T>loadQuery(query | null):重新加载查询moveItem(itemId, targetGroupId, targetIndex):拖拽排序
useSchemaFromEntity
从 RxDB EntityMetadata 自动解析字段列表:
import { useSchemaFromEntity } from '@aiao/rxdb-model-react';
function SearchPage({ entityMetadata }) {
const { fields, hasFields } = useSchemaFromEntity(entityMetadata, {
includeForeignKeys: false,
includeRelations: true
});
if (!hasFields) return <p>加载中...</p>;
return <QueryBuilder<User> fields={fields} />;
}
| 选项 | 类型 | 默认值 | 说明 |
|---|---|---|---|
enabled | boolean | true | 是否启用解析 |
includeForeignKeys | boolean | false | 包含外键字段 |
includeRelations | boolean | false | 包含关系字段 |
QueryBuilder 组件额外 Props
除 useQueryBuilder 的参数外,组件还支持:
className?: stringheight?: string,默认80vhenableDrag?: boolean,默认trueenableCollapse?: boolean,默认truetheme?: QueryBuilderTheme