【问题标题】:Debounce input does not read keyboard information去抖输入不读取键盘信息
【发布时间】:2021-08-13 12:04:21
【问题描述】:

我需要 DebounceInput 来从我的键盘读取信息,但是当我输入 Ervin 时,整个列表都会保留,而不仅仅是 Ervin,因为它以前可以工作。我真的不知道我哪里错了。我知道 Debounce 应该等到用户停止输入,但即使等待一分钟也没有任何改变。

这是我的文件:

去抖输入:

import {DebounceInput} from 'react-debounce-input';
type Props ={
   onChange:Function;
}
const Debounce:React.FC<Props> = ({onChange}) => {
  return(
        <DebounceInput
          onChange={(e) => onChange(e.target.value)}             
          debounceTimeout={500}                 
          className="SearchInput"                  
          placeholder="Search by user name..."                  
        />      
  )
}
export default Debounce

用户列表:

import {UsersContext} from '../../contexts/Users'
type Props = {
    filteredUsers:Array<Person>;
}
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>
    )}

用户:

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

type Users = Person[];
type Person = {
    name:string;
    username:string;
}

export const UsersContext = React.createContext<Users>([]);
const UsersProvider:React.FC= ({children}) => {
    const [users, setUsers] = useState<Person[]>([]); 
    useEffect(() => {
        axios
        .get(`https://jsonplaceholder.typicode.com/users`)
        .then((response) =>{
            setUsers(response.data);
        })
        .catch((error) => {
            console.log(error);
        });
    },[]);

    return (
        <UsersContext.Provider value={users}>
            {children}
        </UsersContext.Provider>
            
    )
}

还有主要的:

const Main:React.FC= () => {
    const [showUser, setShowUser] = useState("");
    return (
    <div>
        <div>
             <Header/>
        </div>
            <UsersProvider>
                <UsersList />
                <Debounce onChange={setShowUser}/>
            </UsersProvider>
        </div>
    )
}

【问题讨论】:

    标签: reactjs typescript input debounce


    【解决方案1】:

    您的去抖动输入除了更改showUser 状态外,不会做任何事情。由于您的用户位于 UsersProvider 中。您可以将 showUser 的值作为道具传递给 UsersProvider

    const Main:React.FC= () => {
      const [showUser, setShowUser] = useState("");
      return (
      <div>
          <div>
               <Header/>
          </div>
              <UsersProvider searchText={showUser}>
                  <UsersList />
                  <Debounce onChange={setShowUser}/>
              </UsersProvider>
          </div>
      )
    }
    

    现在在您的UsersProvider 中,您可以执行以下操作

    type UsersProviderProps = {
      children: React.ReactNode;
      searchText: string;
    }
    
    export const UsersContext = React.createContext<Users>([]);
    const UsersProvider:React.FC<UsersProviderProps>= ({children, searchText}) => {
        const [users, setUsers] = useState<Person[]>([]);
    
      useEffect(() => {
        axios
        .get(`https://jsonplaceholder.typicode.com/users`)
        .then((response) =>{
            setUsers(response.data);
        })
        .catch((error) => {
            console.log(error);
        });
    },[]);
    
    const filteredUsers = useMemo(() => {
      if(searchText.trim().length > 0 && users.length > 0){
        return users.filter((person) =>
        person.name.toLowerCase().includes(searchText.toLowerCase())
      );
      } else {
      return users;
      }
    }, [searchText, users])
    
        return (
            <UsersContext.Provider value={filteredUsers}>
                {children}
            </UsersContext.Provider>
                
        )
    }
    

    【讨论】:

    • 编辑代码使用useMemo而不是useEffect更适合这种场景
    • users.filter((Person) =&gt; Person.name.toLowerCase()) 我过滤了我认为的用户,但我不知道如何返回
    • 我必须这样做吗? searchText(filteredUsers)
    • 一切正常,天哪。非常感谢您的时间和帮助。我刚刚开始使用 React 和 Typescript 开始我的乐趣
    猜你喜欢
    • 2019-12-14
    • 1970-01-01
    • 1970-01-01
    • 2013-03-10
    • 2018-02-15
    • 1970-01-01
    • 2014-09-18
    • 2014-05-28
    • 1970-01-01
    相关资源
    最近更新 更多