'Autocomplete - How can I set a default value?

Does anyone know how to add a default value to the Autocomplete component? The component have a dataSource, and I'd like to load the page with a specific item already selected(e.g. fill the text field with the selected item's text and it's value already set).

Does anyone knows how? Big thanks for any help <3



Solution 1:[1]

You can achieve this by setting the appropriate state in componentDidMount, for example:

componentDidMount() {
    // load your items into your autocomplete

    // set your default selected item
    this.setState({ allItems: [itemYouWantToSet], selectedItem: item.name, selectedItemId: item.id }
}

render() {
    return (
		<Autocomplete
		    value={this.state.selectedItem}
		    items={this.state.allItems}
		    getItemValue={(item) => item.name}
		    onSelect={(value, item) => {
		        this.setState({ selectedItem: value, selectedItemId: value, allItems: [item] });
		    }}
		/>
    )
}

Then your item is correctly selected from the list of available options when it loads.

Solution 2:[2]

I tried all the above solutions and nothing worked. Perhaps the API has changed since then.

I finally figured out a solution. It's not so elegant, but in principle it makes sense. In my case the options are objects. I just had to set the "value" prop using the exact item from my options array. This way componentDidMount and getOptionSelected aren't needed.

Autocomplete is wrapped inside another component in our case. This is the main code:

class CTAutoComplete extends React.PureComponent {

  getSelectedItem(){
    const item = this.props.options.find((opt)=>{
      if (opt.value == this.props.selectedValue)
        return opt;
    })
    return item || {};
  }

  render() {
    return (
        <Autocomplete
            id={this.props.id}
            className={this.props.className}
            style={{ width: '100%' }}
            options={this.props.options}
            getOptionLabel={this.props.getOptionLabel}
            renderInput={params => (
                <TextField {...params} label={this.props.label} variant="outlined" />
            )}
            onChange={this.props.onChange}
            value={this.getSelectedItem()}
        />
    );
  }
}

IMPORTANT: When setting "value", you have to make sure to put the null case " || {} ", otherwise React complains you are changing from an uncontrolled to controlled component.

Solution 3:[3]

This approach works for me (using hooks):

First of all define the options you need in a variable:

const genderOptions = [{ label: 'M' }, { label: 'V' }];

Second you can define a hook to store the selected value (for example store it in session storage for when the page refreshes, or use useState directly):

const age = useSessionStorage('age', '');

Next you can define your Autocomplete as follows (notice the default values in value and getOptionLabel, if you omit those you'll get those controlled to uncontrolled warnings):

  <Autocomplete
    id="id"
    options={ageOptions}
    getOptionLabel={option => option.label || ""}
    value={ageOptions.find(v => v.label === age[0]) || {}} // since we have objects in our options array, this needs to be a object as well
    onInputChange={(_, v) => age[1](v)}
    renderInput={params => (
      <TextField {...params} label="Leeftijd" variant="outlined" />
    )}
  />

Solution 4:[4]

you can provide the defaultValue prop for AutoComplete.

<Autocomplete
    multiple
    id="tags-outlined"
    options={this.state.categories}
    getOptionLabel={(option) => option.category_name}
    onChange={this.handleAutocomplete}
    defaultValue={'yourDefaultStringValue'} //put your default value here. It should be an object of the categories array.
    filterSelectedOptions
    renderInput={(params) => (
        <TextField
            fullWidth
            {...params}
            variant="outlined"
            label="Add Categories"
            placeholder="Category"
            required        
        />
    }
/>

Solution 5:[5]

Call your component like this

<SelectCountryAutosuggest searchText="My Default Value" />

Make sure you apply the default value to state on class load

class SelectCountryAutosuggest extends React.Component {
  state = {
    value: this.props.searchText, //apply default value instead of ''
    suggestions: [],
  };
...
}

Solution 6:[6]

It is tricky specially in case of you are using along with filter option which load API on every filter. I was able to load initial value by setting up within state and onInputChange option.

Below is code that work for me or click below link for full working demo.

https://codesandbox.io/s/smoosh-brook-xgpkq?fontsize=14&hidenavigation=1&theme=dark

import React, { useState, useEffect } from "react";
import TextField from "@material-ui/core/TextField";
import Typography from "@material-ui/core/Typography";
import Autocomplete from "@material-ui/lab/Autocomplete";

export default function CreateEditStrategy({ match }) {
  const [user, setUser] = useState({
    _id: "32778",
    name: "Magic User's Club!"
  });
  const [filter, setFilter] = useState("");
  const [users, setUsers] = useState([]);
  const [openAutoComplete, setOpenAutoComplete] = React.useState(false);

  useEffect(() => {
    (async () => {
      //Will not filter anything for testing purpose
      const response = await fetch(
        `https://api.tvmaze.com/search/shows?q=${filter}`
      );
      const shows = await response.json();

      setUsers(
        shows.map((a, i) => {
          return { _id: a.show.id, name: a.show.name };
        })
      );
    })();
  }, [filter]);
  return (
    <div>
      <Typography variant="h6">Autocomplete</Typography>
      <Autocomplete
        open={openAutoComplete}
        onOpen={() => setOpenAutoComplete(true)}
        value={user}
        inputValue={filter}
        onClose={() => setOpenAutoComplete(false)}
        onChange={(event, user) => {
          if (user) setUser(user);
          else setUser({ _id: "", name: "" });
        }}
        onInputChange={(event, newInputValue) => setFilter(newInputValue)}
        getOptionSelected={(option, value) => option.name === value.name}
        getOptionLabel={(option) => option.name}
        options={users}
        renderInput={(params) => (
          <TextField
            {...params}
            label="Asynchronous"
            variant="outlined"
            InputProps={{
              ...params.InputProps
            }}
          />
        )}
      />
    </div>
  );
}

Solution 7:[7]

You can use the searchText property.

<AutoComplete searchText="example" ... />

Solution 8:[8]

Try this...

componentWillReceiveProps(nextProps) {
    let value = nextProps.value
    if (value) {
      this.setState({
        value: value
      })
    }
  }

Solution 9:[9]

onUpdateInput worked for me - for anyone looking through all this as I was

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 mscrivo
Solution 2
Solution 3
Solution 4 Prakhar Mittal
Solution 5 CodingYourLife
Solution 6 Pritesh Patel
Solution 7 Jeff McCloud
Solution 8 Ben Ahlander
Solution 9 Josh Holland