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

React如何将点击触发的搜索改为实时输入搜索?如何使用filter?

实时搜索功能改造需求

我正在尝试实现实时搜索功能,以及用户数据的实时自动填充。

我的页面当前效果如下:
页面当前实际效果

目前我的搜索功能需要点击搜索图标才会展示结果,因此我希望将其修改为实时搜索:当我在输入框输入姓名时,会自动为我展示匹配的用户卡片。

以下是我的SearchForMembers.js代码:

const SearchForMembers = ({ teamId, fetchTeamData }) => {
  // State
  const [userResults, setUserResults] = useState([]);
  const [userSkillResults, setUsersSkillsResults] = useState([]);

  const [showResultsList, setShowResultsList] = useState(false);
  const [showResultsMsg, toggleResultsMsg] = useState(false);

  // Submit search query
  const searchForTerm = async (term) => {
    try {
      if (term !== undefined) {
        // Clear results
        setUserResults([]);
        setUsersSkillsResults([]);
        // Perform search
        const res = await axios.get(`/api/v1/search/users/${term}`);
        // Check response
        // Show message if no results were found
        if (res.data[0].length === 0 && res.data[1].length === 0) {
          toggleResultsMsg(true);
        } else {
          toggleResultsMsg(false);
          // Set users results
          setUserResults(res.data[0]);
          // Set skills results
          setUsersSkillsResults(res.data[1]);
        }
      }
    } catch (err) {
      throw new Error(err);
    }
  };

  useEffect(() => {
    if (userResults.length > 0 || userSkillResults.length > 0) {
      setShowResultsList(true);
    } else {
      setShowResultsList(false);
    }
  }, [userResults, userSkillResults]);

  return (
    <div className="container--search_for_members">
      {/* Search bar */}
      <SearchBar
        linkToPage={false}
        searchForTerm={searchForTerm}
        placeHolderText="Search for a name, skill or affiliation"
      />
      {/* Results list */}
      {showResultsList && (
        <SearchForMembersResults
          usersFound={userResults}
          userSkillResults={userSkillResults}
          teamId={teamId}
          fetchTeamData={fetchTeamData}
        />
      )}
      {showResultsMsg && (
        <>
          <p className="text--message-small">No results were found</p>
          <AddNewProfile
            teamId={teamId}
            fetchTeamData={fetchTeamData}
            variant="not in table"
          />
        </>
      )}
    </div>
  );
};

以下是我的SearchBar.js代码:

const SearchBar = ({
  linktoPage,
  searchForTerm,
  placeHolderText = "Search members or teams",
}) => {
  // Search state
  const [searchTerm, setSearchTerm] = useState("");

  const handleChange = (event) => {
    // Update state with input text
    event.preventDefault();
    setSearchTerm(event.target.value);
  };

  const handleSubmit = async (event) => {
    try {
      event.preventDefault();

      if (linktoPage) {
        // Go to page and pass query
        goToPage();
      } else {
        // Don't change pages, but pass term to search method
        searchForTerm(searchTerm);
      }
    } catch (err) {
      throw new Error(err);
    }
  };

  const goToPage = () => {
    // Go to search page and pass along the search term.
    Router.push({
      pathname: "/search",
      query: { term: `${searchTerm}` },
    });
  };

  return (
    <form className="form--search_wrapper" method="GET" onSubmit={handleSubmit}>
      <input
        className="input input--search_input"
        type="search"
        name="q"
        placeholder={placeHolderText}
        aria-label="Search bar"
        onInput={handleChange}
        pattern="^[a-zA-Z0-9 ]+"
        required
      />
      <Button 
        className="input input--search" 
        style={{ color: "white", backgroundColor: "#00B790" }} 
        type="submit" 
      >
        <SearchRoundedIcon />
      </Button>
    </form>
  );
};

我参考了相关使用Axios实现实时搜索的教程,现在的疑问是:如何在现有代码基础上使用 .filter 方法实现实时搜索需求?

内容的提问来源于stack exchange,提问作者Nathan Nguyen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.29 14:15:02