You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为react-querybuilder添加自定义Add Rule按钮及专属字段运算符

实现React Query Builder新增自定义规则按钮

步骤1:扩展组件Props并添加新按钮

首先修改AddGroupAction组件的Props接口,新增自定义规则的点击回调,然后在原有按钮旁添加新的按钮:

import { HBButton, HBIcon } from '@hasty-bazar/core'
import { FC } from 'react'
import { useIntl } from 'react-intl'
import queryBuilderMessages from '../HBQueryBuilder.messages'

interface AddRuleActionProps {
  handleOnClick: (event: React.MouseEvent<HTMLButtonElement, MouseEvent>) => void
  // 新增自定义规则点击事件回调
  handleOnCustomRuleClick?: (event: React.MouseEvent<HTMLButtonElement, MouseEvent>) => void
}

const AddGroupAction: FC<AddRuleActionProps> = ({ handleOnClick, handleOnCustomRuleClick }) => {
  const { formatMessage } = useIntl()
  return (
    <>
      <HBButton
        onClick={handleOnClick}
        size="small"
        leftIcon={<HBIcon type="plus" />}
        sx={{ marginRight: 2, minWidth: 50 }}
      >
        {formatMessage(queryBuilderMessages.rule)}
      </HBButton>
      {/* 新增自定义规则按钮,用样式区分普通规则 */}
      {handleOnCustomRuleClick && (
        <HBButton
          onClick={handleOnCustomRuleClick}
          size="small"
          leftIcon={<HBIcon type="plus" />}
          sx={{ marginRight: 2, minWidth: 50 }}
          variant="outlined"
        >
          {formatMessage(queryBuilderMessages.customRule) || '添加自定义规则'}
        </HBButton>
      )}
    </>
  )
}

export default AddGroupAction

步骤2:父组件配置自定义规则逻辑

在使用QueryBuilder的父组件中,定义自定义字段/运算符集合,实现添加自定义规则的逻辑,并替换组件的控制元素:

import { QueryBuilder, Rule, useQueryBuilder } from 'react-querybuilder';

// 默认字段与运算符
const defaultFields = [
  { name: 'name', label: '商品名称' },
  { name: 'price', label: '商品价格' },
];
const defaultOperators = [
  { name: '=', label: '等于' },
  { name: '>', label: '大于' },
];

// 自定义字段与运算符集合
const customFields = [
  { name: 'customTag', label: '自定义标签' },
  { name: 'customDesc', label: '自定义描述' },
];
const customOperators = [
  { name: 'contains', label: '包含' },
  { name: 'startsWith', label: '开头为' },
];

const MyQueryBuilder = () => {
  const { queryBuilderRef } = useQueryBuilder();

  // 点击自定义按钮时添加带标识的规则
  const handleCustomRuleClick = () => {
    queryBuilderRef.current?.addRule({
      type: 'custom', // 标记为自定义规则,用于后续区分渲染
      field: customFields[0].name,
      operator: customOperators[0].name,
      value: '',
    });
  };

  return (
    <QueryBuilder
      fields={defaultFields}
      operators={defaultOperators}
      controlElements={{
        // 替换添加规则的组件,传入自定义点击回调
        addRuleAction: (props) => (
          <AddGroupAction
            handleOnClick={props.handleOnClick}
            handleOnCustomRuleClick={handleCustomRuleClick}
          />
        ),
        // 根据规则类型渲染对应的字段/运算符
        rule: (props) => {
          if (props.rule.type === 'custom') {
            return (
              <Rule
                {...props}
                fields={customFields}
                operators={customOperators}
              />
            );
          }
          return <Rule {...props} />;
        },
      }}
    />
  );
};

export default MyQueryBuilder;

步骤3:补充国际化文案(可选)

如果使用国际化,在queryBuilderMessages中添加对应文案:

// HBQueryBuilder.messages.json
{
  "rule": "添加规则",
  "customRule": "添加自定义规则"
}

这样就完成了需求:原有按钮保持默认逻辑,新按钮点击后会添加使用自定义字段和运算符集合的规则。

内容的提问来源于stack exchange,提问作者theGhostN

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 19:27:16