zy-react-library/src/components/Select/Basic/index.js

96 lines
2.2 KiB
JavaScript
Raw Normal View History

2025-11-06 09:38:23 +08:00
import { Select } from "antd";
import { useEffect, useMemo } from "react";
import { getMatchedItems, getUnmatchedItems } from "../../../utils/index.js";
2025-11-06 09:38:23 +08:00
/**
2026-03-24 14:45:26 +08:00
* 基础下拉组件
2025-11-06 09:38:23 +08:00
*/
function BasicSelect(props) {
const {
onGetData,
2025-11-06 16:31:49 +08:00
onChange,
2025-11-06 16:02:51 +08:00
onGetLabel,
2025-11-07 15:09:53 +08:00
onGetOption,
2025-11-06 09:38:23 +08:00
placeholder = "",
data = [],
nameKey = "name",
idKey = "id",
2025-12-16 14:53:35 +08:00
labelRender,
exclude = [],
include = [],
2025-11-06 09:38:23 +08:00
...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]);
2025-11-06 16:31:49 +08:00
const handleChange = (event, option) => {
if (onGetLabel || onGetOption) {
if (Array.isArray(event)) {
if (event.length > 0) {
const findItems = [];
const names = [];
event.forEach((item) => {
const findItem = actualData.find(dataItem => dataItem[idKey] === item);
if (findItem) {
findItems.push(findItem);
names.push(findItem[nameKey]);
}
});
onGetLabel?.(names);
onGetOption?.(findItems);
}
else {
onGetLabel?.([]);
onGetOption?.([]);
}
2025-11-07 14:49:16 +08:00
}
else {
if (event) {
const findItem = actualData.find(item => item[idKey] === event);
onGetLabel?.(findItem[nameKey]);
onGetOption?.(findItem);
}
else {
onGetLabel?.("");
onGetOption?.({});
}
2025-11-07 15:09:53 +08:00
}
2025-11-07 14:49:16 +08:00
}
2025-11-06 16:31:49 +08:00
onChange?.(event, option);
2025-11-06 16:28:49 +08:00
};
2025-11-06 16:02:51 +08:00
useEffect(() => {
onGetData?.(actualData);
}, [actualData]);
2025-11-06 09:38:23 +08:00
return (
<Select
placeholder={`请选择${placeholder}`}
showSearch={{ optionFilterProp: "children" }}
allowClear
onChange={handleChange}
options={actualData.map(item => ({
value: item[idKey],
label: labelRender ? labelRender(item) : item[nameKey],
}))}
{...restProps}
/>
2025-11-06 09:38:23 +08:00
);
}
BasicSelect.displayName = "BasicSelect";
export default BasicSelect;