rematch

nullยท2021๋…„ 12์›” 8์ผ
0

๐Ÿ”ธ ์ƒํ™ฉ ์„ค์ • : ์‹œ์„ธ ์กฐํšŒ ๋ฒ„ํŠผ์„ ๋งŒ๋“ค์—ˆ๋‹ค.

๋งจ ์ฒ˜์Œ ๋ฐฉ ํƒ€์ž… ํ•„ํ„ฐ๋ฅผ ์„ค์ •ํ•˜๋ฉด, ์„ค์ •ํ•œ ๋ฐฉ ํƒ€์ž…๋งŒ ์‹œ์„ธ ์กฐํšŒ ๋ฒ„ํŠผ์— ๋“ค์–ด๊ฐ€์•ผ ํ•œ๋‹ค.

๊ทธ๋Ÿฌ๊ธฐ ์œ„ํ•ด์„  ๋ฆฌ๋งค์น˜๋ฅผ ํ†ตํ•ด ์–ด๋–ค ๋ฐฉ ํƒ€์ž…์„ ์„ ํƒํ–ˆ๋Š”์ง€ ๊ฐ’์„ ๊ด€๋ฆฌํ•ด์•ผํ•จ!

  1. 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; 
  1. models -

import { Models } from '@rematch/core'
import { marketPrice } from './marketPrice'

export interface RootModel extends Models<RootModel> {
    marketPrice: typeof marketPrice
}

export const models: RootModel = { marketPrice }
  1. ํด๋”์— ํฌํ•จ๋˜์ง€ ์•Š๊ณ  ์•„์˜ˆ ๋ฐ”๊นฅ ์˜์—ญ(๋ญ๋ผ ๋ถˆ๋Ÿฌ์•ผํ•˜์ง€..) 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});
}

profile
๊ฐœ๋ฐœ์ด ์‹ซ์–ด.

0๊ฐœ์˜ ๋Œ“๊ธ€