You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何让Material UI Autocomplete仅显示搜索相关选项?

解决Material UI Autocomplete仅显示匹配搜索词选项的问题

嘿,我懂你想要的效果——就像谷歌搜索框那样,只有输入内容后才展示匹配的选项,而不是一点击输入框就把所有选项全列出来对吧?咱们一步步来搞定这个问题:

核心问题拆解

默认情况下,Material UI的Autocomplete组件有个openOnFocus属性,它的默认值是true,这就是为什么你点击输入框时会直接展开全部选项。另外,咱们要确保组件只渲染和输入内容匹配的选项(不过默认的过滤逻辑已经帮咱们做了大部分工作,核心是控制下拉框的展开时机)。

修改后的完整代码

下面是调整后的代码,我会标注关键修改点:

import React from 'react';
import { makeStyles } from '@material-ui/core/styles';
import TextField from '@material-ui/core/TextField';
import Autocomplete from '@material-ui/lab/Autocomplete';
import Box from '@material-ui/core/Box';

const useStyles = makeStyles((theme) => ({
  root: {
    display: 'flex',
    flexWrap: 'wrap',
    flexGrow: 1,
  }
}));

const options = ['Option 1', 'Option 2'];

export default function Search(props) {
  const classes = useStyles();
  const [value, setValue] = React.useState();
  const [inputValue, setInputValue] = React.useState('');
  // 新增:手动控制下拉框的展开状态
  const [open, setOpen] = React.useState(false);

  return (
    <React.Fragment>
      <Autocomplete
        value={value}
        autoComplete={true}
        onChange={(event, newValue) => {
          setValue(newValue);
        }}
        inputValue={inputValue}
        onInputChange={(event, newInputValue) => {
          setInputValue(newInputValue);
          // 输入内容不为空时展开下拉框,为空则收起
          setOpen(newInputValue.trim() !== '');
        }}
        // 关键修改1:关闭点击输入框自动展开的默认行为
        openOnFocus={false}
        // 关键修改2:绑定手动控制的展开状态
        open={open}
        onOpen={() => {
          // 兜底处理:如果输入框为空,强制收起下拉框
          if (inputValue.trim() === '') {
            setOpen(false);
          }
        }}
        id="search"
        options={options}
        renderInput={(params) => (
          <TextField 
            {...params} 
            label="Search" 
            variant="outlined" 
            helperText="Search By: Product CI, Product Name, Common Name, Application, Competitor Product." 
          />
        )}
      />
      <Box>
        <img src="/images/searchinfo.jpg" alt="Search Info" style={{width:"100%"}}/>
      </Box>
    </React.Fragment>
  );
}

关键修改说明

  • openOnFocus={false}:直接禁用点击输入框就展开全部选项的默认行为。
  • 手动控制open状态
    • onInputChange回调里,只有当输入内容不为空时才展开下拉框,确保只显示匹配的选项;输入清空时自动收起。
    • 加上onOpen回调做兜底:如果用户通过其他方式触发展开(比如键盘快捷键),但输入框是空的,就强制收起,避免出现全部选项。

可选:自定义过滤逻辑(如果需要更精准匹配)

如果你需要更复杂的过滤规则(比如忽略大小写、多字段模糊匹配等),可以用filterOptions属性自定义:

Autocomplete
  // ...其他属性
  filterOptions={(options, state) => {
    const inputText = state.inputValue.toLowerCase();
    return options.filter(option => 
      option.toLowerCase().includes(inputText)
    );
  }}

这样就能完全按照你的需求来筛选选项啦!

内容的提问来源于stack exchange,提问作者Ravi Vishwakarma

火山引擎 最新活动