acud
Version:
acg react 组件库
167 lines • 7.07 kB
JavaScript
import _typeof from "@babel/runtime/helpers/esm/typeof";
import _extends from "@babel/runtime/helpers/esm/extends";
import _defineProperty from "@babel/runtime/helpers/esm/defineProperty";
import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
var __rest = this && this.__rest || function (s, e) {
var t = {};
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) t[p] = s[p];
if (s != null && typeof Object.getOwnPropertySymbols === "function") for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) t[p[i]] = s[p[i]];
}
return t;
};
import React, { useCallback } from 'react';
import classnames from 'classnames';
import OutlinedSearch from "acud-icon/es/icons/OutlinedSearch";
import OutlinedLoading from "acud-icon/es/icons/OutlinedLoading";
import useMergedState from "rc-util/es/hooks/useMergedState";
import { ConfigContext } from '../config-provider';
import Select from '../select';
import useCombinedRefs from '../_util/hooks/useCombinedRefs';
import Input from '../input';
import Button from '../button';
var Option = Select.Option;
var Search = /*#__PURE__*/React.forwardRef(function (props, ref) {
// props
var loading = props.loading,
className = props.className,
_props$multipleOption = props.multipleOption,
multipleOption = _props$multipleOption === void 0 ? [] : _props$multipleOption,
multipleValue = props.multipleValue,
multipleDefaultValue = props.multipleDefaultValue,
_props$enterButton = props.enterButton,
enterButton = _props$enterButton === void 0 ? false : _props$enterButton,
size = props.size,
disabled = props.disabled,
onCompositionStart = props.onCompositionStart,
onCompositionEnd = props.onCompositionEnd,
customChange = props.onChange,
customSearch = props.onSearch,
customChangeMultiple = props.onChangeMultiple,
addonSelectStyle = props.addonSelectStyle,
otherProps = __rest(props, ["loading", "className", "multipleOption", "multipleValue", "multipleDefaultValue", "enterButton", "size", "disabled", "onCompositionStart", "onCompositionEnd", "onChange", "onSearch", "onChangeMultiple", "addonSelectStyle"]);
var _useMergedState = useMergedState(multipleDefaultValue, {
value: multipleValue
}),
_useMergedState2 = _slicedToArray(_useMergedState, 2),
multipleMergeValue = _useMergedState2[0],
setMultipleMergeValue = _useMergedState2[1];
var composedRef = React.useRef(false);
// 变量
// search里面主要是对enterButton做处理
var button;
var addonBefore;
var ifMultiple = !!multipleOption.length;
var _React$useContext = React.useContext(ConfigContext),
getPrefixCls = _React$useContext.getPrefixCls;
var customizePrefixCls = props.prefixCls;
var prefixCls = getPrefixCls('input-search', customizePrefixCls);
var ifControlMutipleValue = 'multipleValue' in props;
// 样式
var classes = classnames(className, prefixCls, _defineProperty(_defineProperty(_defineProperty({}, "".concat(prefixCls, "-multiple"), ifMultiple), "".concat(prefixCls, "-enter-button"), enterButton), "".concat(prefixCls, "-enter-button-disabled"), disabled));
// 点击搜索按钮样式
var searchIconClass = "".concat(prefixCls, "-icon");
var searchLoadingIconClass = "".concat(prefixCls, "-loading-icon");
// ref
var inputRef = React.useRef(null);
var combinedRef = useCombinedRefs(ref, inputRef);
// 函数
var onChange = useCallback(function (e) {
if (e && e.target && e.type === 'click' && customSearch) {
customSearch(e.target.value, e);
}
customChange && customChange(e);
}, [customChange, customSearch]);
var onSearch = useCallback(function (e) {
var _a;
var value = (_a = combinedRef.current) === null || _a === void 0 ? void 0 : _a.value;
var realValue = ifMultiple ? {
type: multipleMergeValue,
value: value
} : value;
if (composedRef.current) {
return;
}
customSearch && customSearch(realValue, e);
}, [combinedRef, ifMultiple, multipleMergeValue, customSearch]);
var onChangeMultiple = useCallback(function (value) {
// 如果是不受控,就自己调用set
if (!ifControlMutipleValue) {
setMultipleMergeValue(value);
}
customChangeMultiple === null || customChangeMultiple === void 0 ? void 0 : customChangeMultiple(value);
}, [customChangeMultiple, ifControlMutipleValue, setMultipleMergeValue]);
// 主要逻辑
// 如果是enterButton对象,就表示ReactElement
var buttonContent = enterButton === true ? /*#__PURE__*/React.createElement(OutlinedSearch, null) : enterButton;
// icon还是交给button处理吧
button = /*#__PURE__*/React.createElement(Button, {
key: "enterButton",
type: enterButton ? 'primary' : undefined,
size: size,
loading: loading,
disabled: disabled,
onClick: onSearch,
onMouseDown: function onMouseDown(e) {
e.preventDefault();
},
icon: buttonContent
});
// 多条件搜索
if (multipleOption.length) {
addonBefore = /*#__PURE__*/React.createElement(Select, {
value: multipleMergeValue,
onChange: function onChange(value) {
return onChangeMultiple(value);
},
disabled: disabled,
style: addonSelectStyle
}, multipleOption.map(function (item) {
var _ref = item || {},
value = _ref.value,
label = _ref.label;
return /*#__PURE__*/React.createElement(Option, {
value: value,
key: value
}, label);
}));
}
var handleOnCompositionStart = function handleOnCompositionStart(e) {
composedRef.current = true;
onCompositionStart === null || onCompositionStart === void 0 ? void 0 : onCompositionStart(e);
};
var handleOnCompositionEnd = function handleOnCompositionEnd(e) {
composedRef.current = false;
onCompositionEnd === null || onCompositionEnd === void 0 ? void 0 : onCompositionEnd(e);
};
var baseProps = _extends(_extends({}, otherProps), {
size: size,
ref: combinedRef,
onChange: onChange,
disabled: disabled,
onPressEnter: onSearch,
onCompositionStart: handleOnCompositionStart,
onCompositionEnd: handleOnCompositionEnd,
addonBefore: ifMultiple && addonBefore
});
var suffix = loading ? /*#__PURE__*/React.createElement(OutlinedLoading, {
className: searchLoadingIconClass,
animation: "spin"
}) : /*#__PURE__*/React.createElement(OutlinedSearch, {
onClick: onSearch,
onMouseDown: function onMouseDown(e) {
e.preventDefault();
},
className: searchIconClass,
disabled: disabled
});
var realProps = enterButton === false || _typeof(enterButton) === undefined ? _extends(_extends({}, baseProps), {
suffix: suffix
}) : baseProps;
return /*#__PURE__*/React.createElement("span", {
className: classes
}, /*#__PURE__*/React.createElement(Input, _extends({}, realProps, {
ref: combinedRef
})), enterButton && button);
});
export default Search;