๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

Redux

๋ฆฌ๋•์Šค์—์„œ Hooks ์‚ฌ์šฉํ•˜๊ธฐ

๋ฆฌ๋•์Šค ์Šคํ† ์–ด์™€ ์—ฐ๋™๋˜์–ด์žˆ๋Š” ์ปจํ…Œ์ด๋„ˆ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋งŒ๋“ค ๋•Œ connect ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  

react-redux์—์„œ ์ œ๊ณตํ•˜๋Š” Hooks๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋งŒ๋“ค์–ด ๋ณด์ž

 

 

useSelector๋กœ ์ƒํƒœ ์กฐํšŒํ•˜๊ธฐ

 

useSelector Hook์„ ์‚ฌ์šฉํ•˜๋ฉด connect ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•  ํ•„์š” ์—†์ด ๋ฆฌ๋•์Šค์˜ ์ƒํƒœ๋ฅผ ์กฐํšŒํ•  ์ˆ˜ ์žˆ๋‹ค !

 

 

 

import React, { useCallback } from 'react';
import { useSelector } from 'react-redux';
import Counter from '../components/Counter';
import { increase, decrease } from '../modules/counter';

const CounterContainer = () => {
  const number = useSelector((state) => state.counter.number);
  return (
    <Counter number={number} />
  );
};

export default CounterContainer;

 

 

mapStateToProps์™€ ๊ฐ™์€ ํ˜•ํƒœ๋กœ, CounterContainer์—์„œ connect ํ•จ์ˆ˜ ๋Œ€์‹  useSelector๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ counter.number ๊ฐ’์„ ์กฐํšŒํ•˜์—ฌ Counter ์ปดํฌ๋„ŒํŠธ์— props๋ฅผ ๋„˜๊ฒจ์ค€๋‹ค 

 

connect ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ํ›จ์”ฌ ๊ฐ„ํŽธํ•œ ์‚ฌ์šฉ๋ฐฉ๋ฒ•์ธ ๊ฒƒ ๊ฐ™๋‹ค.

 

 

useDispatch ์‚ฌ์šฉํ•˜์—ฌ ์•ก์…˜ ๋””์ŠคํŒจ์น˜ ํ•˜๊ธฐ 

 

 

useDispatch Hook์„ ์‚ฌ์šฉํ•˜๋ฉด connect๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ์ปดํฌ๋„ŒํŠธ ๋‚ด๋ถ€์—์„œ ์Šคํ† ์–ด์˜ ๋‚ด์žฅ ํ•จ์ˆ˜์ธ dispatch๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด ์ค€๋‹ค 

 

 

import React, { useCallback } from 'react';
import { useDispatch, useSelector } from 'react-redux';
import Counter from '../components/Counter';
import { increase, decrease } from '../modules/counter';

const CounterContainer = () => {
  const number = useSelector((state) => state.counter.number);
  const dispatch = useDispatch();
  return (
    <Counter 
    number={number}
    onIncrease={() => dispatch(increase())}
    onDecrease={() => dispatch(decrease())}
    />
  );
};

export default CounterContainer;

 

 

 

์œ„ ์ฝ”๋“œ ์ฒ˜๋Ÿผ dispatch ๋ณ€์ˆ˜์— useDispatch๋ฅผ ์—ฐ๊ฒฐํ•ด์ฃผ๊ณ  Counter ์ปดํฌ๋„ŒํŠธ์— props๋กœ ๋„˜๊ฒจ์ค„ ๋•Œ onIncrease์™€ onDecrease๋ฅผ dispatchํ•˜๋Š” props๋กœ ๋งŒ๋“ค์–ด์ค€๋‹ค

 

์œ„์™€ ๊ฐ™์ด ์ฝ”๋“œ๋ฅผ ์งœ๊ฒŒ๋˜๋ฉด ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ฆฌ๋ Œ๋”๋ง๋  ๋•Œ๋งˆ๋‹ค onIncrease ํ•จ์ˆ˜์™€ onDecrease ํ•จ์ˆ˜๊ฐ€ ์ƒˆ๋กญ๊ฒŒ ๋งŒ๋“ค์–ด ์ง€๊ณ ์žˆ๋‹ค ์ปดํฌ๋„ŒํŠธ์˜ ์ตœ์ ํ™”๋ฅผ ์œ„ํ•ด useCallback์œผ๋กœ ํ•จ์ˆ˜๋ฅผ ๊ฐ์‹ธ์ฃผ์–ด์„œ ์ฝ”๋“œ๋ฅผ ์งœ๋ณด๋„๋ก ํ•˜์ž

 

 

