๐ธ ์ํฉ ์ค์ : ์์ธ ์กฐํ ๋ฒํผ์ ๋ง๋ค์๋ค.
๋งจ ์ฒ์ ๋ฐฉ ํ์ ํํฐ๋ฅผ ์ค์ ํ๋ฉด, ์ค์ ํ ๋ฐฉ ํ์ ๋ง ์์ธ ์กฐํ ๋ฒํผ์ ๋ค์ด๊ฐ์ผ ํ๋ค.
๊ทธ๋ฌ๊ธฐ ์ํด์ ๋ฆฌ๋งค์น๋ฅผ ํตํด ์ด๋ค ๋ฐฉ ํ์ ์ ์ ํํ๋์ง ๊ฐ์ ๊ด๋ฆฌํด์ผํจ!
models
- market-price
ํด๋ ์์ฑimport { createModel } from '@rematch/core';
import { RootModel } from '..';
import { TMarketPrice } from '~/@types/map';
const marketPrice = createModel<RootModel>()({
//1. ์ด๊ธฐ๊ฐ์ ์ค์ ํด์ค๋ค. useState์ฒ๋ผ!
state: {
selectRoomType: 999
} as TMarketPrice //type ์ค์
//2. ๋ฆฌ๋์ ์์ฑ
reducer: {
updateRoomType(state, payload: Partial<TMarketPrice>) {
return {
...state,
...payload,
};
},
},
effects: dispatch => {
return {
//3. ๋ค๋ฅธ ๊ณณ์์ ์ฐ์ผ ํจ์ ์ด๋ฆ
updateType(payload: Partial<TMarketPrice>) {
//4.์ฌ์ฉํ๋ ๋ฆฌ๋์ ํจ์ ๋ถ๋ฌ์ค๊ธฐ
dispatch.marketPrice.updateRoomType(payload);
...
...
...
export default marketPrice;
models -
import { Models } from '@rematch/core'
import { marketPrice } from './marketPrice'
export interface RootModel extends Models<RootModel> {
marketPrice: typeof marketPrice
}
export const models: RootModel = { marketPrice }
store.ts
์์ฑimport { init, RematchDispatch, RematchRootState } from '@rematch/core'
import { models, RootModel } from './models'
// basic
export const store = init({
models,
})
// dabang code
const devtoolOptions: DevtoolOptions = {};
if (process.env.NODE_ENV === 'development') {
devtoolOptions.trace = true;
devtoolOptions.disabled = false;
} else {
devtoolOptions.disabled = true;
}
const store = init({
models,
redux: {
devtoolOptions,
},
});
export type Store = typeof store
export type Dispatch = RematchDispatch<RootModel>
export type RootState = RematchRootState<RootModel>
์ ์ด์ ๋ฆฌ๋งค์น ์ ์ฉ ๋๊ณ ๋ฐ์ดํฐ๋ฅผ ๋จผ์ ์ ๋ฐ์ดํธ ์์ผ๋ณด์
๐ธ ์ํฉ ์ค์ : ๋ฐฉ ํ์ ์ด ์๋ฃธ ํฌ๋ฃธ ์คํผ์คํ ์ ํ ๋์ด ์๊ณ ์์ธ ์กฐํ์์ ํฌ๋ฃธ์ด ์ ํ๋ ์ํ.
๊ทผ๋ฐ ๋ฐฉ ํ์ ์์ ํฌ๋ฃธ์ ์ ๊ฑฐ ํ๋ค. ๊ทธ๋ฌ๋ฉด ์์ธํ ์กฐํ ๋ฒํผ์ ์๋ฃธ์ด ์ ํ๋๋๋ก ํด์ผํ๋ค.
import { useDispatch } from 'react';
import { Dispatch } from '~/store';
//์์ธ ์กฐํ ๋ฒํผ ํด๋ฆญ์ ํจ์
function changeRoomType(typeNum){
...
dispatch.marketPrice.updateType({ selectRoomType: typeNum });
...
}
๐ธ ์ํฉ ์ค์ : ์์ธ ์กฐํ ๋ฒํผ ๊ฐ์ ๋ฆฌ๋งค์น๋ฅผ ํตํด ์
๋ฐ์ดํธ ์์ผฐ๋ค
๊ทธ๋ผ ์ด๊ฑธ ์ด์ ํ์ฉํด์ ๋งจ ์ฒ์ ์ํฉ์ ์ํ ํจ์๋ฅผ ๋ง๋ ๋ค (์์ธ ์กฐํ ๋ฒํผ ์กํฐ๋ธ)
import { useSelector, useDisPatch } from 'react';
import { RootState, Dispatch } from '~/store';
const dispatch = useDispatch<Dispatch>();
const { filter, selectRoomType } = useSlector(({ map, marketPrice } : RootState) => ({
filter: map.filter,
selectRoomTypeL marketPrice.selectRoomType,
}));
useEffect(() => {
changeIsActive(filter.multi_room_type);
}, [filter.multi_room_type]);
function changerIsActive(filterType: number[]) {
// ์์ธ ์กฐํ ๋ฒํผ์ด ๋ญ๋ผ๋ ์ ํ๋์ด ์๋ ์ํ๊ณ , ํํฐ ํ์
์ ์์ธ์กฐํํ์
์ด ํฌํจ๋์ด ์์ง ์๋ค๋ฉด
if (filterType !== 999 && !filterType.includes(selectRoomType)) {
//ํํฐ ํ์
๋ฐฐ์ด ์ค ์ ์ผ ์์ ๊ฐ
const nextType = Math.min(...filterType);
dispatch.marketPrice.updateTYpe({ selectRoomType: nextType }); // ์
๋ฐ์ดํธ!
}}
hadler onClick = {() => dispatch... . handle(open)}
setHandle(state, payload: boolean) {
return {
...state,
open: payload,
};
},
handle(open: boolean, state) {
dispatch.requestContract.setHandle(open);
}
or
setState(state, payload: Partial) {
return {
...state,
...payload,
};
},
handle(open: boolean, state) {
dispatch.requestContract.setHandle({open});
}