WAI-ARIA compliant React autosuggest component.
- WAI-ARIA accessible (including ARIA attributes and keyboard interactions)
- Supports multiple sections as well as plain list of suggestions
- Supports delayed requests (if request comes back after user types another letter, it will be ignored)
- Full control over suggestion rendering (you can display extra data, images, whatever you want)
- Full control over when to show the suggestions (e.g. when user types 2 or more characters)
- Various hooks: onSuggestionSelected, onSuggestionFocused, onSuggestionUnfocused
- Ability to pass props to the input field (e.g. initial value, placeholder, type, onChange, onBlur)
- In-memory caching (suggestions for a given input are retrieved only once). Can be disabled.
- Comes with no styles. Only classes are provided.
- Thoroughly tested (over 120 tests)
npm install react-autosuggest --save
or
bower install react-autosuggest --save
import Autosuggest from 'react-autosuggest';
const suburbs = ['Cheltenham', 'Mill Park', 'Mordialloc', 'Nunawading'];
function getSuggestions(input, callback) {
const regex = new RegExp('^' + input, 'i');
const suggestions = suburbs.filter(suburb => regex.test(suburb));
setTimeout(() => callback(null, suggestions), 300); // Emulate API call
}
<Autosuggest suggestions={getSuggestions} />
Check out the standalone example.
suggestions
suggestionRenderer
suggestionValue
showWhen
onSuggestionSelected
onSuggestionFocused
onSuggestionUnfocused
inputAttributes
cache
id
scrollBar
Implement this function to tell <Autosuggest />
which suggestions to display.
function(input, callback) {
...
}
-
input
- Will be the value of the input field -
callback
- Should be called once the suggestions are in hand, or error occurs.- Success example:
callback(null,
<suggestions>)
- Error example:
callback(new Error("Couldn't get locations"))
- Success example:
<suggestions>
can have one of the following two formats:
- To display a single section with no title:
[
<suggestion>,
<suggestion>, ...]
- To display one or more sections with optional titles: Array of objects with an optional
sectionName
and a mandatorysuggestions
keys, e.g.:
[{
suggestions: [<suggestion>, <suggestion>] // This section won't have a title
}, {
sectionName: 'Second section',
suggestions: [<suggestion>, <suggestion>, <suggestion>]
}]
<suggestion>
can have one of the following two formats:
- String, e.g.:
'Mentone'
- Object, e.g.:
{ suburb: 'Mentone', postcode: '3194' }
. This object cannot have asuggestions
key. You must implementsuggestionRenderer
andsuggestionValue
in this case.
This function will be used to render the suggestion. It should return ReactElement
or a string.
function(suggestion, input) {
...
}
suggestion
- The suggestion to renderinput
- The value of the input field (e.g.:'Men'
). If user interacts using the Up or Down keys at the moment, it will be the value of the input field prior to those interactions.
For example:
function renderSuggestion(suggestion, input) { // In this example, 'suggestion' is a string
return ( // and it returns a ReactElement
<span><strong>{suggestion.slice(0, input.length)}</strong>{suggestion.slice(input.length)}</span>
);
}
<Autosuggest suggestions={getSuggestions}
suggestionRenderer={renderSuggestion} />
This function will be used to set the value of the input field when suggestion is selected. It has one parameter which is the suggestion object. This function is ignored when suggestions are strings.
For example:
function getSuggestionValue(suggestionObj) {
return suggestionObj.suburb + ' VIC ' + suggestionObj.postcode;
}
<Autosuggest suggestions={getSuggestions}
suggestionRenderer={renderSuggestion}
suggestionValue={getSuggestionValue} />
This function will be used to determine whether to show suggestions or not. It has one parameter which is the value of the input field (e.g.: 'm '
). The default is:
function(input) {
return input.trim().length > 0;
}
For example, this is how you could show suggestions only when user typed 2 or more characters:
<Autosuggest suggestions={getSuggestions}
showWhen={input => input.trim().length >= 2} />
This function will be called when suggestion is selected via mouse click or Enter.
function(suggestion, event) {
...
}
suggestion
- The selected suggestionevent
- It can be used to callevent.preventDefault()
if the<Autosuggest />
is inside a form and you don't want to submit the form once user selected a suggestion using Enter.
For example:
function onSuggestionSelected(suggestion, event) {
event.preventDefault();
// Do other fancy stuff
}
<Autosuggest suggestions={getSuggestions}
onSuggestionSelected={onSuggestionSelected} />
This function will be called when suggestion is focused via mouse hover or Up/Down keys.
function(suggestion) {
...
}
- suggestion - The focused suggestion
For example:
function onSuggestionFocused(suggestion) { // In this example 'suggestion' is a string
console.log('Suggestion focused: [' + suggestion + ']');
}
<Autosuggest suggestions={getSuggestions}
onSuggestionFocused={onSuggestionFocused} />
This function will be called when suggestion is unfocused.
function(suggestion) {
...
}
- suggestion - The unfocused suggestion
For example:
function onSuggestionUnfocused(suggestion) { // In this example 'suggestion' is a string
console.log('Suggestion unfocused: [' + suggestion + ']');
}
<Autosuggest suggestions={getSuggestions}
onSuggestionUnfocused={onSuggestionUnfocused} />
Hash of attributes to pass to the input field. For example:
const inputAttributes = {
id: 'locations-autosuggest',
name: 'locations-autosuggest',
className: 'my-sweet-locations-autosuggest',
placeholder: 'Enter locations...',
type: 'search',
value: 'Mordialloc', // Initial value
onChange: value => console.log(`Input value changed to: ${value}`),
onBlur: event => console.log('Input blurred. Event:', event)
};
<label htmlFor="locations-autosuggest">Where</label>
<Autosuggest suggestions={getSuggestions}
inputAttributes={inputAttributes} />
Defaults to true
, meaning that the suggestions
function will be called only once for a given input.
For example, if user types m
, and suggestions are retrieved, we store the result in memory. Then, if user types e
and hits Backspace
, we get the suggestions for m
from the cache.
Set cache={false}
to disable this behaviour.
The only reason id
exists, is to set ARIA attributes (they require a unique id).
When rendering a single <Autosuggest />
, don't set the id
(it will be set to '1'
, by default).
When rendering multiple <Autosuggest />
s, make sure to give them unique id
s. For example:
<Autosuggest id="source" suggestions={getSourceSuggestions} />
<Autosuggest id="destination" suggestions={getDestinationSuggestions} />
Set it to true
only if suggestions container (react-autosuggest__suggestions
) can have a scroll bar (e.g. if it has height: 200px; overflow: auto
). Suggestions container must be a positioned element in this case. When set to true
, suggestions container will adjust its scroll bar every time user interacts using the Up and Down keys (see the [this example](https://moroshko.github.io/react-autosuggest#Custom renderer)).
Defaults to false
.
<Autosuggest />
comes with no styles. You can use the following classes to style it:
react-autosuggest
react-autosuggest__suggestions
react-autosuggest__suggestion
react-autosuggest__suggestion--focused
react-autosuggest__suggestions-section
react-autosuggest__suggestions-section-name
react-autosuggest__suggestions-section-suggestions
An example can be found in examples/src/Autosuggest.less
The following diagrams explain the classes above.
+---| react-autosuggest |-------------------------+
| |
| <input> |
| |
| +--| react-autosuggest__suggestions |-------+ |
| | | |
| | +--| react-autosuggest__suggestion |--+ | |
| | | | | |
| | +-------------------------------------+ | |
| | | |
| +-------------------------------------------+ |
| |
+-------------------------------------------------+
+---| react-autosuggest |----------------------------------------------------+
| |
| <input> |
| |
| +--| react-autosuggest__suggestions |----------------------------------+ |
| | | |
| | +--| react-autosuggest__suggestions-section |--------------------+ | |
| | | | | |
| | | +--| react-autosuggest__suggestions-section-name |---------+ | | |
| | | | | | | |
| | | +----------------------------------------------------------+ | | |
| | | | | |
| | | +--| react-autosuggest__suggestions-section-suggestions |--+ | | |
| | | | | | | |
| | | | +--| react-autosuggest__suggestion |-----------------+ | | | |
| | | | | | | | | |
| | | | +----------------------------------------------------+ | | | |
| | | | | | | |
| | | +----------------------------------------------------------+ | | |
| | | | | |
| | +----------------------------------------------------------------+ | |
| | | |
| +----------------------------------------------------------------------+ |
| |
+----------------------------------------------------------------------------+
npm start
Now, open http://localhost:3000/examples/dist/index.html
and start hacking!
npm test