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

MUI Autocomplete如何获取过滤选项数组?实现选项分隔线(除最后项)

解决MUI Autocomplete选项间添加分隔线(排除最后一项)的问题

方法一:通过renderOption结合索引判断

在Autocomplete组件的renderOption回调中,利用参数里的index,结合filteredOptions数组的长度判断是否渲染分隔线。filteredOptions是组件自动生成的过滤后选项数组,可直接从Autocomplete的props中获取:

<Autocomplete
  options={yourOptions}
  getOptionLabel={(option) => option.label}
  renderOption={(props, option, { index }) => (
    <>
      <li {...props}>
        {option.label}
      </li>
      {/* 仅非最后一项显示分隔线 */}
      {index !== filteredOptions.length - 1 && <Divider />}
    </>
  )}
  renderInput={(params) => <TextField {...params} label="输入关键词" />}
/>

方法二:使用useAutocomplete钩子

若需要更灵活的控制逻辑,可直接使用useAutocomplete钩子,它会返回当前的filteredOptions数组,遍历选项时直接通过索引判断:

import { useAutocomplete } from '@mui/material/Autocomplete';
import TextField from '@mui/material/TextField';
import Divider from '@mui/material/Divider';

const YourComponent = () => {
  const {
    getRootProps,
    getInputProps,
    getListboxProps,
    getOptionProps,
    filteredOptions,
  } = useAutocomplete({
    options: yourOptions,
    getOptionLabel: (option) => option.label,
  });

  return (
    <div {...getRootProps()}>
      <TextField {...getInputProps()} label="输入关键词" />
      <ul {...getListboxProps()}>
        {filteredOptions.map((option, index) => (
          <li key={option.id} {...getOptionProps({ option })}>
            {option.label}
            {index !== filteredOptions.length - 1 && <Divider />}
          </li>
        ))}
      </ul>
    </div>
  );
};

方法三:CSS伪类实现(更简洁)

如果不需要复杂逻辑,直接用CSS伪类给除最后一项外的选项添加底部边框,替代Divider组件,代码更简洁:

/* 给Autocomplete列表项加底部边框,最后一项除外 */
.MuiAutocomplete-listbox li:not(:last-child) {
  border-bottom: 1px solid rgba(0, 0, 0, 0.12);
  /* 调整间距优化视觉效果 */
  padding-bottom: 8px;
  margin-bottom: 8px;
}

内容的提问来源于stack exchange,提问作者coding-guy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 15:25:20