오늘은 최신 React 패턴을 사용하여 세련된 음식 데이터베이스 관리 시스템을 구축한 방법을 공유하겠습니다. TanStack 쿼리(이전의 React 쿼리)의 기능과 Mantine의 구성 요소 라이브러리를 결합하여 원활하고 낙관적인 업데이트로 반응형 데이터 테이블을 생성하는 데 중점을 둘 것입니다.
먼저 유형과 API 구성을 정의해 보겠습니다.
// Types export type GetAllFoods = { id: number; name: string; category: string; }; export type CreateNewFoodType = Pick< GetAllFoods, | 'name' | 'category' >; // API Configuration export const API = wretch('<http://localhost:9999>').options({ credentials: 'include', mode: 'cors', headers: { 'Content-Type': 'application/json', Accept: 'application/json', }, }); // TANSTACK QUERY export const getFoodOptions = () => { return queryOptions({ queryKey: ['all-foods'], queryFn: async () => { try { return await API.get('/foods') .unauthorized(() => { console.log('Unauthorized'); }) .json<Array<GetAllFoods>>(); } catch (e) { console.log({ e }); throw e; } }, }); }; export const useGetAllFoods = () => { return useQuery({ ...getFoodOptions(), }); };
Mantine React Table을 사용하는 테이블 구성 요소:
const FoodsView = () => { const { data } = useGetAllFoods(); const columns = useMemo<MRT_ColumnDef<GetAllFoods>[]>( () => [ { accessorKey: 'id', header: 'ID', }, { accessorKey: 'name', header: 'Name', }, { accessorKey: 'category', header: 'Category', }, // ... other columns ], [] ); const table = useMantineReactTable({ columns, data: data ?? [], // Optimistic update animation mantineTableBodyCellProps: ({ row }) => ({ style: row.original.id < 0 ? { animation: 'shimmer-and-pulse 2s infinite', background: `linear-gradient( 110deg, transparent 33%, rgba(83, 109, 254, 0.2) 50%, transparent 67% )`, backgroundSize: '200% 100%', position: 'relative', } : undefined, }), }); return <MantineReactTable table={table} />; };
새로운 음식을 추가하기 위한 양식 구성 요소:
const CreateNewFood = () => { const { mutate } = useCreateNewFood(); const formInputs = [ { name: 'name', type: 'text' }, { name: 'category', type: 'text' }, ]; const form = useForm<CreateNewFoodType>({ initialValues: { name: '', category: '', // ... other fields }, }); return ( <Box mt="md"> <form onSubmit={form.onSubmit((data) => mutate(data))}> <Flex direction="column" gap="xs"> {formInputs.map((input) => ( <TextInput key={input.name} {...form.getInputProps(input.name)} label={input.name} tt="uppercase" type={input.type} /> ))} <Button type="submit" mt="md"> Create New </Button> </Flex> </form> </Box> ); };
구현의 핵심 - 낙관적인 업데이트를 통한 TanStack 쿼리 변형:
export const useCreateNewFood = () => { const queryClient = useQueryClient(); return useMutation({ mutationKey: ['create-new-food'], mutationFn: async (data: CreateNewFoodType) => { await new Promise(resolve => setTimeout(resolve, 3000)); // Demo delay return API.url('/foods').post(data).json<GetAllFoods>(); }, onMutate: async (newFood) => { // Cancel in-flight queries await queryClient.cancelQueries({ queryKey: ['all-foods'] }); // Snapshot current state const previousFoods = queryClient.getQueryData<GetAllFoods[]>(['all-foods']); // Create optimistic entry const optimisticFood: GetAllFoods = { id: -Math.random(), ...newFood, verified: false, createdBy: 0, createdAt: new Date().toISOString(), updatedAt: new Date().toISOString(), }; // Update cache optimistically queryClient.setQueryData(['all-foods'], (old) => old ? [...old, optimisticFood] : [optimisticFood] ); return { previousFoods }; }, onError: (err, _, context) => { // Rollback on error if (context?.previousFoods) { queryClient.setQueryData(['all-foods'], context.previousFoods); } }, onSettled: () => { // Refetch to ensure consistency queryClient.invalidateQueries({ queryKey: ['all-foods'] }); }, }); };
낙관적인 업데이트를 생생하게 전달하는 애니메이션:
@keyframes shimmer-and-pulse { 0% { background-position: 200% 0; transform: scale(1); box-shadow: 0 0 0 0 rgba(83, 109, 254, 0.2); } 50% { background-position: -200% 0; transform: scale(1.02); box-shadow: 0 0 0 10px rgba(83, 109, 254, 0); } 100% { background-position: 200% 0; transform: scale(1); box-shadow: 0 0 0 0 rgba(83, 109, 254, 0); } }
구현 시 다음 개선 사항을 고려하세요.
요청 완료 시
이 구현에서는 최신 React 패턴을 사용하여 강력한 데이터 관리 시스템을 만드는 방법을 보여줍니다. TanStack Query, Mantine UI, 사려 깊고 낙관적인 업데이트의 조합은 원활하고 전문적인 사용자 경험을 만들어냅니다.
다음 사항을 기억하세요.
React 애플리케이션에서 낙관적인 업데이트를 구현하는 데 어떤 어려움에 직면했습니까? 아래 댓글로 여러분의 경험을 공유해 주세요.
위 내용은 낙관적 업데이트로 데이터 테이블 구축의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!