alswlfl 2022. 11. 24. 23:48
  • ๋ฆฌ์•กํŠธ์—์„œ ๋ฐฐ์—ด์ด๋‚˜ ๊ฐ์ฒด๋ฅผ ์—…๋ฐ์ดํŠธ ํ•ด์•ผ ํ•  ๋•Œ์—๋Š” ๋ถˆ๋ณ€์„ฑ์„ ์ง€์ผœ์•ผ ํ•จ
  • immer ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์‚ฌ์šฉํ•˜๋ฉด ๊น”๋”ํ•˜๊ฒŒ ์ฝ”๋“œ ์ž‘์„ฑ ๊ฐ€๋Šฅ
  • immer๋Š” ์šฐ๋ฆฌ๊ฐ€ ์ƒํƒœ๋ฅผ ์—…๋ฐ์ดํŠธ ํ•  ๋•Œ, ๋ถˆ๋ณ€์„ฑ์„ ์‹ ๊ฒฝ์“ฐ์ง€ ์•Š์œผ๋ฉด์„œ ์—…๋ฐ์ดํŠธ๋ฅผ ํ•ด์ฃผ๋ฉด Immer๊ฐ€ ๋ถˆ๋ณ€์„ฑ ๊ด€๋ฆฌ ๋Œ€์‹  ํ•ด์คŒ

Immer ์‚ฌ์šฉ๋ฒ•

  1. Immer ์„ค์น˜
    • $ yarn add immer
  2. ์ฝ”๋“œ ์ƒ๋‹จ์— Immer ๋ถˆ๋Ÿฌ์˜ด → ๋ณดํ†ต produce์ด๋ฆ„์œผ๋กœ ๋ถˆ๋Ÿฌ์˜ด
    • import produce form ‘immer’;
  3. produce ํ•จ์ˆ˜ ์‚ฌ์šฉ
    • ์ฒซ ๋ฒˆ์งธ ํŒŒ๋ผ๋ฏธํ„ฐ: ์ˆ˜์ •ํ•˜๊ณ  ์‹ถ์€ ์ƒํƒœ
    • ๋‘ ๋ฒˆ์งธ ํŒŒ๋ผ๋ฏธํ„ฐ: ์–ด๋–ป๊ฒŒ ์—…๋ฐ์ดํŠธํ•˜๊ณ  ์‹ถ์„์ง€ ์ •์˜ํ•˜๋Š” ํ•จ์ˆ˜(๋ถˆ๋ณ€์„ฑ ์‹ ๊ฒฝ์“ฐ์ง€ ์•Š๊ณ  ๊ทธ๋ƒฅ ์—…๋ฐ์ดํŠธํ•˜๋ฉด ์•Œ์•„์„œ ํ•ด์คŒ)
    •  
const state={
	number:1,
	dontChangeMe: 2
};

const nextState = produce(state, draft => {
	draft.number+=1;
});

console.log(nextState);
//{number:2, dontChangeMe:2 }

Immer์™€ ํ•จ์ˆ˜ํ˜• ์—…๋ฐ์ดํŠธ

const [todo, setTodo] = useState({
	text: 'Hello',
	done: false
});

const onClick = useCallback(() => {
	setTodo(todo => ({
		...todo,
		done: !todo.done
	}));
}, []);

→ useState์™€ useCallback์œผ๋กœ ํ•จ์ˆ˜ ์—…๋ฐ์ดํŠธ

 

Immer ์‚ฌ์šฉํ•˜์—ฌ ํ•จ์ˆ˜ํ˜• ์—…๋ฐ์ดํŠธ

produce ํ•จ์ˆ˜์—์„œ

  • ์ฒซ ๋ฒˆ์งธ ํŒŒ๋ผ๋ฏธํ„ฐ์— ๋„ฃ์€ ์ƒํƒœ๋ฅผ ๋ถˆ๋ณ€์„ฑ ์œ ์ง€ํ•˜๋ฉด ์ƒˆ๋กœ์šด ์ƒํƒœ ๋งŒ๋“ค์–ด ์คŒ
  • ์ฒซ ๋ฒˆ์งธ ํŒŒ๋ผ๋ฏธํ„ฐ ์ƒ๋žตํ•˜๊ณ  ๋ฐ”๋กœ ์—…๋ฐ์ดํŠธ ํ•จ์ˆ˜ ๋„ฃ์–ด์ฃผ๋ฉด ๋ฐ˜ํ™˜ ๊ฐ’์€ ์ƒˆ๋กœ์šด ์ƒํƒœ๊ฐ€ ์•„๋‹Œ ์ƒํƒœ๋ฅผ ์—…๋ฐ์ดํŠธ ํ•ด์ฃผ๋Š” ํ•จ์ˆ˜๊ฐ€ ๋จ
const todo = {
	text: 'Hello',
	done: false
};

const updater = produce(draft = > {
	draft.done = !draft.done;
});

const nextTodo = updater(todo);

console.log(nextTodo);