• 中文
  • QueryFilter / LightFilter 筛选表单

    有些时候表单要与别的组件组合使用,常见的有 Table ,List 等,这时候就需要一些特殊形态的表单。QueryFilter 和 LightFilter 解决了配合组件使用的问题,避免了复杂的样式设置。ProTable 中默认 支持了 QueryFilter 和 LightFilter 作为自己的筛选表单。

    查询筛选

    基本使用
    import {
      ProFormDateTimePicker,
      ProFormText,
      QueryFilter,
    } from '@ant-design/pro-components';
    
    const Demo = () => {
      return (
        <QueryFilter>
          <ProFormDateTimePicker
            label="下单时间"
            colProps={{ xl: 12 }}
            name="orderTime"
            required
          />
          <ProFormText disabled colProps={{ xl: 12 }} name="pay" label="支付方式" />
        </QueryFilter>
      );
    };
    
    export default () => (
      <div style={{ padding: 24 }}>
        <Demo />
      </div>
    );
    
    {
      "defaultColsNumber": 6
    }
    基本使用
    import {
      ProForm,
      ProFormDatePicker,
      ProFormText,
      QueryFilter,
    } from '@ant-design/pro-components';
    import { Input } from 'antd';
    
    const Demo = () => {
      const formProps = {
        defaultColsNumber: 6,
      };
      return (
        <>
          <>
            <QueryFilter {...formProps}>
              <ProFormDatePicker
                // key={i}
                colSize={4}
                name="test"
                label="test"
              />
              {[...Array(10).keys()].map((i) => (
                <ProFormDatePicker
                  key={i}
                  name={`startdate${i + 1}`}
                  label={`Date${i + 1}`}
                />
              ))}
            </QueryFilter>
            <pre>{JSON.stringify(formProps, null, 2)}</pre>
          </>
          <QueryFilter<{
            name: string;
            company: string;
          }>
            onFinish={async () => {
    
            }}
            span={6}
            defaultCollapsed={false}
          >
            <ProForm.Item name="name" label="test">
              <Input />
            </ProForm.Item>
            <ProFormText
              name="name"
              label="应用名称"
              rules={[{ required: true }]}
            />
            <ProFormText name="sex" label="性别" />
          </QueryFilter>
          <QueryFilter<{
            name: string;
            company: string;
          }>
            onFinish={async () => {
    
            }}
            span={6}
            defaultCollapsed={false}
          >
            <ProFormText
              name="name"
              label="应用名称"
              rules={[{ required: true }]}
            />
            <ProFormText name="creater" label="创建人" />
            <ProFormText name="sex" label="性别" />
          </QueryFilter>
          <QueryFilter<{
            name: string;
            company: string;
          }>
            onFinish={async () => {
    
            }}
            defaultCollapsed={false}
          >
            <ProFormText
              name="name"
              label="应用名称"
              rules={[{ required: true }]}
            />
            <ProFormText name="creater" label="创建人" />
            <ProFormText name="sex" label="性别" />
            <ProFormText name="status" label="应用状态" />
            <ProFormText name="startdate" label="响应日期" />
            <ProFormText name="create" label="创建时间" />
          </QueryFilter>
          <QueryFilter<{
            name: string;
            company: string;
          }>
            onFinish={async () => {
    
            }}
            span={12}
            defaultCollapsed={false}
          >
            <ProFormText
              name="name"
              label="应用名称"
              rules={[{ required: true }]}
            />
            <ProFormText name="creater" label="创建人" />
            <ProFormText name="sex" label="性别" />
            <ProFormText name="status" label="应用状态" />
            <ProFormText name="startdate" label="响应日期" />
            <ProFormText name="create" label="创建时间" colSize={3} />
          </QueryFilter>
          <QueryFilter<{
            name: string;
            company: string;
          }>
            onFinish={async () => {
    
            }}
            span={8}
            defaultCollapsed={false}
          >
            <ProFormText
              name="name"
              label="应用名称"
              rules={[{ required: true }]}
            />
            <ProFormText name="creater" label="创建人" />
            <ProFormText name="sex" label="性别" />
            <ProFormText name="status" label="应用状态" />
            <ProFormText name="startdate" label="响应日期" />
            <ProFormText name="create" label="创建时间" colSize={3} />
          </QueryFilter>
          <QueryFilter<{
            name: string;
            company: string;
          }>
            onFinish={async () => {
    
            }}
            span={4}
            submitterColSpanProps={{ span: 12 }}
            defaultColsNumber={1}
            defaultCollapsed={false}
          >
            <ProFormText
              name="name"
              label="应用名称"
              rules={[{ required: true }]}
            />
            <ProFormText name="creater" label="创建人" />
            <ProFormText name="sex" label="性别" />
            <ProFormText name="status" label="应用状态" />
            <ProFormText name="startdate" label="响应日期" />
            <ProFormText name="create" label="创建时间" colSize={3} />
          </QueryFilter>
        </>
      );
    };
    
    export default () => (
      <div style={{ padding: 24 }}>
        <Demo />
      </div>
    );
    
    查询筛选-默认收起
    import {
      ProFormDatePicker,
      ProFormText,
      QueryFilter,
    } from '@ant-design/pro-components';
    
    const Demo = () => {
      return (
        <QueryFilter defaultCollapsed split>
          <ProFormText name="name" label="应用名称" />
          <ProFormDatePicker name="createDate" label="创建时间" />
          <ProFormText name="status" label="应用状态" />
          <ProFormDatePicker name="replyDate" label="响应日期" />
          <ProFormDatePicker name="startDate" label="创建时间" />
          <ProFormDatePicker name="endDate" label="结束时间" />
        </QueryFilter>
      );
    };
    
    export default () => (
      <div style={{ padding: 24 }}>
        <Demo />
      </div>
    );
    
    查询筛选-垂直布局
    import {
      ProFormCheckbox,
      ProFormDatePicker,
      ProFormRadio,
      ProFormText,
      QueryFilter,
    } from '@ant-design/pro-components';
    
    const Demo = () => {
      return (
        <QueryFilter layout="vertical">
          <ProFormText name="name" label="这是一个超级超级长的名称" />
          <ProFormDatePicker name="birth" label="创建时间" />
          <ProFormText name="sex" label="应用状态" />
          <ProFormRadio.Group
            name="freq"
            label="查询频度"
            options={[
              {
                value: 'weekly',
                label: '每周',
              },
              {
                value: 'quarterly',
                label: '每季度',
              },
              {
                value: 'monthly',
                label: '每月',
              },
              {
                value: 'yearly',
                label: '每年',
              },
            ]}
          />
          <ProFormCheckbox.Group
            name="checkbox"
            label="行业分布"
            options={['农业', '制造业', '互联网']}
          />
        </QueryFilter>
      );
    };
    
    export default () => (
      <div style={{ padding: 24 }}>
        <Demo />
      </div>
    );
    
    姓名
    详情
    查询筛选-搜索
    import { DownOutlined, UpOutlined } from '@ant-design/icons';
    import {
      ProForm,
      ProFormDatePicker,
      ProFormText,
      QueryFilter,
    } from '@ant-design/pro-components';
    import { Input, Tabs } from 'antd';
    import React, { useState } from 'react';
    
    type AdvancedSearchProps = {
      onFilterChange?: (allValues: any) => void;
      onSearch?: (text: string) => void;
      onTypeChange?: (type: string) => void;
      defaultType?: string;
    };
    
    const AdvancedSearch: React.FC<AdvancedSearchProps> = (props) => {
      const {
        onSearch,
        onTypeChange,
        defaultType = 'articles',
        onFilterChange,
      } = props;
      const [searchText, setSearchText] = useState<string>();
      const [showFilter, setShowFilter] = useState<boolean>(true);
      const quickSearch = ['小程序开发', '入驻', 'ISV 权限'];
      return (
        <div
          style={{
            padding: 24,
          }}
        >
          <div
            style={{
              display: 'flex',
              flexDirection: 'column',
              gap: 8,
            }}
          >
            <Input.Search
              placeholder="请输入"
              enterButton="搜索"
              value={searchText}
              onChange={(e) => {
                setSearchText(e.target.value);
              }}
              onSearch={onSearch}
              style={{ maxWidth: 522, width: '100%' }}
            />
            <div
              style={{
                display: 'flex',
                gap: 12,
              }}
            >
              {quickSearch.map((text) => (
                <a
                  key={text}
                  onClick={() => {
                    setSearchText(text);
                    if (onSearch) {
                      onSearch(text);
                    }
                  }}
                >
                  {text}
                </a>
              ))}
            </div>
          </div>
    
          <Tabs
            defaultActiveKey={defaultType}
            onChange={onTypeChange}
            tabBarExtraContent={
              <a
                style={{
                  display: 'flex',
                  gap: 4,
                }}
                onClick={() => {
                  setShowFilter(!showFilter);
                }}
              >
                高级筛选 {showFilter ? <UpOutlined /> : <DownOutlined />}
              </a>
            }
            items={[
              {
                key: 'articles',
                label: '文章',
              },
              {
                key: 'projects',
                label: '项目',
              },
              {
                key: 'applications',
                label: '应用',
              },
            ]}
          />
    
          {showFilter ? (
            <QueryFilter
              submitter={false}
              span={24}
              labelWidth="auto"
              split
              onChange={onFilterChange}
            >
              <ProForm.Group title="姓名">
                <ProFormText name="name" />
              </ProForm.Group>
              <ProForm.Group title="详情">
                <ProFormText name="age" label="年龄" />
                <ProFormDatePicker name="birth" label="生日" />
              </ProForm.Group>
            </QueryFilter>
          ) : null}
        </div>
      );
    };
    
    export default AdvancedSearch;
    
    查询筛选-自定义渲染的控件数量
    import {
      ProFormDatePicker,
      ProFormText,
      QueryFilter,
    } from '@ant-design/pro-components';
    
    const Demo = () => {
      return (
        <QueryFilter defaultCollapsed split defaultFormItemsNumber={5}>
          <ProFormText name="name" label="应用名称" />
          <ProFormDatePicker name="createDate" label="创建时间" />
          <ProFormText name="status" label="应用状态" />
          <ProFormDatePicker name="replyDate" label="响应日期" />
          <ProFormDatePicker name="startDate" label="创建时间" />
          <ProFormDatePicker name="endDate" label="结束时间" />
        </QueryFilter>
      );
    };
    
    export default () => (
      <div style={{ padding: 24 }}>
        <Demo />
      </div>
    );
    
    查询筛选-折叠下一行控件数量
    import {
      ProFormDatePicker,
      ProFormText,
      QueryFilter,
    } from '@ant-design/pro-components';
    
    const Demo = () => {
      return (
        <QueryFilter defaultCollapsed split defaultColsNumber={6}>
          <ProFormText name="name" label="应用名称" />
          <ProFormDatePicker name="createDate" label="创建时间" />
          <ProFormText name="status" label="应用状态" />
          <ProFormDatePicker name="replyDate" label="响应日期" />
          <ProFormDatePicker name="startDate" label="创建时间" />
          <ProFormDatePicker name="endDate" label="结束时间" />
        </QueryFilter>
      );
    };
    
    export default () => (
      <div style={{ padding: 24 }}>
        <Demo />
      </div>
    );
    

    轻量筛选

    尺寸:
    边框样式:
    性别: 男,女
    地区: 北京,上海
    标签
    树形选择:
    技术研发部 ,
    产品设计部
    区域:
    浙江 / 杭州 / 西湖
    开关:
    数量: 100
    范围: 20,80
    滑块: 50
    关键词: 关键词示例
    日期:
    日期范围:
    日期时间:
    日期时间范围:
    时间:
    时间范围:
    姓名: 张,三
    更多筛选
    基本使用
    import { LightFilter } from '@ant-design/pro-components';
    import { Radio, Space, TreeSelect } from 'antd';
    import dayjs from 'dayjs';
    import React from 'react';
    import type { SizeType } from '../../../src/utils/antdTypes';
    
    /** 树形选择数据 */
    const treeData = [
      {
        title: '技术研发部',
        value: '0-0',
        key: '0-0',
        children: [
          {
            title: '前端开发组',
            value: '0-0-0',
            key: '0-0-0',
          },
        ],
      },
      {
        title: '产品设计部',
        value: '0-1',
        key: '0-1',
        children: [
          {
            title: '产品策划组',
            value: '0-1-0',
            key: '0-1-0',
          },
          {
            title: 'UX 设计组',
            value: '0-1-1',
            key: '0-1-1',
          },
          {
            title: '用户研究组',
            value: '0-1-2',
            key: '0-1-2',
          },
        ],
      },
    ];
    
    /** 级联区域数据 */
    const regionOptions = [
      {
        value: 'zhejiang',
        label: '浙江',
        children: [
          {
            value: 'hangzhou',
            label: '杭州',
            children: [
              { value: 'xihu', label: '西湖' },
              { value: 'binjiang', label: '滨江' },
            ],
          },
          {
            value: 'ningbo',
            label: '宁波',
            children: [
              { value: 'jiangbei', label: '江北' },
              { value: 'haishu', label: '海曙' },
            ],
          },
        ],
      },
      {
        value: 'jiangsu',
        label: '江苏',
        children: [
          {
            value: 'nanjing',
            label: '南京',
            children: [
              { value: 'zhonghuamen', label: '中华门' },
              { value: 'xuanwu', label: '玄武' },
            ],
          },
          {
            value: 'suzhou',
            label: '苏州',
            children: [
              { value: 'gusu', label: '姑苏' },
              { value: 'wuzhong', label: '吴中' },
            ],
          },
        ],
      },
    ];
    
    type LightFilterVariant = 'outlined' | 'filled' | 'borderless';
    
    interface FilterFormValues {
      sex?: { value: string; label: string }[];
      area?: string[];
      region?: string[];
      treeSelect?: string[];
      open?: boolean;
      status?: boolean;
      count?: number;
      range?: [number, number];
      slider?: number;
      name?: string;
      address?: string;
      keyword?: string;
      date?: string;
      dateRange?: [string, string];
      datetime?: string;
      datetimeRange?: [number, number];
      time?: string;
      timeRange?: [number, number];
      nameSet?: [string, string];
    }
    
    const defaultDate = dayjs('2024-01-15');
    const defaultDateTime = dayjs('2024-01-15 14:30:00');
    
    const Demo = () => {
      const [size, setSize] = React.useState<SizeType>('middle');
      const [variant, setVariant] =
        React.useState<LightFilterVariant>('borderless');
    
      const initialValues: Partial<FilterFormValues> = {
        keyword: '关键词示例',
        sex: [
          { value: 'man', label: '男' },
          { value: 'woman', label: '女' },
        ],
        area: ['beijing', 'shanghai'],
        region: ['zhejiang', 'hangzhou', 'xihu'],
        treeSelect: ['0-0', '0-1'],
        open: true,
        status: false,
        count: 100,
        range: [20, 80],
        slider: 50,
        address: '北京市朝阳区',
        date: defaultDate.format('YYYY-MM-DD'),
        dateRange: [
          defaultDate.format('YYYY-MM-DD'),
          defaultDate.add(7, 'd').format('YYYY-MM-DD'),
        ],
        datetime: defaultDateTime.format('YYYY-MM-DD HH:mm:ss'),
        datetimeRange: [
          defaultDateTime.add(-1, 'd').valueOf(),
          defaultDateTime.valueOf(),
        ],
        time: defaultDateTime.format('HH:mm:ss'),
        timeRange: [
          defaultDateTime.add(-1, 'h').valueOf(),
          defaultDateTime.valueOf(),
        ],
        nameSet: ['张', '三'],
      };
    
      return (
        <div>
          <Space wrap size="middle" style={{ marginBottom: 16 }}>
            <Space>
              <span>尺寸:</span>
              <Radio.Group
                value={size}
                onChange={(e) => setSize(e.target.value)}
                optionType="button"
                buttonStyle="solid"
              >
                <Radio.Button value="middle">Middle</Radio.Button>
                <Radio.Button value="small">Small</Radio.Button>
              </Radio.Group>
            </Space>
            <Space>
              <span>边框样式:</span>
              <Radio.Group
                value={variant}
                onChange={(e) => setVariant(e.target.value)}
                optionType="button"
                buttonStyle="solid"
              >
                <Radio.Button value="borderless">无边框 (borderless)</Radio.Button>
                <Radio.Button value="outlined">线框 (outlined)</Radio.Button>
                <Radio.Button value="filled">填充 (filled)</Radio.Button>
                <Radio.Button value="underlined">下划线 (underlined)</Radio.Button>
              </Radio.Group>
            </Space>
          </Space>
    
          <LightFilter<FilterFormValues>
            initialValues={initialValues}
            size={size}
            variant={variant}
            onFinish={async (values) => {
              console.log('筛选提交:', values);
            }}
          >
            <LightFilter.select
              name="sex"
              label="性别"
              showSearch
              allowClear={false}
              fieldProps={{ labelInValue: true }}
              valueEnum={{
                man: '男',
                woman: '女',
              }}
            />
            <LightFilter.select
              name="area"
              label="地区"
              mode="multiple"
              valueEnum={{
                beijing: '北京',
                shanghai: '上海',
                hangzhou: '杭州',
                guangzhou: '广州',
                shenzhen: '深圳',
                long: '这是一个很长的用来测试溢出的项目',
              }}
            />
            <LightFilter.checkboxGroup
              name="checkboxGroup"
              label="标签"
              options={['A', 'B', 'C', 'D', 'E', 'F']}
            />
            <LightFilter.treeSelect
              label="树形选择"
              name="treeSelect"
              fieldProps={{
                fieldNames: { label: 'title' },
                treeData,
                treeCheckable: true,
                showCheckedStrategy: TreeSelect.SHOW_PARENT,
                placeholder: '请选择',
              }}
            />
            <LightFilter.cascader
              name="region"
              label="区域"
              width="md"
              fieldProps={{
                options: regionOptions,
                placeholder: '请选择省/市/区',
              }}
            />
            <LightFilter.switch name="open" label="开关" />
            <LightFilter.switch name="status" label="状态" secondary />
            <LightFilter.digit name="count" label="数量" min={0} max={9999} />
            <LightFilter.slider name="range" label="范围" range />
            <LightFilter.slider name="slider" label="滑块" />
            <LightFilter.input
              name="keyword"
              label="关键词"
              placeholder="请输入关键词"
            />
            <LightFilter.input
              name="address"
              label="地址"
              secondary
              placeholder="请输入地址"
            />
            <LightFilter.date name="date" label="日期" allowClear={false} />
            <LightFilter.dateRange name="dateRange" label="日期范围" />
            <LightFilter.dateTime name="datetime" label="日期时间" />
            <LightFilter.dateTimeRange name="datetimeRange" label="日期时间范围" />
            <LightFilter.time name="time" label="时间" />
            <LightFilter.timePickerRange name="timeRange" label="时间范围" />
            <LightFilter.fieldSet name="nameSet" label="姓名">
              <LightFilter.input placeholder="姓" />
              <LightFilter.input placeholder="名" />
            </LightFilter.fieldSet>
          </LightFilter>
        </div>
      );
    };
    
    export default () => (
      <div style={{ padding: 24 }}>
        <Demo />
      </div>
    );
    


    footer为false
    自定义footer
    轻量筛选-自定义footer
    import { LightFilter, ProFormText } from '@ant-design/pro-components';
    import { Button, Radio, Space } from 'antd';
    import React from 'react';
    import type { SizeType } from '../../../src/utils/antdTypes';
    
    const Demo = () => {
      const [size, setSize] = React.useState<SizeType>('middle');
      return (
        <div>
          <Radio.Group
            value={size}
            onChange={(e) => {
              setSize(e.target.value);
            }}
          >
            <Radio.Button value="middle">Middle</Radio.Button>
            <Radio.Button value="small">Small</Radio.Button>
          </Radio.Group>
    
          <br />
          <br />
    
          <Space orientation="vertical">
            <LightFilter
              size={size}
              initialValues={{
                name: 'Jack2',
              }}
            >
              <ProFormText
                name="name"
                label="名称"
                footerRender={(_, onClear) => (
                  <Button
                    onClick={() => {
                      onClear?.();
                    }}
                  >
                    自定义footer
                  </Button>
                )}
              />
            </LightFilter>
    
            <LightFilter
              size={size}
              initialValues={{
                name: 'Jack2',
              }}
            >
              <ProFormText name="name" label="名称" footerRender={false} />
            </LightFilter>
    
            <LightFilter
              size={size}
              initialValues={{
                name: 'Jack2',
              }}
              collapse
              collapseLabel="footer为false"
              footerRender={false}
            >
              <ProFormText name="name" label="名称" />
            </LightFilter>
    
            <LightFilter
              size={size}
              initialValues={{
                name: 'Jack2',
              }}
              collapse
              collapseLabel="自定义footer"
              footerRender={(_, onClear) => (
                <Button
                  onClick={() => {
                    onClear?.();
                  }}
                >
                  自定义footer
                </Button>
              )}
            >
              <ProFormText name="name" label="名称" />
            </LightFilter>
          </Space>
        </div>
      );
    };
    
    export default () => (
      <div style={{ padding: 24 }}>
        <Demo />
      </div>
    );
    
    Please select
    请选择
    轻量筛选-边框模式
    import { FilterOutlined } from '@ant-design/icons';
    import {
      LightFilter,
      ProFormCascader,
      ProFormCheckbox,
      ProFormDatePicker,
      ProFormRadio,
      ProFormSelect,
      ProFormTreeSelect,
    } from '@ant-design/pro-components';
    import { TreeSelect, message } from 'antd';
    
    const treeData = [
      {
        title: '技术研发部',
        value: '0-0',
        key: '0-0',
        children: [
          {
            title: '前端开发组',
            value: '0-0-0',
            key: '0-0-0',
          },
        ],
      },
      {
        title: '产品设计部',
        value: '0-1',
        key: '0-1',
        children: [
          {
            title: '产品策划组',
            value: '0-1-0',
            key: '0-1-0',
          },
          {
            title: 'UX 设计组',
            value: '0-1-1',
            key: '0-1-1',
          },
          {
            title: '用户研究组',
            value: '0-1-2',
            key: '0-1-2',
          },
        ],
      },
    ];
    
    const Demo = () => {
      return (
        <LightFilter
          initialValues={{
            sex: 'man',
          }}
          variant="outlined"
          collapseLabel={<FilterOutlined />}
          onFinish={async () => {
            message.success('提交成功');
          }}
        >
          <ProFormSelect
            name="sex"
            showSearch
            valueEnum={{
              man: '男',
              woman: '女',
            }}
            placeholder="性别"
          />
          <ProFormRadio.Group
            name="radio"
            radioType="button"
            options={[
              {
                value: 'weekly',
                label: '每周',
              },
              {
                value: 'quarterly',
                label: '每季度',
              },
              {
                value: 'monthly',
                label: '每月',
              },
              {
                value: 'yearly',
                label: '每年',
              },
            ]}
          />
          <ProFormDatePicker name="time" placeholder="日期" />
          <ProFormTreeSelect
            request={async () => treeData}
            fieldProps={{
              fieldNames: {
                label: 'title',
              },
              treeCheckable: true,
              showCheckedStrategy: TreeSelect.SHOW_PARENT,
              placeholder: 'Please select',
            }}
            name="treeSelect"
          />
          <ProFormCheckbox.Group
            name="checkbox"
            label="迁移类型"
            width="lg"
            options={['结构迁移', '全量迁移', '增量迁移', '全量校验']}
          />
          <ProFormCascader
            request={async () => [
              {
                value: 'zhejiang',
                label: '浙江',
                children: [
                  {
                    value: 'hangzhou',
                    label: '杭州',
                    children: [
                      {
                        value: 'xihu',
                        label: '西湖',
                      },
                    ],
                  },
                ],
              },
              {
                value: 'jiangsu',
                label: 'Jiangsu',
                children: [
                  {
                    value: 'nanjing',
                    label: 'Nanjing',
                    children: [
                      {
                        value: 'zhonghuamen',
                        label: 'Zhong Hua Men',
                      },
                    ],
                  },
                ],
              },
            ]}
            name="area"
          />
        </LightFilter>
      );
    };
    
    export default () => (
      <div style={{ padding: 24 }}>
        <Demo />
      </div>
    );
    

    折叠模式下所有的选项都会默认折叠,不管是否有值,控件的 secondary 将不再有效。

    轻量筛选-折叠模式
    import { LightFilter } from '@ant-design/pro-components';
    import { message } from 'antd';
    
    const Demo = () => {
      return (
        <LightFilter
          initialValues={{
            sex: 'man',
          }}
          collapse
          onFinish={async () => {
            message.success('提交成功');
          }}
        >
          <LightFilter.select
            name="sex"
            label="性别"
            showSearch
            valueEnum={{
              man: '男',
              woman: '女',
            }}
          />
          <LightFilter.dateTime name="time" label="时间" />
        </LightFilter>
      );
    };
    
    export default () => (
      <div style={{ padding: 24 }}>
        <Demo />
      </div>
    );
    

    手动设置轻量筛选的弹出框,默认为 bottomLeft

    更多筛选
    轻量筛选-弹出框对齐方式
    import {
      LightFilter,
      ProFormDatePicker,
      ProFormDateRangePicker,
      ProFormDateTimePicker,
      ProFormDateTimeRangePicker,
      ProFormDigit,
      ProFormFieldSet,
      ProFormSelect,
      ProFormSlider,
      ProFormSwitch,
      ProFormText,
      ProFormTimePicker,
    } from '@ant-design/pro-components';
    import { Radio } from 'antd';
    import React from 'react';
    
    const Demo = () => {
      const [mode, setMode] = React.useState<any>('topLeft');
      return (
        <div>
          <Radio.Group
            value={mode}
            onChange={(e) => {
              setMode(e.target.value);
            }}
          >
            <Radio.Button value="topLeft">topLeft</Radio.Button>
            <Radio.Button value="topRight">topRight</Radio.Button>
            <Radio.Button value="bottomLeft">bottomLeft</Radio.Button>
            <Radio.Button value="bottomRight">bottomRight</Radio.Button>
          </Radio.Group>
          <LightFilter
            placement={mode}
            style={{
              marginBlockStart: '40px',
            }}
          >
            <ProFormSelect
              name="sex"
              label="性别"
              showSearch
              allowClear={false}
              fieldProps={{
                labelInValue: true,
              }}
              valueEnum={{
                man: '男',
                woman: '女',
              }}
            />
            <ProFormSelect
              name="area"
              label="地区"
              mode="multiple"
              valueEnum={{
                beijing: '北京',
                shanghai: '上海',
                hangzhou: '杭州',
                long: '这是一个很长的用来测试溢出的项目',
              }}
            />
            <ProFormDigit name="count" label="数量" />
            <ProFormSlider name="range" label="范围" range />
            <ProFormSlider name="slider" label="范围" />
            <ProFormText name="name1" label="名称" />
            <ProFormSwitch name="open" label="开关" secondary />
            <ProFormText name="name2" label="地址" secondary />
            <ProFormDatePicker
              name="name3"
              label="不能清空的日期"
              allowClear={false}
            />
            <ProFormDateRangePicker name="date" label="日期范围" />
            <ProFormDateTimePicker name="datetime" label="日期时间" />
            <ProFormDateTimeRangePicker
              name="datetimeRanger"
              label="日期时间范围"
            />
            <ProFormTimePicker name="time" label="时间" />
            <ProFormTimePicker.RangePicker name="timeRanger" label="时间范围" />
            <ProFormFieldSet name="name" label="姓名">
              <ProFormText />
              <ProFormText />
            </ProFormFieldSet>
          </LightFilter>
        </div>
      );
    };
    
    export default () => (
      <div style={{ padding: 24 }}>
        <Demo />
      </div>
    );
    

    API

    QueryFilter

    QueryFilter 除了继承 ProForm 的 API 以外还支持下面的属性。

    参数说明类型默认值
    collapsed是否折叠超出的表单项,用于受控模式boolean-
    defaultCollapsed默认状态下是否折叠超出的表单项booleantrue
    onCollapse切换表单折叠状态时的回调(collapsed)=>void-
    collapseRender收起按钮的 render,设为 false 可隐藏((collapsed, props, intl, hiddenNum?) => ReactNode) | false-
    layout布局模式,vertical 时上下布局'horizontal' | 'vertical' | 'inline'-
    submitterColSpanProps提交按钮所在 col 的 props(需要包含 span)Omit<ColProps, 'span'> & { span: number }-
    defaultColsNumber自定义折叠状态下默认显示的表单控件数量,最多只展示一行控件,超出时展示收起/隐藏按钮number-
    defaultFormItemsNumber与 defaultColsNumber 的不同点在于,设置多少就展示多少个控件,超出时展示收起/隐藏按钮number-
    labelWidthlabel 宽度number | 'auto'80
    span表单项宽度。对象形式可只传部分断点,未写档位按 antd 规则向前填充(如 { md: 8, xl: 6 })number | Partial<{ xs: number; sm: number; md: number; lg: number; xl: number; xxl: number }>-
    split每一行是否有分割线(仅在 layout=vertical 时生效)boolean-
    searchText查询按钮的文本string-
    resetText重置按钮的文本string-
    searchGutter查询表单栅格间隔RowProps['gutter']-
    optionRender底部操作栏的 render,设为 false 可隐藏((searchConfig, props, dom) => ReactNode[]) | false-
    ignoreRules忽略 Form.Item 的 rules 校验配置boolean-
    showHiddenNum收起时是否显示隐藏个数booleanfalse
    preserve是否能够查询收起的数据,如果设置为 false,收起后的表单数据将会丢失booleantrue
    containerStyle容器样式React.CSSProperties-

    响应式断点规则

    注意,断点的值均为表单容器的大小而非视口大小。断点配置继承自 antd 设计 token,与 Grid 栅格 的响应式断点保持一致。

    默认布局时的规则

    断点继承自 antd 设计 token(默认 xs=576、sm=768、md=992、lg=1200、xl=1600):

    容器宽度断点单行展示表单列数(包含操作区域)默认布局
    ≧ 1600px4 列horizontal
    ≧ 768px && < 1600px3 列horizontal
    ≧ 576px && < 768px2 列vertical
    < 576px1 列vertical
    强制上下布局时的规则
    容器宽度断点单行展示表单列数(包含操作区域)
    ≧ 1600px4 列
    ≧ 992px && < 1600px3 列
    ≧ 576px && < 992px2 列
    < 576px1 列

    LightFilter

    LightFilter 除了继承 ProForm 的 API 以外还支持下面的属性。

    参数说明类型默认值
    collapse是否默认折叠全部字段booleanfalse
    collapseLabel折叠区域的标签ReactNode更多筛选 <DownOutlined/>
    variant样式变体'outlined' | 'filled' | 'borderless''borderless'
    ignoreRules是否忽略表单项的 rules(LightFilter 场景一般不建议使用 rules)boolean-
    footerRender底部内容,当不需要默认底部按钮时,可以设为 false((onConfirm?: (e?: React.MouseEvent) => void, onClear?: (e?: React.MouseEvent) => void) => JSX.Element | false) | false-
    popoverProps透传给内部 Popover 的属性(折叠态弹层),可用 classNames 等Omit<PopoverProps, 'children' | 'content' | 'trigger' | 'open' | 'onOpenChange' | 'placement'>-
    placement选择框弹出的位置,透传给 Popover,未设置时使用 Popover 默认值TooltipPlacement-