linkmore-design
Version:
🌈 🚀lm组件库。🚀
104 lines (100 loc) • 3.63 kB
JavaScript
;
var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard").default;
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
var _classnames = _interopRequireDefault(require("classnames"));
var _react = _interopRequireWildcard(require("react"));
var _empty = _interopRequireDefault(require("../../empty"));
var _virtualList = _interopRequireDefault(require("../../virtual-list"));
var _hooks = require("../hooks");
var _DelayInput = _interopRequireDefault(require("./DelayInput"));
const SelectRender = /*#__PURE__*/(0, _react.forwardRef)((props, ref) => {
const {
value = '',
onChange,
options: filters = [],
fieldNames: itemFieldNames,
onFocus,
showSearch,
itemRender,
footerRender
} = props;
const delayedFn = (0, _hooks.useDelayedFn)();
const inputRef = (0, _react.useRef)(null);
// 搜索后的筛选项
const [options, setOptions] = (0, _react.useState)(filters);
// 是否存在搜索, 当数据大于8时存在搜索
const isSearch = (0, _react.useMemo)(() => filters.length > 8 && !!(showSearch ?? true), [filters.length, showSearch]);
// 自定义节点字段
const fieldNames = (0, _react.useMemo)(() => ({
label: 'label',
value: 'value',
...itemFieldNames
}), [itemFieldNames]);
const handleFilter = (val = '') => {
const serachValues = filters.filter(v => v[fieldNames.label].indexOf(val) > -1);
setOptions(serachValues);
};
// 单选事件
const handleOnClick = (e, obj) => {
e.preventDefault();
onChange?.(obj[fieldNames.value], obj);
};
const handeFocus = () => {
onFocus?.();
delayedFn(() => inputRef.current?.focus?.({
cursor: 'all'
}));
// 若开启了 Dropdown => destroyPopupOnHide=true 无需重置操作 反之需开启
// inputRef.current?.setValue?.('');
// handleFilter('');
};
// 初始化展开时获取焦点
(0, _react.useEffect)(() => {
handeFocus();
}, []);
(0, _react.useImperativeHandle)(ref, () => ({
blur: () => {},
focus: handeFocus
}));
return /*#__PURE__*/_react.default.createElement("div", {
className: "filter_dropdown"
}, isSearch && /*#__PURE__*/_react.default.createElement("div", {
className: "filter_header"
}, /*#__PURE__*/_react.default.createElement(_DelayInput.default, {
ref: inputRef,
onSearch: handleFilter,
onChange: handleFilter
})), /*#__PURE__*/_react.default.createElement("div", {
className: "filter_body"
}, /*#__PURE__*/_react.default.createElement(_virtualList.default, {
options: options,
className: "filter_list"
}, ({
item,
...resetProps
}) => {
if (itemRender) return itemRender?.({
item,
...resetProps
});
return /*#__PURE__*/_react.default.createElement("div", (0, _extends2.default)({}, resetProps, {
className: (0, _classnames.default)('filter_item', {
checked: item[fieldNames?.value]?.toString() === value?.toString()
}),
onClick: e => handleOnClick(e, item)
}), /*#__PURE__*/_react.default.createElement("div", {
className: "filter_item_content"
}, item[fieldNames?.label]));
}), !options.length && /*#__PURE__*/_react.default.createElement(_empty.default, {
title: "",
image: "nodata",
className: "ant-empty-small"
}), footerRender && footerRender?.()));
});
var _default = SelectRender;
exports.default = _default;