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

React DebounceInput无法读取键盘输入 用户列表未按搜索词过滤

故障根因
  • 搜索关键词状态仅在Main组件中定义,未和用户列表过滤逻辑关联,整套过滤代码完全缺失
  • UsersContext仅存储了原始全量用户数据,未提供过滤后的数据
  • UsersList组件直接渲染全量用户数据,未接入任何过滤规则
修复方案

1. 修改Users上下文,增加搜索状态和过滤逻辑

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

type Person = {
    name:string;
    username:string;
}
type UsersContextType = {
  filteredUsers: Person[];
  setSearchKey: (key: string) => void;
}

// 调整上下文类型
export const UsersContext = React.createContext<UsersContextType>({
  filteredUsers: [],
  setSearchKey: () => {}
});

const UsersProvider:React.FC= ({children}) => {
    const [users, setUsers] = useState<Person[]>([]); 
    // 新增搜索关键词状态
    const [searchKey, setSearchKey] = useState('');
    // 计算过滤后的用户列表
    const filteredUsers = useMemo(() => {
      if (!searchKey.trim()) return users;
      const lowerKey = searchKey.toLowerCase();
      return users.filter(user => 
        user.name.toLowerCase().includes(lowerKey) 
        || user.username.toLowerCase().includes(lowerKey)
      )
    }, [users, searchKey])

    useEffect(() => {
        axios
        .get(`https://jsonplaceholder.typicode.com/users`)
        .then((response) =>{
            setUsers(response.data);
        })
        .catch((error) => {
            console.log(error);
        });
    },[]);

    return (
        <UsersContext.Provider value={{filteredUsers, setSearchKey}}>
            {children}
        </UsersContext.Provider>
            
    )
}
export default UsersProvider;

2. 修改UsersList组件,读取过滤后的用户数据

import {useContext} from 'react';
import {UsersContext} from '../../contexts/Users'

type Person = {
    name:string;
    username:string;
}
const UsersList: React.FC = () => {
    // 从上下文拿过滤后的用户
    const {filteredUsers} = useContext(UsersContext);

    return(
        <div className="ListHead"> 
            <ol className="list">
                {filteredUsers.map((person) => (
                    <li key={person.name}>
                        <span>{person.name}</span>
                        @{person.username}
                    </li>
            ))}
            </ol>
        </div>
    )}
export default UsersList;

3. 修改Debounce组件,关联上下文的搜索状态更新方法

import {useContext} from 'react';
import {DebounceInput} from 'react-debounce-input';
import {UsersContext} from '../../contexts/Users';

const Debounce:React.FC = () => {
  const {setSearchKey} = useContext(UsersContext);
  return(
        <DebounceInput
          onChange={(e) => setSearchKey(e.target.value)}             
          debounceTimeout={500}                 
          className="SearchInput"                  
          placeholder="Search by user name..."                  
        />      
  )
}
export default Debounce

4. 简化Main组件代码

const Main:React.FC= () => {
    return (
    <div>
        <div>
             <Header/>
        </div>
            <UsersProvider>
                <UsersList />
                <Debounce />
            </UsersProvider>
        </div>
    )
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.19 21:45:05