qm-ui
Version:
千米公有云管理端UI基础组件库
94 lines (84 loc) • 2.18 kB
JavaScript
import React from 'react'
import { Select } from 'antd'
const Option = Select.Option
/**
* search input
* @author gcy[of1518]
*/
export default class SearchInput extends React.Component {
static defaultProps = {
net: '', // async function
option: {
key: 'label', // string | function
title: 'label', // string | function
},
itemLimit: 20, // number | string | array
value: undefined, // value
onChange: () => undefined, // onchange
}
constructor(props) {
super(props)
this.state = {
value: props.value || '',
data: [],
dataSnap: [],
}
}
componentWillReceiveProps(nextProps) {
let { value } = nextProps
if (!value) {
this.setState({ value: '' })
}
}
async componentDidMount() {
let data = (await this.props.net()) || [] // net
this.setState({ data, dataSnap: data })
}
render() {
// option
let { option, itemLimit, placeholder } = this.props
let { data: options, value } = this.state
let { key, title } = option
options.length = Math.min(options.length, itemLimit)
options =
(options || []).map((o, k) => <Option value={o[key] || k}>{o[title] || ''}</Option>) || null
return (
<Select
combobox
value={value}
placeholder={!!value ? '' : placeholder}
notFoundContent=""
style={this.props.style}
defaultActiveFirstOption={false}
showArrow={false}
filterOption={false}
onSearch={this.handleSearch}
onSelect={this.handleSelect}>
{options}
</Select>
)
}
/**
* change对结果过滤
*/
handleSearch = value => {
let { option } = this.props
let { dataSnap } = this.state
let { key, title } = option
let data = dataSnap.filter(v => String(v[title] || '').includes(value))
if (!data || data.length <= 0) {
data = [{ [key]: value, [title]: value }].concat(data)
}
this.setState({
value,
data,
})
}
/**
* select勾选完后,直接on change
*/
handleSelect = (value, option) => {
this.setState({ value })
this.props.onChange(value, option)
}
}