公共筛选组件(二次封装antd)支持代码提示

news2024/11/18 15:50:37

如果项目是基于antd组件库为基础搭建,可使用此公共筛选组件
界面样式

使用到的库

npm i antd
npm i lodash-es
npm i @types/lodash-es -D

/components/CommonSearch

index.tsx

import React from 'react';
import { Button, Card, Form } from 'antd';
import styles from './index.module.scss';
import { renderItem, IItem } from './const';
import { debounce, pickBy } from 'lodash-es';

interface IProps {
  items: IItem[];
  /** 标签位置 默认: inset */
  labelAlign?: 'left' | 'inset';
  /** 查询回调 */
  onSearch: <T>(values: T) => void;
  /** 重置回调 */
  onReset: () => void;
}

export default function Index(props: IProps) {
  const { items = [], labelAlign = 'inset', onSearch, onReset } = props;
  const [form] = Form.useForm();

  const clasNameHandle = (row: IItem) => {
    const labelInset = styles[`custom-form-item-${row?.type?.toLowerCase() || 'label'}`];
    let className = `${styles['form-item-input']} ${row?.props?.className || ''} `;
    if (labelAlign === 'inset') {
      className += labelInset;
    }
    className = className.trim();

    return className;
  };

  const trimWhitespace = (value) => {
    if (typeof value === 'string') {
      return value.trim();
    }
    return value;
  };

  const searchHandle = debounce(() => {
    const values = form.getFieldsValue();
    const format = pickBy(values, (v) => v !== undefined && v !== null && v !== '');
    const delTrim = Object.keys(format).reduce((pre: any, cur: any) => {
      pre[cur] = trimWhitespace(format[cur]);
      return pre;
    }, {});

    console.log(delTrim, 'values');
    onSearch && onSearch(delTrim);
  }, 100);

  const resetSearch = debounce(() => {
    form.resetFields();
    onReset && onReset();
  }, 100);

  if (!items?.length) {
    return null;
  }

  return (
    <Card className={styles['search-card-box']}>
      <Form layout="inline" form={form}>
        {items?.map((item: IItem) => {
          const className = clasNameHandle(item);
          const itemProps = {
            options: item.options,
            onPressEnter: () => {
              searchHandle();
            },
            ...(item.props ?? {}),
            className,
          };

          return (
            <div
              key={item.name}
              className={`${styles['search-item-wrap']} ${
                labelAlign === 'inset' ? styles['search-item-wrap-inset'] : ''
              }`}
            >
              <Form.Item label={item.label} name={item.name}>
                {renderItem(item.type, itemProps)}
              </Form.Item>
            </div>
          );
        })}
      </Form>
      <div className={styles['search-btn']}>
        <Button type="primary" onClick={searchHandle}>
          查询
        </Button>
        <Button type="default" onClick={resetSearch}>
          重置
        </Button>
      </div>
    </Card>
  );
}

index.module.scss

.search-card-box {
  :global {
    .ant-card,
    .ant-card-body {
      padding: 16px 0 16px 16px;
    }
  }

  .search-item-wrap {
    width: 25%;
    min-width: 240px;
    margin-bottom: 12px;

    .form-item-input {
      width: 100%;
    }

    .custom-form-item-timepicker,
    .custom-form-item-input,
    .custom-form-item-select,
    .custom-form-item-inputnumber,
    .custom-form-item-datepicker,
    .custom-form-item-label {
      width: 100%;
      border-color: transparent;
      box-shadow: none;

      &:focus {
        box-shadow: none;
      }
    }
  }

  .search-item-wrap-inset {
    :global {
      .ant-row {
        padding-left: 12px;
        border: 1px solid #d9d9d9;
        border-radius: 6px;
      }

      .ant-row:focus-within {
        border-color: var(--primary-color);
      }
    }
  }

  .search-btn {
    display: flex;
    gap: 12px;
    justify-content: flex-end;
    padding-right: 16px;
  }
}

const.tsx

import {
  DatePicker,
  DatePickerProps,
  Input,
  InputNumber,
  InputNumberProps,
  InputProps,
  Select,
  SelectProps,
  TimePickerProps,
} from 'antd';

interface IOptions {
  label: string;
  value: any;
}

type IType = 'Input' | 'InputNumber' | 'Select' | 'DatePicker' | 'TimePicker';
type PropsMap = {
  Input: InputProps;
  InputNumber: InputNumberProps;
  Select: SelectProps;
  DatePicker: DatePickerProps;
  TimePicker: TimePickerProps;
};

