Sunday, May 19, 2024
 Popular · Latest · Hot · Upcoming
110
rated 0 times [  115] [ 5]  / answers: 1 / hits: 7052  / 3 Years ago, mon, october 18, 2021, 12:00:00

I am using MUI v5 Autocomplete for my dropdown.


I have options with title and id when an option is selected, I want to store the id in the state, also want to update the select (autocomplete here) value with selected movie.


The textbox in the select is not reflecting the value set using value props.


I tried isOptionEqualToValue but it helps to highlight the value when the dropdown is open. When drop-down is closed, the selected movie name is not reflected.


https://codesandbox.io/s/combobox-material-demo-forked-osex0?file=/demo.js


import * as React from "react";
import TextField from "@mui/material/TextField";
import Autocomplete from "@mui/material/Autocomplete";

export default function ComboBox() {
const [movie, setMovie] = React.useState(2);

return (
<>
Movie ID value in the state {movie}
<Autocomplete
disablePortal
id="combo-box-demo"
value={movie == null ? "" : movie}
options={top100Films}
onChange={(e, data) => {
if (data && data.id) {
setMovie(data.id);
}
}}
getOptionLabel={(option) => option.title || ""}
sx={{ width: 300 }}
renderInput={(params) => <TextField {...params} label="Movie" />}
isOptionEqualToValue={(option, value) => option.id === value}
/>
</>
);
}

const top100Films = [
{ title: "The Shawshank Redemption", id: 1 },
{ title: "The Godfather", id: 2 },
{ title: "The Godfather: Part II", id: 3 }
];

Even when the option is selected, it is not reflecting in the textbox


Even


More From » reactjs

 Answers
0

The value prop should be one of the object in the options array if you want to use the controlled mode:


const getDefaultOption = () => top100Films.find((m) => m.id === 2) ?? null;

export default function ComboBox() {
const [movie, setMovie] = React.useState(getDefaultOption);

return (
<>
<Box mb={3}>Movie ID value in the state {movie.id}</Box>
<Autocomplete
disablePortal
id="combo-box-demo"
value={movie}
options={top100Films}
onChange={(e, data) => setMovie(data)}
getOptionLabel={(option) => option.title || ""}
sx={{ width: 300 }}
renderInput={(params) => <TextField {...params} label="Movie" />}
/>
</>
);
}

Codesandbox



[#757] Saturday, October 9, 2021, 3 Years  [reply] [flag answer]
Only authorized users can answer the question. Please sign in first, or register a free account.
domeniccolti

Total Points: 276
Total Questions: 98
Total Answers: 93

Location: India
Member since Fri, May 13, 2022
2 Years ago
domeniccolti questions
Thu, Oct 14, 21, 00:00, 3 Years ago
Thu, Jul 15, 21, 00:00, 3 Years ago
Sat, Oct 24, 20, 00:00, 4 Years ago
Thu, Sep 3, 20, 00:00, 4 Years ago
;