React Antd Select组件输入搜索时调用接口方式

 更新时间:2025年08月30日 14:23:09   作者:水果摊见  
为优化Select组件中文输入时的接口调用,使用lodash.debounce实现防抖,避免每输入一个字母即触发请求,待用户点击空格完成输入后,再调用接口获取数据,提升性能与用户体验

前言

由于接口返回较多,需要在Select组件中输入时进行调用接口并搜索,而不是初始化时把全部写入Option。

问题

当输入中文时,每打一个字母都会调用一次接口,想在中文输入完成,即点击空格后再进行接口调用

<Select
     prefix={
         <SearchOutlined
             style={{
                 color: SearchOutlinedColor?.backgroundColor,
             }}
         />
     }
     showSearch
     value={orgValue}
     placeholder={t('Input Search Text')}
     style={{ width: 250 }}
     defaultActiveFirstOption={false}
     suffixIcon={null}
     filterOption={false}
     notFoundContent={null}
     onSearch={handleOrgSearch}
     onChange={handleOrgChange}
     options={orgOptions}
     onCompositionStart={handleCompositionStart}  // 对中文的处理
     onCompositionEnd={handleCompositionEnd}
     allowClear
     onClear={() => {
         setOrgValue('');
         onOrgSearch('');
         setOrgOptions([]);
     }}
     size="small"
     variant="filled"
 />

引入lodash.debounce

const [orgValue, setOrgValue] = useState();
const [orgOptions, setOrgOptions] = useState([]);
const [isComposing, setIsComposing] = useState(false);
const searchRef = useRef(null);

// 注册debouncedRef,输入结束后再进行接口调用
const debouncedFetchOrgData = useRef(
    debounce((searchValue) => {
        fetchOrgList(searchValue, setOrgOptions);
    }, 500)
).current;

// 调用接口,获取列表,放入option中
const fetchOrgList = (value, callback) => {
    selectCenterInfo({ name: value })
        .then(result => {
            if (result.length) {
                const data = result.map((item) => ({
                    value: item.value,
                    label: `${item.label}(${item.value})`,
                }));
                callback(data);
            } else {
                callback([]);
            }
        })
        .catch(err => {
            console.log(err);
            callback([]);
        });
};

const handleOrgSearch = (newValue) => {
    searchRef.current = newValue;
    if (!isComposing) {
        debouncedFetchOrgData(newValue);
    };
};

const handleOrgChange = (newValue) => {
    setOrgValue(newValue);
    onOrgSearch(newValue);  // 这是传入组件的props, 用来把选中的值传回父组件
};

const handleCompositionStart = () => {  
    setIsComposing(true);
};

const handleCompositionEnd = (e) => {
    setIsComposing(false);
    searchRef.current = e.target.value;
    if (searchRef.current) {
        fetchOrgList(searchRef.current, setOrgOptions);
    }
};

useEffect(() => {
    return () => {
        debouncedFetchOrgData.cancel();
    };
}, [debouncedFetchOrgData]);

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • React通过父组件传递类名给子组件的实现方法

    React通过父组件传递类名给子组件的实现方法

    React 是一个用于构建用户界面的 JAVASCRIPT 库。这篇文章主要介绍了React通过父组件传递类名给子组件的方法,需要的朋友可以参考下
    2017-11-11
  • React组件二次包装的具体实现

    React组件二次包装的具体实现

    本文主要介绍了React组件二次包装的具体实现,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-02-02
  • React Router 5.1.0使用useHistory做页面跳转导航的实现

    React Router 5.1.0使用useHistory做页面跳转导航的实现

    本文主要介绍了React Router 5.1.0使用useHistory做页面跳转导航的实现,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-11-11
  • 使用VSCode Debugger调试React项目的实现步骤

    使用VSCode Debugger调试React项目的实现步骤

    本文主要介绍了使用VSCode Debugger调试React项目的实现步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-09-09
  • React中state属性案例详解

    React中state属性案例详解

    在React中,state 是一个用于存储组件内部数据的特殊对象,每个React组件都可以包含自己的state,我们往往是通过修改state的值来驱动React重新渲染组件,这篇文章主要介绍了React中state属性,需要的朋友可以参考下
    2023-11-11
  • React split实现分割字符串的使用示例

    React split实现分割字符串的使用示例

    当我们需要将一个字符串按照指定的分隔符进行分割成数组时,我们可以在组件的生命周期方法中使用split方法来实现这个功能,本文就来介绍一下,感兴趣的可以了解下
    2023-10-10
  • 详解如何给React-Router添加路由页面切换时的过渡动画

    详解如何给React-Router添加路由页面切换时的过渡动画

    这篇文章主要介绍了详解如何给React-Router添加路由页面切换时的过渡动画,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-04-04
  • React合成事件原理解析

    React合成事件原理解析

    事件是在编程时系统内发生的动作或者发生的事情,而开发者可以某种方式对事件做出回应,而这里有几个先决条件,这篇文章主要介绍了React合成事件原理解析,需要的朋友可以参考下
    2022-07-07
  • React构建简洁强大可扩展的前端项目架构

    React构建简洁强大可扩展的前端项目架构

    这篇文章主要为大家介绍了React构建简洁强大可扩展的前端项目架构实现,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-08-08
  • 使用React18和WebSocket构建实时通信功能详解

    使用React18和WebSocket构建实时通信功能详解

    WebSocket是一种在Web应用中实现双向通信的协议,它允许服务器主动向客户端推送数据,而不需要客户端发起请求,本文将探索如何在React 18应用中使用WebSocket来实现实时通信,感兴趣的可以了解下
    2024-01-01

最新评论