export interface IItem<T extends IType = IType> {
  label: string;
  name: string;
  type: T;
  props?: PropsMap[T];
  options?: IOptions[];
}

export const renderItem = (type, props) => {
  switch (type) {
    case 'Input':
      return <Input placeholder="请输入" {...props} />;
    case 'TextArea':
      return <Input.TextArea placeholder="请输入" {...props} />;
    case 'InputNumber':
      return <InputNumber placeholder="请输入" controls={false} {...props} />;
    case 'Select':
      return <Select placeholder="请选择" {...props} />;
    case 'DatePicker':
      return <DatePicker {...props} />;
    case 'TimePicker':
      return <DatePicker.TimePicker {...props} />;

    default:
      return <Input placeholder="请输入" {...props} />;
  }
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1857002.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

LED显示屏的换帧频率与刷新频率:技术细节与市场发展

在当今数字化时代&#xff0c;LED显示屏已成为信息传递和广告宣传的重要工具。然而&#xff0c;对于普通消费者来说&#xff0c;LED显示屏背后的技术细节可能仍然是一个谜。今天&#xff0c;我们将深入探讨LED显示屏中的两个关键概念&#xff1a;换帧频率和刷新频率&#xff0c…

ARM功耗管理软件之WFIWFE

安全之安全(security)博客目录导读 思考&#xff1a;功耗管理软件栈及示例&#xff1f;WFI&WFE&#xff1f;时钟&电源树&#xff1f;DVFS&AVS&#xff1f; ARM功耗管理精讲与实战汇总参见&#xff1a;Arm功耗管理精讲与实战

PS系统教程26

PS与BR的关系 如何把图片以图层的方式导入画板里面 选中三张图片/多张选择工具-PS-将文件载入PS图层意味着这三张图片以图层的方式嵌入PS中 拼接长图 裁剪图片 保存裁剪后的图片拼接图片选中要拼接的图片选择工具-PS-Photomerge(拼合图像&#xff09; 图像处理器 大白话&…

APM教程-SkyWalking安装和配置

SkyWalking简介 APM (Application Performance Management) 即应用性能管理&#xff0c;属于IT运维管理&#xff08;ITOM)范畴。主要是针对企业 关键业务的IT应用性能和用户体验的监测、优化&#xff0c;提高企业IT应用的可靠性和质量&#xff0c;保证用户得到良好的服务&#…

IDEA中 pom.xml 设置自动提示

IDEA中 pom.xml 自动提示 IDEA中 pom.xml 自动提示设置如下&#xff1a; file–>Settings–>Build,Execution…–>Build Tools–>Maven–>Repositories 会看到类似表格的画面&#xff0c;内容是你的maven地址&#xff0c;选中后&#xff0c;右边有个Update的按…

轻量级在线服装3D定制引擎Myway简介

我写的面向web元宇宙轻量级系列引擎中的另外一个&#xff0c;在线3D定制引擎Myway 3D。 用于在线商品定制&#xff0c;比如个性化服装的定制、日常用品&#xff08;如杯子&#xff09;、家装&#xff08;被套&#xff09;等物品的在线定制。 特性列表&#xff1a; 可更换衣服…

会话会话会话

目录 1.会话 1.1 为什么需要会话控制 1.2 域对象的范围 1.2.1 应用域的范围 1.2.2 请求域的范围 1.2.3 会话域的范围 1.3 Cookie技术 1.3.1 Cookie的概念 1.3.2 Cookie的作用 1.3.3 Cookie的应用场景 1.3.4 Cookie的入门案例 ① 目标 ② Cookie相关的API ③ Serv…

Python自动化(8)——pyqt5界面

Python自动化(8)——pyqt5界面 注意&#xff1a;pyqt5的界面使用时必须有app QApplication(sys.argv)这行代码&#xff0c;否则会出现错误并且无法显示窗口&#xff1a;QWidget: Must construct a QApplication before a QWidget 一些基础的控件 QMainWindow QMainWindow是…

ESP32 esp-idf esp-adf环境安装及.a库创建与编译

简介 ESP32 功能丰富的 Wi-Fi & 蓝牙 MCU, 适用于多样的物联网应用。使用freertos操作系统。 ESP-IDF 官方物联网开发框架。 ESP-ADF 官方音频开发框架。 文档参照 https://espressif-docs.readthedocs-hosted.com/projects/esp-adf/zh-cn/latest/get-started/index.…

(1995-2022年) 全国各省份-技术交易活跃度

技术交易活跃度是一个关键指标&#xff0c;用于衡量技术市场的交易频繁程度和活跃性。它不仅显示了市场参与者对技术交易的参与热情&#xff0c;而且交易的频率也体现了市场的活力。这一指标对于不同的利益相关者具有不同的意义&#xff1a; 对投资者而言&#xff0c;技术交易…

尚硅谷k8s

p1-6 阿里云服务器开通流程 阿里云服务器购买等各种操作,省略 p7 私有网络vpc实战 VPC&#xff08;Virtual Private Cloud&#xff09;网络&#xff0c;是一种基于云计算的网络服务&#xff0c;旨在为用户提供在公有云上自定义的、逻辑隔离的网络空间。 设置vpc可以使网络之…

让生产管理变简单

随着业务的发展&#xff0c;工厂每天要处理很多订单&#xff0c;还要统筹安排各部门工作以及协调上下游加工企业&#xff0c;生产管理问题也随之而来。 1.销售订单评审困难、无法及时抓取到历史数据做参考。由于数据的不及时性、不准确性无法为正常的生产和采购提供数据支撑。同…

Linux关闭swap分区操作[适用于CDH报警等]

1.查看swap分区挂载路径(没卵用) swapon -s 2.设置配置文件的swap配置 echo “vm.swappiness 0” > /etc/sysctl.conf 3.设置内存中的swap状态。有时候配置文件为0&#xff0c;但集群或服务仍然使用了swap分区&#xff0c;可能原因就是内存没有同步配置 echo “0” > …

X-AnyLabeling使用教程

1.AI 模型自动分割标注使用教程 2.AI 模型自动目标检测标注使用教程

HTML(23)——垂直对齐方式

垂直对齐方式 属性名&#xff1a;vertical-align 属性值效果baseline基线对齐(默认)top顶部对齐middle居中对齐bottom底部对齐 默认情况下浏览器对行内块&#xff0c;行内标签都按文字处理&#xff0c;默认基线对齐 导致图片看起来会偏上&#xff0c;文字偏下。 示例&#…

React+TS前台项目实战(十七)-- 全局常用组件Dropdown封装

文章目录 前言Dropdown组件1. 功能分析2. 代码详细注释3. 使用方式4. 效果展示 总结 前言 今天这篇主要讲全局Dropdown组件封装&#xff0c;可根据UI设计师要求自定义修改。 Dropdown组件 1. 功能分析 &#xff08;1&#xff09;通过position属性,可以控制下拉选项的位置 &am…

安规管理:PLM安规管理、PLM安规管理新策略

安规管理&#xff1a;PLM安规管理、PLM安规管理新策略 随着科技的飞速发展&#xff0c;电子产品已经成为我们生活中不可或缺的一部分。然而&#xff0c;这些产品在给人们带来便利的同时&#xff0c;也可能带来触电、火灾、有害辐射等安全隐患。为了保护消费者的生命财产安全&am…

NSSCTF-Web题目15

目录 [HNCTF 2022 WEEK2]ez_SSTI 1、题目 2、知识点 3、思路 [SWPUCTF 2022 新生赛]Ez_upload 1、题目 2、知识点 3、思路 [HNCTF 2022 WEEK2]ez_SSTI 1、题目 2、知识点 SSTI、Jinja2 参考链接&#xff1a;1. SSTI&#xff08;模板注入&#xff09;漏洞&#xff08;…

雨量传感器的分类和选型建议

物理原理分类 机械降雨量计&#xff08;雨量桶&#xff09;&#xff1a;最早使用的降雨量传感器&#xff0c;通过漏斗收集雨水并记录。主要用于长期降雨统计&#xff0c;故障率较低。电容式降雨量传感器&#xff1a;基于两个电极之间的电容变化来计算降雨量。当降雨时&#xff…

2024年经济与国际贸易国际会议(ICEIT 2024)

2024年经济与国际贸易国际会议&#xff08;ICEIT 2024&#xff09; 2024 International Conference on Economy and International Trade 【重要信息】 大会地点&#xff1a;温州 大会官网&#xff1a;http://www.iciceit.com 投稿邮箱&#xff1a;iciceitsub-conf.com 【注意…