You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MUI v5 Autocomplete自定义选项选中后文本框不显示选中值问题

问题根因

MUI Autocomplete 组件的 value 属性类型需要和 options 数组的元素类型保持一致:你当前的options 是包含title、id的对象数组,但给value传的是数字类型的id,getOptionLabel 接收的入参实际是你传入的数字id,而非匹配到的选项对象,因此无法读取title字段渲染显示内容,isOptionEqualToValue仅用于下拉列表内的选项高亮匹配,不负责输入框的显示内容逻辑。

解决方案

这里提供两种可行实现方式,你可以根据业务需求选择:

方案1:state存储完整选项对象(更推荐,符合组件原生设计)

如果没有强制要求state仅存id,优先选择这种方案,逻辑更简洁,需要使用id时直接取movie.id即可:

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

export default function ComboBox() {
  // 初始值直接取id为2的选项对象
  const [movie, setMovie] = React.useState(top100Films.find(item => item.id === 2));

  return (
    <>
      Movie ID value in the state {movie?.id}
      <Autocomplete
        disablePortal
        id="combo-box-demo"
        // 直接传完整对象作为value
        value={movie}
        options={top100Films}
        onChange={(e, data) => {
          // 选中时存储完整选项对象
          setMovie(data);
        }}
        getOptionLabel={(option) => option.title || ""}
        sx={{ width: 300 }}
        renderInput={(params) => <TextField {...params} label="Movie" />}
        isOptionEqualToValue={(option, value) => option.id === value.id}
      />
    </>
  );
}

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

方案2:state仅存储id,手动映射匹配选项

如果业务要求state只能存id,可以根据当前id从options数组中匹配到对应的对象传给value属性:

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

export default function ComboBox() {
  const [movieId, setMovieId] = React.useState(2);
  // 手动根据id匹配对应的选项对象
  const matchedMovie = top100Films.find(item => item.id === movieId) || null;

  return (
    <>
      Movie ID value in the state {movieId}
      <Autocomplete
        disablePortal
        id="combo-box-demo"
        // 传匹配到的对象作为value
        value={matchedMovie}
        options={top100Films}
        onChange={(e, data) => {
          if (data?.id) {
            setMovieId(data.id);
          }
        }}
        getOptionLabel={(option) => option.title || ""}
        sx={{ width: 300 }}
        renderInput={(params) => <TextField {...params} label="Movie" />}
        isOptionEqualToValue={(option, value) => option.id === value.id}
      />
    </>
  );
}

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

内容的提问来源于stack exchange,提问作者Rahul Kumar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 19:39:03