Material Ui Autocomplete: Can Tags Be Created On Events Aside From 'enter' Events?
I am currently working with the freesolo Autocomplete and my particular use case requires tags to be created when commas or spaces follow the input text. Autocomplete currently cre
Solution 1:
Below is the approach I would recommend.
There are two main aspects to the approach:
Use a "controlled" input approach for the
Autocompleteso that you have full control over the current value.Specify the
onKeyDownhandler for theTextFieldinput viaparams.inputProps.onKeyDownwith appropriate logic for adding the new value.
import React from"react";
import TextField from"@material-ui/core/TextField";
import Autocomplete from"@material-ui/lab/Autocomplete";
export default function Tags() {
const [value, setValue] = React.useState([top100Films[13]]);
const handleKeyDown = event => {
switch (event.key) {
case",":
case" ": {
event.preventDefault();
event.stopPropagation();
if (event.target.value.length > 0) {
setValue([...value, event.target.value]);
}
break;
}
default:
}
};
return (
<div style={{ width: 500 }}>
<Autocomplete
multiple
freeSolo
id="tags-outlined"
options={top100Films}
getOptionLabel={option => option.title || option}
value={value}
onChange={(event, newValue) => setValue(newValue)}
filterSelectedOptions
renderInput={params => {
params.inputProps.onKeyDown = handleKeyDown;
return (
<TextField
{...params}
variant="outlined"
label="filterSelectedOptions"
placeholder="Favorites"
margin="normal"
fullWidth
/>
);
}}
/>
</div>
);
}
// Top 100 films as rated by IMDb users. http://www.imdb.com/chart/topconst top100Films = [
{ title: "The Shawshank Redemption", year: 1994 },
{ title: "The Godfather", year: 1972 },
// ... many more options
];
Here's a Typescript version:
/* eslint-disable no-use-before-define */
import React from"react";
import TextField from"@material-ui/core/TextField";
import Autocomplete, { RenderInputParams } from"@material-ui/lab/Autocomplete";
interfaceObjectOption {
title: string;
year: number;
}
type Option = ObjectOption | string;
interfaceMyInputProps {
onKeyDown: (event: object) => void;
}
interfaceMyParamsextendsRenderInputParams {
inputProps: MyInputProps;
}
export default function Tags() {
const [value, setValue] = React.useState([top100Films[13]]);
const handleKeyDown = event => {
switch (event.key) {
case",":
case" ": {
event.preventDefault();
event.stopPropagation();
if (event.target.value.length > 0) {
setValue([...value, event.target.value]);
}
break;
}
default:
}
};
return (
<div style={{ width: 500 }}>
<Autocomplete
multiple
freeSolo
id="tags-outlined"
options={top100Films}
getOptionLabel={option => {
if (typeof option === "string") {
return option;
}
return option.title;
}}
value={value}
onChange={(event, newValue) => setValue(newValue)}
filterSelectedOptions
renderInput={(params: MyParams) => {
params.inputProps.onKeyDown = handleKeyDown;
return (
<TextField
{...params}
variant="outlined"
label="filterSelectedOptions"
placeholder="Favorites"
margin="normal"
fullWidth
/>
);
}}
/>
</div>
);
}
// Top 100 films as rated by IMDb users. http://www.imdb.com/chart/topconst top100Films: ObjectOption[] = [
{ title: "The Shawshank Redemption", year: 1994 },
{ title: "The Godfather", year: 1972 },
// ... many more options
];
Solution 2:
As answered here, just use the autoHighlight flag:
<AutocompleteautoHighlight {...} />It will highlight the first option by default, so pressing enter will select it.
Post a Comment for "Material Ui Autocomplete: Can Tags Be Created On Events Aside From 'enter' Events?"