From 309cbebafc0d78654fc6acdf6b47ca4528387f48 Mon Sep 17 00:00:00 2001 From: LiuJiaNan <15703339975@163.com> Date: Tue, 11 Aug 2026 14:57:48 +0800 Subject: [PATCH] =?UTF-8?q?feat(select):=20=E6=94=AF=E6=8C=81=E6=8E=92?= =?UTF-8?q?=E9=99=A4=E5=92=8C=E5=8C=85=E5=90=AB=E9=80=89=E9=A1=B9=E7=9A=84?= =?UTF-8?q?=E8=BF=87=E6=BB=A4=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 在组件中新增 exclude 和 include 属性,支持对数据进行筛选 - 使用 useMemo 优化实际展示数据的计算逻辑 - 引入工具函数 getMatchedItems 和 getUnmatchedItems 进行数据过滤 - 修改回调函数和 options 渲染为基于过滤后的数据 - 通过 onGetData 返回过滤后的数据列表 --- src/components/Select/Basic/index.d.ts | 4 ++++ src/components/Select/Basic/index.js | 29 ++++++++++++++++++++------ 2 files changed, 27 insertions(+), 6 deletions(-) diff --git a/src/components/Select/Basic/index.d.ts b/src/components/Select/Basic/index.d.ts index 89ad525..d6d8933 100644 --- a/src/components/Select/Basic/index.d.ts +++ b/src/components/Select/Basic/index.d.ts @@ -21,6 +21,10 @@ export interface BasicSelectProps extends SelectProps { onGetData?: (data: Record[]) => void; /** 自定义 label 的渲染函数 */ labelRender?: (item: Record) => ReactNode; + /** 排除的项 */ + exclude?: string[]; + /** 包含的项 */ + include?: string[]; } /** diff --git a/src/components/Select/Basic/index.js b/src/components/Select/Basic/index.js index 4615482..b59f34f 100644 --- a/src/components/Select/Basic/index.js +++ b/src/components/Select/Basic/index.js @@ -1,5 +1,6 @@ import { Select } from "antd"; -import { useEffect } from "react"; +import { useEffect, useMemo } from "react"; +import { getMatchedItems, getUnmatchedItems } from "../../../utils/index.js"; /** * 基础下拉组件 @@ -15,9 +16,25 @@ function BasicSelect(props) { nameKey = "name", idKey = "id", labelRender, + exclude = [], + include = [], ...restProps } = props; + const actualData = useMemo(() => { + let result = data; + + if (exclude.length > 0) { + result = getUnmatchedItems({ list: result, value: exclude, idKey }); + } + + if (include.length > 0) { + result = getMatchedItems({ list: result, value: include, idKey }); + } + + return result; + }, [data, exclude, include, idKey]); + const handleChange = (event, option) => { if (onGetLabel || onGetOption) { if (Array.isArray(event)) { @@ -25,7 +42,7 @@ function BasicSelect(props) { const findItems = []; const names = []; event.forEach((item) => { - const findItem = data.find(dataItem => dataItem[idKey] === item); + const findItem = actualData.find(dataItem => dataItem[idKey] === item); if (findItem) { findItems.push(findItem); names.push(findItem[nameKey]); @@ -41,7 +58,7 @@ function BasicSelect(props) { } else { if (event) { - const findItem = data.find(item => item[idKey] === event); + const findItem = actualData.find(item => item[idKey] === event); onGetLabel?.(findItem[nameKey]); onGetOption?.(findItem); } @@ -55,8 +72,8 @@ function BasicSelect(props) { }; useEffect(() => { - onGetData?.(data); - }, [data]); + onGetData?.(actualData); + }, [actualData]); return (