프로젝트에 Zustand를 도입했으나
RTK(Redux-tool-kit)에 비하면 부족한점들이 보였다.
보일러플레이트도적고 쉽게 적용할수는 있으나
그래서 아래와 같은 해결방법으로
1번을 해결하였다.
// src/store/superStore.ts
import { create } from 'zustand'
import {devtools, persist} from 'zustand/middleware'
import { log } from 'store';
interface CommonState {
isLoading: boolean;
error: any;
pending : () => void;
fulfill: () => void;
reject : (error:any) => void;
count :number;
listConfig : {page:number, size:number};
setListConfig: (partialListConfig:Partial<{page:number,size:number}>) => Promise<void>;
}
const initialCommonState: Partial<CommonState> = {
isLoading: false,
error: null,
pending: () => {},
fulfill: () => {},
reject: () => {},
count : 0,
listConfig : {page:1, size:10},
}
const useSuperStore = create<CommonState>()(
devtools(log(persist<CommonState>(
(set:any) => (
{
isLoading: false,
error: null,
pending: () => set({isLoading:true, error:null}),
fulfill: () => set({isLoading:false}),
reject: (error) => set({isLoading:false, error}),
count : 0,
listConfig : {page:1, size:10},
setListConfig: async (partialListConfig) => {
set((state:CommonState) => ({ listConfig: { ...state.listConfig, ...partialListConfig } }))
// 상태 업데이트 이후에 추가 작업 수행 가능
// console.log('Form updated:');
},
}),{
name: 'superStore'
}
)))
);
export default useSuperStore;
src/store에 superStore.ts라는 파일을 만들었다.
해당 store에는 isLoading,error, pending, fulfill, reject항목이 들어있다. 나머지는 프로젝트에 필요한 전체 config이다.
pending이 호출되면 { isLoading : true, error: null } 로 로딩상태를 만든다.
fulfill이 호출이되면 { isLoading:false } 로 로딩상태를 끝낸다.
reject이 호출되면 { isLoading:false, error } 로 error를 반환한다.
그럼 이제 이 상태를 사용을해야하는데 비즈니스로직은 jsx, tsx내에 있으면 안되기때문에 밖에서 사용하는 코드를 짜줘야한다.