Reactjs

React-Query useQuery 사용법

DevilFront 2024. 12. 13. 14:48
반응형

React-Qquery의 useQuery의 기본적인 사용법에 대해 직접 적용해보면서 쓴 방법들에 대해 작성해보겠다. 

현재 새로진행중인 프로젝트에서 React-Query를 적용시켜보고 싶어서 처음 api 연동 페이지가 필요한 페이지에서 테스트를 해 보았다.  

 

 

 

 

interface Geo {
    lat: string;
    lng: string;
}

interface Address {
    street: string;
    suite: string;
    city: string;
    zipcode: string;
    geo: Geo;
}

interface Company {
    name: string;
    catchPhrase: string;
    bs: string;
}

interface User {
    id: number;
    name: string;
    username: string;
    email: string;
    address: Address;
    phone: string;
    website: string;
    company: Company;
}

const AdvertiseFilter = () => {

    const [advertiseFilterStatus, setAdvertiseFilterStatus] = useRecoilState(advertiseStatusFilterAtom);
    const [advertiseTempName, setAdvertiseTempName] = useState<string | undefined>(undefined);
    const [advertiseName, setAdvertiseName] = useRecoilState(advertiseNameAtom);


    const getUsers = async (): Promise<User[]> => {
        const { data } = await axios.get('https://jsonplaceholder.typicode.com/users');
        return data;
    };

    const useUsers = () => {
        return useQuery<User[], Error>(
            ['users'],  // queryKey로 unique 해야함
            getUsers, // 비동기 데이터 호출 함수  
            {
                onSuccess: (response) => {
                    console.log('success =', response);
                },
                onError: (error) => {
                    console.error('onError ->', error.message);
                },
                staleTime: 10 * 60 * 1000, // 데이터 유효시간 관련 옵션
            }
        );
    };

	const { data: users, isLoading, isError, error, refetch } = useUsers();

    const handleChange = (value: string) => {
        setAdvertiseFilterStatus(value);
    };

    const handleInputChange = (value: string) => {
        setAdvertiseTempName(value);
    }

    const onClickSearch = () => {
        setAdvertiseName(advertiseTempName)
        
    }





    return (
        <div className={'flex items-center mt-6'}>
            <Select
                defaultValue={advertiseFilterStatus}
                style={{width: 140, marginRight: '2rem'}}
                onChange={handleChange}
                options={[
                    {value: 'all', label: '상태'},
                    {value: 'on', label: '활성'},
                    {value: 'off', label: '비활성'},
                ]}
            />

            <Input placeholder="광고주명" prefix={<UserOutlined/>} style={{maxWidth: '200px', height: '30px', marginRight:'2rem'}}
                   onChange={(e: any) => handleInputChange(e.value)}/>

            <Button onClick={onClickSearch} type={'primary'}>검색</Button>
        </div>
    )
}

 

 

해당 인터페이스 타입은 jsonPlaceHolder users를 호출했을 때 떨어지는 response들에 대한 정의이며 

 

실제 사용법을 보면 간단하다.

 

1. api 호출 함수 

2. queryKey 생성

3. 필요한 옵션들 추가

4. 라이브러리 규칙에 맞게 세팅

 

    const getUsers = async (): Promise<User[]> => {
        const { data } = await axios.get('https://jsonplaceholder.typicode.com/users');
        return data;
    };

    const useUsers = () => {
        return useQuery<User[], Error>(
            ['users'],  // queryKey로 unique 해야함
            getUsers, // 비동기 데이터 호출 함수  
            {
                onSuccess: (response) => {
                    console.log('success =', response);
                },
                onError: (error) => {
                    console.error('onError ->', error.message);
                },
                staleTime: 10 * 60 * 1000, // 데이터 유효시간 관련 옵션
            }
        );
    };
    
    const { data: users, isLoading, isError, error, refetch } = useUsers();

 

 

 

추가적으로 인자를 전달해서 api 요청을 해야 할 때 

 

 

const getUsers = async (name?:string): Promise<User[]> => {
        const { data } = await axios.get('https://jsonplaceholder.typicode.com/users', {
            params:{
                name:name,
                data:'123'
            }
        });
        return data;
    };

    const useUsers = (name?:string) => {
        return useQuery<User[], Error>(
            ['users', name],
            () => getUsers(name),
            {
                onSuccess: (response) => {
                    console.log('success =', response);
                },
                onError: (error) => {
                    console.error('onError ->', error.message);
                },
                staleTime: 10 * 60 * 1000,
            }
        );
    };
    
    const { data: users, isLoading, isError, error, refetch } = useUsers('James');

 

 

이런식으로 하면 되겠다.

 

1. queryKey에 함께 인자 정의

2. api 호출 함수에 전달 및 사용

 

예시를 위해 아무 문자열이나 넣어서 사용해보았는데 만약 인자로 전달 할 값이 상태값으로 관리 되어지고 있으면 첫 번쨰 방식에서 상태값 조건처리를 통해 api 요청 함수 부분만 수정해서 사용해도 된다. 

 

 

다음에 useMutation 사용해야 될 때 한번 더 정리 할 예정이다.

반응형