react query
는 서버의 값을 클라이언트에 가져오거나(패치), 캐싱, 값 없데이트, 에러핸들링 등의 비동기 과정을 더욱 편하게 하는데 사용된다.
npm i @tanstack/react-query
로 모듈설치import React from 'react';
import ReactDOM from 'react-dom/client';
import App from './App';
import { ThemeProvider } from 'styled-components';
import { Theme } from './theme';
import { QueryClient, QueryClientProvider } from 'react-query';
const root = ReactDOM.createRoot(
document.getElementById('root') as HTMLElement
);
const queryClient = new QueryClient();
root.render(
<React.StrictMode>
<QueryClientProvider client={queryClient}>
<ThemeProvider theme={Theme}>
<App />
</ThemeProvider>
</QueryClientProvider>
</React.StrictMode>
);
기존에 코인을 받아오던
const response = await fetch("https:\//api.coinpaprika.com/v1/coins");
const json = await response.json();
를 api.tsx파일을
export async function fetchCoins(){
return fetch("https:\//api.coinpaprika.com/v1/coins").then(res => res.json());
}
으로 정리한다.
const [coins, setCoins] = useState<CoinInterface[]>([]);
const [loading, setLoading] = useState(true);
useEffect(() => {
//function을 바로 실행하기
(async() => {
const response = await fetch("https:\//api.coinpaprika.com/v1/coins");
const json = await response.json();
console.log(json);
setCoins(json.slice(0,100)); //100개만 자르기
setLoading(false);
})();
},[]);
단 한줄의 코드로 정리할 수 있다.
const {isLoading, data} = useQuery<ICoin[]>("allCoins", fetchCoins);
또다른 장점은 react-query는 데이터를 캐시에 저장해둔다.
cf) {isLoading: infoLoading}
처럼 객체에 이름은 부여하는 방식을 자바스크립트에서는 Destructuring Assigment(구조분해할당)라고 부른다.
더보기link
함수에 객체나 배열을 전달해야 할 경우가 생기는데, 가끔 객체나 배열에 저장된 데이터 전체가 아닌 일부만 필요한 경우가 생긴다.
이럴때 객체나 배열을 변수로 '분해'할수 있게 해주는 문법인 '구조분해할당'을 사용할 수 있다.
이외에 함수의 매개변수가 많거나, 매개변수의 기본값이 필요 한 경우에서 구조분해가 진가를 발휘할 수 있다.
< 객체 분해하기 >
기본문법
let {one, two} = {name: 'lee', age:25}
좌측에는 객체 프로퍼티의 '패턴'을, 우측에는 분해하고자 하는 객체를 넣는다.
예시
let info = {
name: 'lee',
age: 25,
height: 177
}
let {name, age, hegiht} = info;
info.name, info.age, info.height에 저장된 값이 상응한는 변수에 할당이 되고 순서는 중요하지 않다.
let {name: n, age: a, height: h} = info;
info.name을 n이라는 변수에 저장하는 식이다.
만약 프로퍼티가 없는 경우를 대비하여 = 을 사용해 기본값을 설정할 수도 있다.
let info = {
title: "Nothing",
};
let {name='kim', age='70', hegiht=188} = info;