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

Ant Design AutoComplete组件实现求助:输入值关联与选项展示问题

嘿,我帮你捋清楚怎么解决这个AntD AutoComplete的问题~其实核心就是把用户的输入和你的筛选逻辑绑定起来,再把过滤后的结果传给组件就行,一步步来:

第一步:添加状态管理用户输入

首先你需要一个状态来保存用户实时输入的内容,这样才能动态筛选数据。用useState新增一个状态:

const [inputValue, setInputValue] = useState('');

第二步:监听输入变化,更新状态

接下来要给输入框绑定onChange事件,把用户输入同步到刚才的状态里。我们可以写一个处理函数:

const handleInputChange = (e) => {
  setInputValue(e.target.value);
};

第三步:优化筛选逻辑,关联用户输入

原来的筛选用了固定文本,现在改成用inputValue。而且为了避免每次渲染都重复过滤数据,建议用useMemo来缓存结果,只有当数据源proceds或者输入值inputValue变化时才重新计算:

const filteredProceds = useMemo(() => {
  // 如果输入为空,返回空数组避免不必要的过滤
  if (!inputValue.trim()) return [];
  return proceds.filter(proced => 
    proced.terminologia.toLowerCase().includes(inputValue.toLowerCase())
  );
}, [proceds, inputValue]);

第四步:把筛选结果传给AutoComplete组件

AntD的AutoComplete支持两种方式展示选项:一种是通过options属性传入格式化后的数组,另一种是直接渲染AutoComplete.Option子组件。两种方式都可以,选你习惯的:

方式一:用options属性

const Complete = () => (
  <AutoComplete
    style={{ width: 120 }}
    dropdownMenuStyle={{ maxHeight: 1000, overflowY: 'auto' }}
    onChange={handleChange}
    // 把过滤后的结果格式化成组件需要的结构:每个项要有label(显示文本)和value(选中后的值)
    options={filteredProceds.map(proced => ({
      label: proced.terminologia,
      value: proced.terminologia // 也可以用proced的ID,看你业务需求
    }))}
  >
    {/* 绑定输入变化的处理函数 */}
    <Input onChange={handleInputChange} placeholder="搜索术语" />
  </AutoComplete>
);

方式二:渲染Option子组件

const Complete = () => (
  <AutoComplete
    style={{ width: 120 }}
    dropdownMenuStyle={{ maxHeight: 1000, overflowY: 'auto' }}
    onChange={handleChange}
  >
    <Input onChange={handleInputChange} placeholder="搜索术语" />
    {/* 遍历过滤后的结果,生成Option组件 */}
    {filteredProceds.map(proced => (
      <AutoComplete.Option key={proced.id} value={proced.terminologia}>
        {proced.terminologia}
      </AutoComplete.Option>
    ))}
  </AutoComplete>
);

完整代码整合

把所有部分拼起来,最终代码大概是这样:

import { useState, useEffect, useMemo } from 'react';
import { AutoComplete, Input } from 'antd';
import axios from 'axios';

const YourComponent = () => {
  const [proceds, setProceds] = useState([]);
  const [inputValue, setInputValue] = useState('');

  // 加载初始数据
  useEffect(() => {
    const loadProceds = async () => {
      const res = await axios.get('myapi_url');
      setProceds([...res.data]);
    };
    loadProceds();
  }, []);

  // 处理输入变化
  const handleInputChange = (e) => {
    setInputValue(e.target.value);
  };

  // 处理选项选中
  const handleChange = (value) => {
    console.log(`selected ${value}`);
  };

  // 动态筛选数据
  const filteredProceds = useMemo(() => {
    if (!inputValue.trim()) return [];
    return proceds.filter(proced => 
      proced.terminologia.toLowerCase().includes(inputValue.toLowerCase())
    );
  }, [proceds, inputValue]);

  const Complete = () => (
    <AutoComplete
      style={{ width: 120 }}
      dropdownMenuStyle={{ maxHeight: 1000, overflowY: 'auto' }}
      onChange={handleChange}
      options={filteredProceds.map(proced => ({
        label: proced.terminologia,
        value: proced.terminologia
      }))}
    >
      <Input onChange={handleInputChange} placeholder="搜索术语" />
    </AutoComplete>
  );

  return (
    <>
      <Complete />
    </>
  );
};

export default YourComponent;

这样一来,用户输入的时候,inputValue会实时更新,触发filteredProceds重新计算,AutoComplete就会自动展示匹配的选项啦~

内容的提问来源于stack exchange,提问作者Felipe Mateus

火山引擎 最新活动