๋ฆฌ๋์ค ์คํ ์ด์ ์ฐ๋๋์ด์๋ ์ปจํ ์ด๋ ์ปดํฌ๋ํธ๋ฅผ ๋ง๋ค ๋ 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)
'Redux' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Redux-Toolkit ์์ Saga ์ฌ์ฉํ๊ธฐ (Feat. Typescript) (0) | 2021.08.01 |
---|---|
Redux Toolkit ์ ๋ํ์ฌ ์์๋ณด๊ธฐ (0) | 2021.06.07 |
๋ฆฌ๋์ค ์์ ํ๊ฒฝ ์ค์ ๋ฐ ์ฌ์ฉ๋ฐฉ๋ฒ (1) | 2021.05.24 |
๋ฆฌ๋์ค๋ ๋ฌด์์ธ๊ฐ ? (0) | 2021.05.20 |