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

如何为MUI Data Grid预定义筛选值添加自动补全选项

MUI Data Grid 实现筛选输入框动态提示

要实现筛选输入框的动态提示(输入关键词后显示匹配选项),仅靠静态的valueOptions和type属性是不够的,需要结合自定义筛选输入组件来实现。以下是具体方案:

1. 配置列的筛选规则

在目标列(比如「城市」列)的配置中,自定义筛选操作并指定输入组件:

const columns = [
  {
    field: 'city',
    headerName: '城市',
    width: 150,
    filterable: true,
    // 自定义筛选操作,替换默认的筛选逻辑
    filterOperators: [
      {
        label: '包含',
        value: 'contains',
        // 定义筛选匹配逻辑
        getApplyFilterFn: (filterItem) => {
          return (row) =>
            row.city?.toLowerCase().includes(filterItem.value?.toLowerCase() || '');
        },
        // 指定自定义的筛选输入组件
        InputComponent: CityFilterAutocomplete,
      },
    ],
  },
  // 其他列配置...
];

2. 实现带动态提示的筛选输入组件

使用MUI的Autocomplete组件封装筛选输入框,支持输入关键词时显示匹配选项:

import { Autocomplete, TextField } from '@mui/material';
import { useState } from 'react';

// 示例城市列表,实际可替换为后端接口数据
const allCities = ['New Orleans', 'New York', 'Los Angeles', 'Chicago', 'New Jersey'];

function CityFilterAutocomplete(props) {
  const { item, onChange } = props;

  const handleSelect = (_, newValue) => {
    // 更新筛选值
    onChange({ ...item, value: newValue });
  };

  return (
    <Autocomplete
      freeSolo // 允许输入非选项内的内容
      options={allCities}
      renderInput={(params) => (
        <TextField
          {...params}
          label="搜索城市"
          variant="outlined"
          size="small"
        />
      )}
      value={item.value || ''}
      onChange={handleSelect}
    />
  );
}

3. 适配后端动态获取选项(可选)

如果城市数据来自后端接口,可在组件中添加防抖逻辑,根据输入关键词动态拉取匹配数据:

import { Autocomplete, TextField } from '@mui/material';
import { useState, useEffect } from 'react';

function CityFilterAutocomplete(props) {
  const { item, onChange } = props;
  const [cities, setCities] = useState([]);
  const [inputValue, setInputValue] = useState(item.value || '');

  useEffect(() => {
    // 防抖:输入停止300ms后再请求接口
    const timer = setTimeout(async () => {
      if (!inputValue) {
        setCities([]);
        return;
      }
      // 替换为你的后端接口地址
      const res = await fetch(`/api/cities?keyword=${inputValue}`);
      const data = await res.json();
      setCities(data);
    }, 300);

    return () => clearTimeout(timer);
  }, [inputValue]);

  const handleSelect = (_, newValue) => {
    onChange({ ...item, value: newValue });
  };

  const handleInputChange = (_, newInputValue) => {
    setInputValue(newInputValue);
  };

  return (
    <Autocomplete
      freeSolo
      options={cities}
      renderInput={(params) => (
        <TextField
          {...params}
          label="搜索城市"
          variant="outlined"
          size="small"
        />
      )}
      value={item.value || ''}
      onChange={handleSelect}
      inputValue={inputValue}
      onInputChange={handleInputChange}
    />
  );
}

为什么之前的配置不生效?

  • 静态valueOptions配合type: 'singleSelect'仅会生成下拉选择框,不支持输入实时筛选提示
  • 默认的筛选输入组件没有内置Autocomplete功能,必须自定义输入组件才能实现动态提示

内容的提问来源于stack exchange,提问作者Pulipati N

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 06:55:27