跳到主要内容

Query Builder — React

@aiao/rxdb-query-builder-react 提供了基于 React Hook 的查询构建器,使用 PrimeReact 作为 UI 库。

安装

npm install @aiao/rxdb-query-builder @aiao/rxdb-query-builder-react primereact

基础用法

使用组件

import { QueryBuilder } from '@aiao/rxdb-query-builder-react';
import type { FieldMetadata } from '@aiao/rxdb-query-builder';

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-query-builder-react';

function SearchPage() {
const {
rootGroup,
validation,
fields,
hasRules,
addRule,
addGroup,
remove,
updateRule,
updateCombinator,
clear,
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={clear}>清空</button>
<pre>{JSON.stringify(toRxDBQuery(), null, 2)}</pre>
</div>
);
}

Hook API

useQueryBuilder

function useQueryBuilder<T extends object>(options?: UseQueryBuilderOptions<T>): UseQueryBuilderReturn<T>;

Options

属性类型默认值说明
schemaSchemaInfoSchema 信息
fieldsFieldMetadata[][]字段列表
initialQueryQueryBuilderRuleGroup<T>初始查询
maxDepthnumber5最大嵌套层级
onQueryChange(query) => void查询变更回调
onValidationChange(result) => void校验变更回调

返回值

属性类型说明
rootGroupQueryBuilderRuleGroup<T> | undefined根规则组
validationValidationResult | undefined校验结果
fieldsFieldMetadata[]字段列表
hasRulesboolean是否有规则
addRule(parentId, rule) => void添加规则
addGroup(parentId) => void添加分组
remove(id) => void删除规则/分组
updateRule(id, updates) => void更新规则
updateCombinator(groupId, combinator) => void切换 AND/OR
clear() => void清空所有规则
toRxDBQuery() => QueryBuilderRuleGroup<T>导出查询

useSchemaFromEntity

从 RxDB EntityMetadata 自动解析字段列表:

import { useSchemaFromEntity } from '@aiao/rxdb-query-builder-react';

function SearchPage({ entityMetadata }) {
const { fields, hasFields } = useSchemaFromEntity(entityMetadata, {
includeForeignKeys: false,
includeRelations: true
});

if (!hasFields) return <p>加载中...</p>;

return <QueryBuilder<User> fields={fields} />;
}
选项类型默认值说明
enabledbooleantrue是否启用解析
includeForeignKeysbooleanfalse包含外键字段
includeRelationsbooleanfalse包含关系字段

组件列表

组件Props说明
QueryBuilderQueryBuilderProps<T>主组件(= Hook Options + className
QueryGroupQueryGroupProps<T>规则组
QueryRuleQueryRuleProps<T>单条规则
FieldSelectorFieldSelectorProps字段选择(PrimeReact CascadeSelect)
OperatorSelectorOperatorSelectorProps操作符选择(PrimeReact Dropdown)
ValueInputValueInputProps值输入(根据类型动态切换)
SubqueryBuilderSubqueryBuilderProps子查询(exists/notExists)