UNPKG

knk

Version:

react components based on react

186 lines (185 loc) 5.95 kB
import _extends from "@babel/runtime/helpers/esm/extends"; import _objectSpread from "@babel/runtime/helpers/esm/objectSpread2"; import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray"; /** * 异步搜索框, 支持搜索结果多选 */ import React, { useState } from 'react'; import PropTypes from 'prop-types'; import { fetch } from '../../../common/api'; import { log, debounce } from '../../../common/tool'; import { Input, List, message } from 'antd'; import '../../../style/ajax_input_search.less'; var Search = Input.Search; var ListItem = List.Item; // 封装组件 var AjaxInputSearch = /*#__PURE__*/React.forwardRef(function (props, ref) { var ajaxInputSearchRef = React.useRef(); ajaxInputSearchRef = ref; var _useState = useState(false), _useState2 = _slicedToArray(_useState, 2), loading = _useState2[0], setloading = _useState2[1]; var _useState3 = useState(false), _useState4 = _slicedToArray(_useState3, 2), open = _useState4[0], setOpen = _useState4[1]; var _useState5 = useState(false), _useState6 = _slicedToArray(_useState5, 2), isHover = _useState6[0], setHover = _useState6[1]; // 鼠标移入 var _useState7 = useState([]), _useState8 = _slicedToArray(_useState7, 2), listData = _useState8[0], setListData = _useState8[1]; // 请求下拉菜单 var handleGetList = function handleGetList(searchValue) { var apiPath = props.apiPath, apiData = props.apiData, apiMethod = props.apiMethod, searchKeyWord = props.searchKeyWord; setloading(true); var sendData = _objectSpread({}, apiData); sendData[searchKeyWord] = searchValue; fetch(apiPath, sendData, apiMethod).then(function (res) { var data = res && res.data || []; setListData(data); }).catch(function (err) { log.error(err); message.error("\u83B7\u53D6\u6570\u636E\u5931\u8D25:".concat(err.message)); }).finally(function () { setloading(false); }); }; // input值变化 var handleInputChange = function handleInputChange(e) { var showSearchBtn = props.showSearchBtn, onChange = props.onChange, checkInputValue = props.checkInputValue; var searchValue = e.target.value; searchValue = searchValue.trim(); if (checkInputValue && !checkInputValue(searchValue)) return; onChange && onChange(searchValue); if (showSearchBtn) return; if (!searchValue) { setListData([]); setOpen(false); } else { handleGetList(searchValue); setOpen(true); } }; // 搜索 var handleInputSearch = function handleInputSearch(selectVal) { var onChange = props.onChange; if (selectVal) { onChange && onChange(selectVal); handleGetList(selectVal); setOpen(true); } else { setListData([]); setOpen(false); } }; // 下拉菜单选中 var handleOnSelect = function handleOnSelect(selectVal, index) { var onSelect = props.onSelect, onChange = props.onChange, selectItemName = props.selectItemName; var newList = JSON.parse(JSON.stringify(listData)); newList.forEach(function (item) { item.active = item[selectItemName] === selectVal[selectItemName]; }); setListData(newList); onSelect && onSelect(selectVal, index); onChange && onChange(selectVal[selectItemName]); setOpen(false); }; // 获取焦点 var handleInputFocus = function handleInputFocus() { var showDropDown = props.showDropDown, value = props.value; if (showDropDown && value) { if (!listData || listData.length < 1) { handleGetList(value); } setOpen(true); } }; // 失去焦点 var handleInputBlur = function handleInputBlur() { if (!isHover) { setOpen(false); } }; var defaultProps = {}; var value = props.value, showSearchBtn = props.showSearchBtn, showDropDown = props.showDropDown, selectItemName = props.selectItemName; if (showSearchBtn) { defaultProps = { enterButton: '搜索', onSearch: handleInputSearch }; } return /*#__PURE__*/React.createElement("div", { ref: ajaxInputSearchRef, className: "app-ajax-input-search" }, /*#__PURE__*/React.createElement("div", null, /*#__PURE__*/React.createElement(Search, _extends({}, defaultProps, { allowClear: true, placeholder: "\u8BF7\u8F93\u5165", onChange: function onChange(e) { return debounce(handleInputChange(e), 500); }, onFocus: handleInputFocus, onBlur: handleInputBlur, value: value }))), /*#__PURE__*/React.createElement("div", { className: "search-drop-down", style: { display: showDropDown && open ? 'block' : 'none' }, onMouseOver: function onMouseOver() { return setHover(true); }, onMouseOut: function onMouseOut() { return setHover(false); } }, /*#__PURE__*/React.createElement(List, { loading: loading, locale: { emptyText: '暂无数据' }, split: false, size: "small", className: "drop-down-list", dataSource: listData, renderItem: function renderItem(item, index) { return /*#__PURE__*/React.createElement(ListItem, { className: item.active ? 'drop-down-item-active drop-down-item' : 'drop-down-item', onClick: function onClick() { return handleOnSelect(item, index); } }, selectItemName ? item[selectItemName] : item); } }))); }); AjaxInputSearch.propTypes = { apiPath: PropTypes.string, apiData: PropTypes.object, apiMethod: PropTypes.string, value: PropTypes.string, searchKeyWord: PropTypes.string, showSearchBtn: PropTypes.bool, showDropDown: PropTypes.bool, selectItemName: PropTypes.string, onChange: PropTypes.func, onSelect: PropTypes.func, checkInputValue: PropTypes.func }; AjaxInputSearch.defaultProps = { showSearchBtn: false, showDropDown: true }; export default AjaxInputSearch;