Store.ts
const store = configureStore({
reducer: {
app: appSlice.reducer,
}
});
export type RootStoreType = ReturnType<typeof store.getState>;
AppSlice.ts
const name = "appSlice";
const initialState = {
message: "",
count: 0,
}
const appSlice = createSlice({
name,
initialState,
reducers: {
setMessage: (state, action) => {
state.message = action.payload;
},
clearMessage: (state) => {
state.message = "";
},
setCount: (state, action) => {
state.count += action.payload;
},
}
});
App.tsx
function App() {
const appState = useSelector((state: RootStoreType) => state.app);
const controller = useController(() => new AppController());
return (
<>
<div>
<p>{appState.count}</p>
<button className={'border p-1 m-1'}
onClick={() => controller.increase()}
>
Increase
</button>
<p className={'text-xs text-gray-300'}>{appState.message}</p>
</div>
</>
)
}
useController.tsx
export const useController = <T, >(builder: () => T) => {
const [controller] = useState(builder);
return controller;
}
AppController.tsx
export class AppController {
private readonly appAction;
constructor() {
this.appAction = bindActionCreators(appSlice.actions, store.dispatch);
}
async increase() {
this.appAction.setMessage("pending..");
await new Promise(resolve => setTimeout(resolve, 1000));
this.appAction.setCount(1);
this.appAction.clearMessage();
}
}
- AppContoller 에서 async 작업 수행
- 이 코드는 testibility 가 고려되어 있지 않음 (구현하기 나름)
이제와서 생각해 보니. 이 방법은 react 의 매커니즘을 잘 이해하지 못한 상태에서 어떻게든 꾸역꾸역 한 티가 팍팍 난다. 이제 이 글은 Deprecated 됩니다.