AutoComplete
Autocomplete function of input field.
When To Use#
When there is a need for autocomplete functionality.
Examples
input here
control mode
TypeScript
JavaScript
import React, { useState } from 'react';
import { AutoComplete } from 'antd';
const mockVal = (str: string, repeat: number = 1) => {
return {
value: str.repeat(repeat),
};
};
const Complete: React.FC = () => {
const [value, setValue] = useState('');
const [options, setOptions] = useState<{ value: string }[]>([]);
const onSearch = (searchText: string) => {
setOptions(
!searchText ? [] : [mockVal(searchText), mockVal(searchText, 2), mockVal(searchText, 3)],
);
};
const onSelect = (data: string) => {
console.log('onSelect', data);
};
const onChange = (data: string) => {
setValue(data);
};
return (
<>
<AutoComplete
options={options}
style={{ width: 200 }}
onSelect={onSelect}
onSearch={onSearch}
placeholder="input here"
/>
<br />
<br />
<AutoComplete
value={value}
options={options}
style={{ width: 200 }}
onSelect={onSelect}
onSearch={onSearch}
onChange={onChange}
placeholder="control mode"
/>
</>
);
};
ReactDOM.render(<Complete />, mountNode);
TypeScript
JavaScript
import React, { useState } from 'react';
import { AutoComplete, Input } from 'antd';
const { TextArea } = Input;
const Complete: React.FC = () => {
const [options, setOptions] = useState<{ value: string }[]>([]);
const handleSearch = (value: string) => {
setOptions(
!value ? [] : [{ value }, { value: value + value }, { value: value + value + value }],
);
};
const handleKeyPress = (ev: React.KeyboardEvent<HTMLTextAreaElement>) => {
console.log('handleKeyPress', ev);
};
const onSelect = (value: string) => {
console.log('onSelect', value);
};
return (
<AutoComplete
options={options}
style={{ width: 200 }}
onSelect={onSelect}
onSearch={handleSearch}
>
<TextArea
placeholder="input here"
className="custom"
style={{ height: 50 }}
onKeyPress={handleKeyPress}
/>
</AutoComplete>
);
};
ReactDOM.render(<Complete />, mountNode);
TypeScript
JavaScript
import { Input, AutoComplete } from 'antd';
import { UserOutlined } from '@ant-design/icons';
const renderTitle = (title: string) => {
return (
<span>
{title}
<a
style={{ float: 'right' }}
href="https://www.google.com/search?q=antd"
target="_blank"
rel="noopener noreferrer"
>
more
</a>
</span>
);
};
const renderItem = (title: string, count: number) => {
return {
value: title,
label: (
<div
style={{
display: 'flex',
justifyContent: 'space-between',
}}
>
{title}
<span>
<UserOutlined /> {count}
</span>
</div>
),
};
};
const options = [
{
label: renderTitle('Libraries'),
options: [renderItem('AntDesign', 10000), renderItem('AntDesign UI', 10600)],
},
{
label: renderTitle('Solutions'),
options: [renderItem('AntDesign UI FAQ', 60100), renderItem('AntDesign FAQ', 30010)],
},
{
label: renderTitle('Articles'),
options: [renderItem('AntDesign design language', 100000)],
},
];
const Complete: React.FC = () => (
<AutoComplete
dropdownClassName="certain-category-search-dropdown"
dropdownMatchSelectWidth={500}
style={{ width: 250 }}
options={options}
>
<Input.Search size="large" placeholder="input here" />
</AutoComplete>
);
ReactDOM.render(<Complete />, mountNode);
.certain-category-search-dropdown .ant-select-dropdown-menu-item-group-title {
color: #666;
font-weight: bold;
}
.certain-category-search-dropdown .ant-select-dropdown-menu-item-group {
border-bottom: 1px solid #f6f6f6;
}
.certain-category-search-dropdown .ant-select-dropdown-menu-item {
padding-left: 16px;
}
.certain-category-search-dropdown .ant-select-dropdown-menu-item.show-all {
text-align: center;
cursor: default;
}
.certain-category-search-dropdown .ant-select-dropdown-menu {
max-height: 300px;
}
input here
TypeScript
JavaScript
import React, { useState } from 'react';
import { AutoComplete } from 'antd';
const { Option } = AutoComplete;
const Complete: React.FC = () => {
const [result, setResult] = useState<string[]>([]);
const handleSearch = (value: string) => {
let res: string[] = [];
if (!value || value.indexOf('@') >= 0) {
res = [];
} else {
res = ['gmail.com', '163.com', 'qq.com'].map(domain => `${value}@${domain}`);
}
setResult(res);
};
return (
<AutoComplete style={{ width: 200 }} onSearch={handleSearch} placeholder="input here">
{result.map((email: string) => (
<Option key={email} value={email}>
{email}
</Option>
))}
</AutoComplete>
);
};
ReactDOM.render(<Complete />, mountNode);
try to type `b`
TypeScript
JavaScript
import { AutoComplete } from 'antd';
const options = [
{ value: 'Burns Bay Road' },
{ value: 'Downing Street' },
{ value: 'Wall Street' },
];
const Complete: React.FC = () => (
<AutoComplete
style={{ width: 200 }}
options={options}
placeholder="try to type `b`"
filterOption={(inputValue, option) =>
option.value.toUpperCase().indexOf(inputValue.toUpperCase()) !== -1
}
/>
);
ReactDOM.render(<Complete />, mountNode);
TypeScript
JavaScript
import React, { useState } from 'react';
import { Input, AutoComplete } from 'antd';
import { SelectProps } from 'antd/es/select';
function getRandomInt(max: number, min: number = 0) {
return Math.floor(Math.random() * (max - min + 1)) + min; // eslint-disable-line no-mixed-operators
}
const searchResult = (query: string) => {
return new Array(getRandomInt(5))
.join('.')
.split('.')
.map((item, idx) => {
const category = `${query}${idx}`;
return {
value: category,
label: (
<div
style={{
display: 'flex',
justifyContent: 'space-between',
}}
>
<span>
Found {query} on{' '}
<a
href={`https://s.taobao.com/search?q=${query}`}
target="_blank"
rel="noopener noreferrer"
>
{category}
</a>
</span>
<span>{getRandomInt(200, 100)} results</span>
</div>
),
};
});
};
const Complete: React.FC = () => {
const [options, setOptions] = useState<SelectProps<object>['options']>([]);
const handleSearch = (value: string) => {
setOptions(value ? searchResult(value) : []);
};
const onSelect = (value: string) => {
console.log('onSelect', value);
};
return (
<AutoComplete
dropdownMatchSelectWidth={252}
style={{ width: 300 }}
options={options}
onSelect={onSelect}
onSearch={handleSearch}
>
<Input.Search size="large" placeholder="input here" enterButton />
</AutoComplete>
);
};
ReactDOM.render(<Complete />, mountNode);
API#
Property | Description | Type | Default | Version |
---|---|---|---|---|
allowClear | Show clear button, effective in multiple mode only | boolean | false | |
autoFocus | If get focus when component mounted | boolean | false | |
backfill | If backfill selected item the input when using keyboard | boolean | false | |
children (for customize input element) | Customize input element | HTMLInputElement | HTMLTextAreaElement | React.ReactElement<InputProps> | <Input /> | |
children (for dataSource) | Data source to auto complete | React.ReactElement<OptionProps> | Array<React.ReactElement<OptionProps>> | - | |
defaultActiveFirstOption | Whether active first option by default | boolean | true | |
defaultValue | Initial selected option | string | - | |
disabled | Whether disabled select | boolean | false | |
dropdownClassName | The className of dropdown menu | string | - | |
dropdownMatchSelectWidth | Determine whether the dropdown menu and the select input are the same width. Default set min-width same as input. Will ignore when value less than select width. false will disable virtual scroll | boolean | number | true | |
filterOption | If true, filter options by input, if function, filter options against it. The function will receive two arguments, inputValue and option , if the function returns true, the option will be included in the filtered set; Otherwise, it will be excluded | boolean | function(inputValue, option) | true | |
placeholder | The placeholder of input | string | - | |
value | Selected option | string | - | |
onBlur | Called when leaving the component | function() | - | |
onChange | Called when select an option or input value change, or value of input is changed | function(value) | - | |
onFocus | Called when entering the component | function() | - | |
onSearch | Called when searching items | function(value) | - | |
onSelect | Called when a option is selected. param is option's value and option instance | function(value, option) | - | |
defaultOpen | Initial open state of dropdown | boolean | - | |
open | Controlled open state of dropdown | boolean | - | |
options | Select options. Will get better perf than jsx definition | { label, value }[] | - | |
onDropdownVisibleChange | Call when dropdown open | function(open) | - | |
notFoundContent | Specify content to show when no result matches | string | Not Found |
Methods#
Name | Description | Version |
---|---|---|
blur() | Remove focus | |
focus() | Get focus |
FAQ#
Why doesn't the text composition system work well with onSearch in controlled mode?#
Please use onChange
to manage control state. onSearch
is used for searching input which is not same as onChange
. Besides, clicking on the option will not trigger the onSearch
event.
Part of api from v3 not available in v4?#
AutoComplete is a Input component support auto complete tips which should not support labelInValue
prop to modify dispaly value in input. In v3, AutoComplete realization can not handle case that user type match of both value
& label
are the same. v4 not longer support label
as the value input.