当前位置:首页 > React

使用react实现input搜索

2026-01-27 19:38:10React

实现React Input搜索功能

在React中实现一个输入框搜索功能,通常需要结合状态管理和事件处理。以下是一个完整的实现方案:

基础实现

创建一个受控组件来管理输入状态:

import React, { useState } from 'react';

function SearchInput() {
  const [searchTerm, setSearchTerm] = useState('');

  const handleSearch = (e) => {
    setSearchTerm(e.target.value);
    // 这里可以添加搜索逻辑或API调用
  };

  return (
    <div>
      <input
        type="text"
        value={searchTerm}
        onChange={handleSearch}
        placeholder="搜索..."
      />
    </div>
  );
}

export default SearchInput;

添加防抖优化

为防止频繁触发搜索请求,可以使用防抖技术:

import React, { useState, useEffect } from 'react';

function DebouncedSearchInput() {
  const [searchTerm, setSearchTerm] = useState('');
  const [debouncedTerm, setDebouncedTerm] = useState('');

  useEffect(() => {
    const timerId = setTimeout(() => {
      setDebouncedTerm(searchTerm);
    }, 500);

    return () => {
      clearTimeout(timerId);
    };
  }, [searchTerm]);

  useEffect(() => {
    if (debouncedTerm) {
      // 执行搜索逻辑
      console.log('搜索:', debouncedTerm);
    }
  }, [debouncedTerm]);

  return (
    <input
      type="text"
      value={searchTerm}
      onChange={(e) => setSearchTerm(e.target.value)}
      placeholder="搜索..."
    />
  );
}

完整搜索组件示例

结合搜索结果展示的完整组件:

import React, { useState, useEffect } from 'react';

function SearchComponent() {
  const [query, setQuery] = useState('');
  const [results, setResults] = useState([]);
  const [isSearching, setIsSearching] = useState(false);

  const searchItems = async (searchTerm) => {
    if (!searchTerm) {
      setResults([]);
      return;
    }

    setIsSearching(true);
    try {
      // 这里替换为实际的API调用
      const response = await fetch(`/api/search?q=${searchTerm}`);
      const data = await response.json();
      setResults(data);
    } catch (error) {
      console.error('搜索出错:', error);
    } finally {
      setIsSearching(false);
    }
  };

  useEffect(() => {
    const timerId = setTimeout(() => {
      searchItems(query);
    }, 500);

    return () => {
      clearTimeout(timerId);
    };
  }, [query]);

  return (
    <div>
      <input
        type="text"
        value={query}
        onChange={(e) => setQuery(e.target.value)}
        placeholder="搜索..."
      />

      {isSearching && <div>搜索中...</div>}

      <ul>
        {results.map((item) => (
          <li key={item.id}>{item.name}</li>
        ))}
      </ul>
    </div>
  );
}

使用自定义Hook封装

可以将搜索逻辑封装为自定义Hook以便复用:

使用react实现input搜索

import { useState, useEffect } from 'react';

function useSearch(searchFunction, delay = 500) {
  const [query, setQuery] = useState('');
  const [results, setResults] = useState(null);
  const [isSearching, setIsSearching] = useState(false);

  useEffect(() => {
    const handler = setTimeout(() => {
      if (query.trim()) {
        setIsSearching(true);
        searchFunction(query)
          .then(setResults)
          .finally(() => setIsSearching(false));
      } else {
        setResults(null);
      }
    }, delay);

    return () => {
      clearTimeout(handler);
    };
  }, [query, searchFunction, delay]);

  return [query, setQuery, results, isSearching];
}

// 使用示例
function SearchComponent() {
  const [query, setQuery, results, isSearching] = useSearch(async (q) => {
    const response = await fetch(`/api/search?q=${q}`);
    return response.json();
  });

  return (
    <div>
      <input
        value={query}
        onChange={(e) => setQuery(e.target.value)}
        placeholder="搜索..."
      />
      {/* 渲染结果 */}
    </div>
  );
}

这些实现方案涵盖了从基础到高级的React搜索输入功能,可以根据具体需求选择适合的方案或进行组合使用。

标签: reactinput
分享给朋友:

相关文章

vue 实现 input focus

vue 实现 input focus

实现 Input Focus 的方法 在 Vue 中实现 input 元素的聚焦可以通过以下几种方式完成。 使用 ref 和 $refs 通过 ref 属性标记 input 元素,然后在 Vue 实…

react中monent如何获取日期

react中monent如何获取日期

使用 Moment.js 获取当前日期 在 React 中通过 Moment.js 获取当前日期,可以直接调用 moment() 函数。它会返回包含当前日期和时间的 Moment 对象。 impor…

如何改造react

如何改造react

改造 React 项目的关键方法 分析当前项目结构 通过评估现有组件、状态管理和依赖项,明确需要改进的部分。使用工具如 webpack-bundle-analyzer 识别性能瓶颈。 升级 Reac…

react如何调试

react如何调试

调试 React 应用的方法 使用 React Developer Tools React Developer Tools 是 Chrome 和 Firefox 的浏览器扩展,可以检查组件树、状态和…

如何同步react

如何同步react

同步React组件状态的方法 使用useState和useEffect钩子组合可以同步React组件的状态。useState用于声明状态变量,useEffect用于监听状态变化并执行副作用。 imp…

如何配置react

如何配置react

配置React项目的步骤 安装Node.js和npm 确保系统已安装Node.js(包含npm)。可通过官网下载并安装最新版本。安装完成后,运行以下命令验证版本: node -v npm -v 创建…