react-query loading시와 완료시 변화 문제

홍준섭·2023년 7월 22일

react

목록 보기
28/29
const SearchInput = ()=>{
    const [keyword,setKeyword] = useState('');
    const {isLoading,isError,data,error,refetch,isSuccess} = useQuery<string[]>('keyword',()=>getKeyword(keyword),{
    enabled:false
    })
        
    const handleOnChange = debounce(async(event:React.ChangeEvent)=>{
        setKeyword((event.target as HTMLInputElement).value)
    },500)
    
    useEffect(()=>{
        if (keyword!==''){
            refetch()
        }
    },[keyword,refetch])
    
    if (isLoading) {
      return <span>Loading...</span>
    }

    if (isError) {
      return <span>Error: {(error as Error).message}</span>
    }
        
    return(
        <div>
            <input placeholder="입력해주세요" onChange={handleOnChange} autoFocus ></input>
            <div>
                {isSuccess && data.map((it)=>(
                    <Name it={it}></Name>
                ))}
            </div>
        </div>
    );
}

export default SearchInput;

이 코드를 실행하는 경우 처음에 enabled가 false로 되어있기 때문에 처음 데이터를 패치해오는경우

return(
        <div>
            <input placeholder="입력해주세요" onChange={handleOnChange} autoFocus ></input>
            <div>
                {isSuccess && data.map((it)=>(
                    <Name it={it}></Name>
                ))}
            </div>
        </div>
    );
if (isLoading) {
      return <span>Loading...</span>
    }

리턴하는 값이 이렇게 바뀌기 때문에 input이 초기화 되어 input에 들어있던 value가 사라지게 된다. 그렇기에 이러한 경우

const SearchInput = ()=>{
    const [keyword,setKeyword] = useState('');
    const {isLoading,isError,data,error,refetch,isSuccess} = useQuery<string[]>('keyword',()=>getKeyword(keyword),{
    enabled:false
    })
        
    const handleOnChange = debounce(async(event:React.ChangeEvent)=>{
        setKeyword((event.target as HTMLInputElement).value)
    },500)
    
    useEffect(()=>{
        if (keyword!==''){
            refetch()
        }
    },[keyword,refetch])
        
    return(
        <div>
            <input placeholder="입력해주세요" onChange={handleOnChange} autoFocus ></input>
            <div>
                {isLoading&&<span>Loading...</span>}
                {isError&&<span>Error: {(error as Error).message}</span>}
                {isSuccess && data.map((it)=>(
                    <Name it={it}></Name>
                ))}
            </div>
        </div>
    );
}

이런식으로 구현해준다

profile
개발 공부중입니다

1개의 댓글

comment-user-thumbnail
2023년 7월 22일

감사합니다. 이런 정보를 나눠주셔서 좋아요.

답글 달기