import React, { useCallback } from 'react';
import { useDispatch, useSelector } from 'react-redux';
import Counter from '../components/Counter';
import { increase, decrease } from '../modules/counter';

const CounterContainer = () => {
  const number = useSelector((state) => state.counter.number);
  const dispatch = useDispatch();
  const onIncrease = useCallback(() => dispatch(increase()), [dispatch]);
  const onDecrease = useCallback(() => dispatch(decrease()), [dispatch]);
  return (
    <Counter number={number} onIncrease={onIncrease} onDecrease={onDecrease} />
  );
};

export default CounterContainer;

  

 

์ด๋ ‡๊ฒŒ useDispatch๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ๋Š” useCallback์„ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋„๋ก ํ•˜๋Š” ์Šต๊ด€์„ ๋“ค์ด๋Š” ๊ฒƒ์ด ์ข‹๋‹ค !

 

 

 

 

 

connect ํ•จ์ˆ˜์™€ Hooks์˜ ์ฐจ์ด์ 

 

Hook๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ปจํ…Œ์ด๋„ˆ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋งŒ๋“ค ๋•Œ ๊ผญ ์•Œ์•„๋‘์–ด์•ผํ•  ์ฐจ์ด์ ์ด ์กด์žฌํ•œ๋‹ค 

 

connect ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ปจํ…Œ์ด๋„ˆ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋งŒ๋“ค์—ˆ์„ ๊ฒฝ์šฐ ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ฆฌ๋ Œ๋”๋ง๋  ๋•Œ ํ•ด๋‹น ์ปจํ…Œ์ด๋„ˆ ์ปดํฌ๋„ŒํŠธ์˜ props๊ฐ€ ๋ฐ”๋€Œ์ง€ ์•Š์•˜๋‹ค๋ฉด ๋ฆฌ๋ Œ๋”๋ฆฌ์ด ๋ฐฉ์ง€๋˜์–ด ์„ฑ๋Šฅ์ด ์ตœ์ ํ™” ๋œ๋‹ค.

 

ํ•˜์ง€๋งŒ useSelector์˜ ๊ฒฝ์šฐ ์ตœ์ ํ™” ์ž‘์—…์ด ์ž๋™์œผ๋กœ ์ด๋ฃจ์–ด์ง€์ง€ ์•Š๊ธฐ๋•Œ๋ฌธ์— ์•„๋ž˜์™€ ๊ฐ™์ด React.memo๋ฅผ ์ปจํ…Œ์ด๋„ˆ ์ปดํฌ๋„ŒํŠธ์— ์‚ฌ์šฉํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค. 

 

import React from 'react';
import { useSelector } from 'react-redux';
import Todos from '../components/Todos';
import useActions from '../lib/useActions';
import { changeInput, insert, toggle, remove } from '../modules/todos';

const TodosContainer = () => {
 (...)
};

export default React.memo(TodosContainer);

 

 

๋ฆฌ์•กํŠธ ํ”„๋กœ์ ํŠธ์—์„œ ๋ฆฌ๋•์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์—…๋ฐ์ดํŠธ์— ๊ด€๋ จ๋œ ๋กœ์ง์„ ๋ฆฌ์•กํŠธ ์ปดํฌ๋„ŒํŠธ์—์„œ ๋ถ„๋ฆฌ์‹œํ‚ฌ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ

์œ ์ง€ ๋ณด์ˆ˜์„ฑ์ด ๋†’์€ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.

์ž‘์€ ํ”„๋กœ์ ํŠธ์—์„œ ๋ฆฌ๋•์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์˜คํžˆ๋ ค ํ”„๋กœ์ ํŠธ์˜ ๋ณต์žก๋„๊ฐ€ ๋†’์•„์งˆ ์ˆ˜ ์žˆ์ง€๋งŒ ๊ทœ๋ชจ๊ฐ€ ํฐ ํ”„๋กœ์ ํŠธ์—์„œ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ์ƒํƒœ๋ฅผ ๋”์šฑ ์ฒด๊ณ„์ ์œผ๋กœ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

reference

 

(์ฑ…)๋ฆฌ์•กํŠธ๋ฅผ ๋‹ค๋ฃจ๋Š” ๊ธฐ์ˆ  - ๊น€๋ฏผ์ค€(VELOPERT)