React搜索框组件

题目要求

实现一个search input组件,用户输入任意内容后自动触发关键词api搜索需求:搜索不频繁触发,结果响应及时

解答

下面仅给出React中防抖的实现,竞态请求的问题可以使用AbortController

javascript 复制代码
import { useState, useRef, useCallback, useEffect } from "react";

const fetchApi = (input) => {
  console.log(`fetch ${input}...`);
};

const useDebounce = function (fun, timeout) {
  const timerRef = useRef(null);
  const funRef = useRef(fun);
  funRef.current = fun;

  return useCallback(
    function (...args) {
      clearTimeout(timerRef.current);
      timerRef.current = setTimeout(() => {
        funRef.current.apply(this, args);
      }, timeout);
    },
    [timeout]
  );
};

export default function SearchInput() {
  const [value, setValue] = useState("");

  const search = useDebounce(fetchApi, 1000);

  const handleChange = (e) => {
    setValue(e.target.value);
    search(e.target.value);
  };

  return <input value={value} onChange={handleChange} />;
}

codesandbox链接:https://codesandbox.io/p/sandbox/ftgm5k

相关推荐
AI_零食10 小时前
番茄钟鸿蒙PC Electron框架完成:状态机、定时器管理与专注力工具设计
前端·javascript·华为·electron·开源·鸿蒙·鸿蒙系统
提子拌饭13310 小时前
逛三园游戏——基于鸿蒙PC Electron框架实现
前端·javascript·游戏·华为·electron·鸿蒙
llz_11210 小时前
web-第三次课后作业
前端·后端·web
遗憾随她而去.10 小时前
Web地图全体系深度梳理:引擎、数据源、图层、投影核心知识
前端
爱因斯坦乐11 小时前
Vue项目整合
前端·javascript·vue.js
FlyWIHTSKY11 小时前
TS、TSX、JS、JSX 文件扩展名详解
开发语言·javascript·ecmascript
无风听海11 小时前
IndexedDB 深度指南 浏览器中的事务型对象数据库
前端·数据库
ct97812 小时前
组件间的通信
前端·javascript·vue.js
左手吻左脸。12 小时前
Vue 全栈面试题大全(2026 最新版最详细)
前端·javascript·vue.js
Aphasia31112 小时前
手写KeepAlive组件
前端·react.js·面试