반응형
목록 추가 (POST) 및 수정 (PUT) 테스트
(참고한 페이지 : https://tanstack.com/query/v4/docs/react/examples/react/optimistic-updates-typescript)
import styles from './styles.module.scss';
import React, { useState } from 'react';
import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query';
import axios from 'axios';
export default function Study() {
const queryClient = useQueryClient();
interface AddList {
id: number;
name: string;
country?: string;
}
const [addCompanyName, setAddCompanyName] = useState<string>('');
const [addCountryName, setAddCountryName] = useState<string>('');
const [companyList, setCompanyList] = useState<[]>([]);
async function getCompanyList() {
const { data } = await axios.get(`http://localhost:5000/company`);
return data;
}
const {
data: dataCompanyList,
isLoading: companyLoading,
isError: companyError,
isSuccess: companySuccess,
} = useQuery({
queryKey: ['companyList', companyList],
queryFn: () => getCompanyList(),
});
// post
const addList = useMutation({
mutationFn: () =>
axios.post<AddList>('http://localhost:5000/company', {
id: dataCompanyList ? dataCompanyList.length + 1 : 0,
name: addCompanyName,
country: addCountryName,
}),
// Always refetch after error or success:
onSettled: () => {
// 목록 재호출 (get)
queryClient.invalidateQueries({ queryKey: ['companyList'] });
},
});
// put
const modifyList = useMutation({
mutationFn: (number: number) =>
axios.put<AddList>('http://localhost:5000/company/' + (number + 1), {
id: number,
name: addCompanyName,
country: addCountryName,
}),
onMutate: () => {
//mutation 함수가 실행되기 전에 실행되고 mutation 함수가 받을 동일한 변수가 전달된다.
//optimistic update 사용 시 유용한 함수이다.
},
onSuccess: () => {
//mutation 이 성공하고 결과를 전달할 때 실행된다.
},
onError: () => {
//mutation 이 error 를 만났을 때 실행된다.
},
onSettled: () => {
//mutation 이 성공해서 성공한 데이터 또는 error가 전달될 때 실행된다.
//(성공하든 실패하든 결과가 전달된다)
// 목록 재호출 (get)
queryClient.invalidateQueries({ queryKey: ['companyList'] });
},
});
if (companyLoading) {
return <p>회사 목록 로딩중</p>;
}
if (companyError) {
return <p>회사 목록 에러 발생</p>;
}
return (
<div className={styles.study}>
<div>
<div>
<input
type="text"
onChange={event => setAddCompanyName(event.target.value)}
/>
<input
type="text"
onChange={event => setAddCountryName(event.target.value)}
/>
<button type="button" onClick={() => addList.mutate()}>
회사 추가
</button>
<button type="button" onClick={() => modifyList.mutate(1)}>
2번 회사 수정
</button>
<div>
<ul>
{dataCompanyList.map(company => {
return (
<li key={company.id}>
{company.name} - {company.country}
</li>
);
})}
</ul>
</div>
</div>
</div>
</div>
);
}
'Front-end 개발 > JAVASCRIPT' 카테고리의 다른 글
HTML문서 소스에서 원하는 HTML만 추출하는 기능 테스트 (DOMParser, parser.parseFromString 활용) (0) | 2023.01.11 |
---|---|
jotai 유틸 atomWithStorage 활용하여 session storage 적용 테스트 (0) | 2023.01.11 |
react-query 목록 호출 (GET) 및 재 호출 테스트 (0) | 2023.01.11 |
Delete `␍` prettier/prettier 에러 발생 시 eslintrc.json 수정 (0) | 2023.01.11 |
개발자 도구 console warning 비 노출 처리 (ES6 + typescript 사용 중일 경우) (0) | 2023.01.11 |