import React, { PureComponent } from 'react'; import PropTypes from 'prop-types'; import { Input, Icon, AutoComplete } from 'antd'; import classNames from 'classnames'; import Debounce from 'lodash-decorators/debounce'; import Bind from 'lodash-decorators/bind'; import styles from './index.less'; export default class HeaderSearch extends PureComponent { static propTypes = { className: PropTypes.string, placeholder: PropTypes.string, onSearch: PropTypes.func, onPressEnter: PropTypes.func, defaultActiveFirstOption: PropTypes.bool, dataSource: PropTypes.array, defaultOpen: PropTypes.bool, }; static defaultProps = { defaultActiveFirstOption: false, onPressEnter: () => {}, onSearch: () => {}, className: '', placeholder: '', dataSource: [], defaultOpen: false, }; constructor(props) { super(props); this.state = { searchMode: props.defaultOpen, value: '', }; } onKeyDown = e => { if (e.key === 'Enter') { this.debouncePressEnter(); } }; onChange = value => { this.setState({ value }); const { onChange } = this.props; if (onChange) { onChange(); } }; enterSearchMode = () => { this.setState({ searchMode: true }, () => { const { searchMode } = this.state; if (searchMode) { this.input.focus(); } }); }; leaveSearchMode = () => { this.setState({ searchMode: false, value: '', }); }; // NOTE: 不能小于500,如果长按某键,第一次触发auto repeat的间隔是500ms,小于500会导致触发2次 @Bind() @Debounce(500, { leading: true, trailing: false, }) debouncePressEnter() { const { onPressEnter } = this.props; const { value } = this.state; onPressEnter(value); } render() { const { className, placeholder, ...restProps } = this.props; const { searchMode, value } = this.state; delete restProps.defaultOpen; // for rc-select not affected const inputClass = classNames(styles.input, { [styles.show]: searchMode, }); return ( { this.input = node; }} onKeyDown={this.onKeyDown} onBlur={this.leaveSearchMode} /> ); } }