๐ ์ด๋ฒ ์ฅ์ ๋ชฉํ
useSelector๋ก ์ปดํฌ๋ํธ๋ฅผ ์ต์ ํํ๋ ๋ฐฉ๋ฒ์ ๋ฐฐ์ด๋ค.
์ปดํฌ๋ํธ ๋ฆฌ๋ ๋๋ง ์ฌ๋ถ ํ์ธํ๊ธฐ
๋จผ์ , ์ปดํฌ๋ํธ์ ๋ฆฌ๋ ๋๋ง ์ฌ๋ถ๋ฅผ ํ์ธํ๊ธฐ ์ํด ๋ฆฌ์กํธ ๊ฐ๋ฐ์ ๋๊ตฌ๋ฅผ ์ค์นํ๋ค.
๐ ๋ฆฌ์กํธ ๊ฐ๋ฐ์ ๋๊ตฌ ์ค์นํ๊ธฐ
๋๊ตฌ๋ฅผ ์ค์นํ ๋ค ๋ธ๋ผ์ฐ์ ์์ ๊ฐ๋ฐ์ ๋๊ตฌ๋ฅผ ์คํํ๋ฉด ๋ค์๊ณผ ๊ฐ์ด ๋ฆฌ์กํธ ํญ์ด ์์ฑ๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.

์ฌ๊ธฐ์ ์ผ์ชฝ์ ์๋ ํฑ๋๋ฐํด ๋ฒํผ์ ๋๋ฅด๋ฉด ๋ค์๊ณผ ๊ฐ์ด ์ค์ ์ฐฝ์ด ํ๋ฉด์ ํ์๋๋ค.

์ค์ ์ฐฝ์์ Highlight updates~~~๋ฅผ ์ฒดํฌํด์ฃผ๋ฉด~?!
์ปดํฌ๋ํธ๊ฐ ๋ฆฌ๋ ๋๋ง๋ ๋๋ง๋ค ํ ๋๋ฆฌ๊ฐ ๋ณ๊ฒฝ๋๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
ํฌ๋๋ฆฌ์คํธ ํ์ด์ง ์ดํด๋ณด๊ธฐ
์ด์ ์ ๋ง๋ค์๋ ํฌ๋๋ฆฌ์คํธ ํ์ด์ง๋ฅผ ์ดํด๋ณด๋ฉด์ ์ปดํฌ๋ํธ ์ต์ ํ ๋ฐฉ๋ฒ์ ๋ํด ์์๋ณด์
ํ์ด์ง์์ +, - ๋ฒํผ์ ๋๋ฌ๋ณด๋ฉด ํ ์ผ ๋ชฉ๋ก์ ๋ฆฌ๋ ๋๋ง ๋์ง ์๋๋ค.
ํ์ง๋ง ํ ์ผ ๋ชฉ๋ก์ ํญ๋ชฉ์ ํด๋ฆญํด๋ณด๋ฉด ๋ค์๊ณผ ๊ฐ์ด ํ ๊ธ ๋ ๋๋ง๋ค ์นด์ดํฐ๊ฐ ๋ฆฌ๋ ๋๋ง ๋๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.

๊ธฐ๋ณธ์ ์ผ๋ก, useSelector๋ฅผ ์ฌ์ฉํ๊ฒ ๋๋ฉด ๋ฆฌ๋์ค ์คํ ์ด์ ์ํ๊ฐ ๋ฐ๋์์ ๋๋ง ๋ฆฌ๋ ๋๋ง ๋๋ค.
TodosContainer์ ๊ฒฝ์ฐ todos ๋ฐฐ์ด์ ๋ค์๊ณผ ๊ฐ์ด useSelector๋ก ๊ฐ์ธ์คฌ๋ค.
const todos = useSelector(state => state.todos);
๊ทธ๋ ๊ธฐ ๋๋ฌธ์ +, - ๋ฒํผ์ ๋๋ฌ์ ์นด์ดํฐ ๊ฐ์ด ๋ณ๊ฒฝ๋ผ๋ todos ๊ฐ์ ๋ณํ๊ฐ ์๊ธฐ ๋๋ฌธ์ TodosContainer๋ ๋ฆฌ๋ ๋๋ง ๋์ง ์๋๋ค.
ํ์ง๋ง CounterContainer๋ ๋ค์๊ณผ ๊ฐ์ด useSelector๋ฅผ ์ ์ฉํ๋๋ฐ๋ number์ diff๊ฐ ๋ณ๊ฒฝ๋์ง ์์๋ ๋ฆฌ๋ ๋๋ง์ด ๋ฐ์ํ๋ค. TodosContainer๊ณผ์ ์ฐจ์ด์ ์ด ๋ญ๊น?
const { number, diff } = useSelector(state => ({
number: state.counter.number,
diff: state.counter.diff
}));
์ผํ ๋ณด๋ฉด ๋ ์ปดํฌ๋ํธ ๊ฐ์ ์ฐจ์ด๊ฐ ์๋๊ฒ ๊ฐ์ง๋ง
CounterContainer์์๋ ์ฌ์ค์ useSelector Hook์ ํตํด ๋งค๋ฒ ๋ ๋๋ง ๋ ๋๋ง๋ค ์๋ก์ด ๊ฐ์ฒด { number, diff }๊ฐ ์์ฑ๋๊ณ ์๋ค.
๐ ์ํ๊ฐ ๋ฐ๋์๋์ง ๋ฐ๋์ง ์์๋์ง ํ์ธํ ์ ์์ด ๋ ๋๋ง์ด ๊ณ์ ์ผ์ด๋๊ฐ ๋๋ค.
์ด๋ฅผ ์ต์ ํํ๊ธฐ ์ํด์ ๋๊ฐ์ง ๋ฐฉ๋ฒ์ด ์๋ค.
1. state๋ณ๋ก useSelector๋ฅผ ์ฌ์ฉํ๋ค.
const number = useSelector(state => state.counter.number);
const diff = useSelector(state => state.counter.diff);
๐ number๋ diff๊ฐ ๋ณ๊ฒฝ๋์ ๋๋ง ์ปดํฌ๋ํธ๊ฐ ๋ฆฌ๋ ๋๋ง ๋๋ค
2. react-redux์ shallowEqual ํจ์๋ฅผ useSelector์ ๋๋ฒ์งธ ์ธ์๋ก ์ ๋ฌํ๋ค.
const { number, diff } = useSelector(
state => ({
number: state.counter.number,
diff: state.counter.diff
}),
shallowEqual
);
์๋ useSelector์ ๋๋ฒ์งธ ํ๋ผ๋ฏธํฐ๋ equalityFn์ด๋ค.
โ equalityFn๋ ์ด์ ๊ฐ๊ณผ ๋ค์ ๊ฐ์ ๋น๊ตํด ๊ฒฐ๊ณผ๊ฐ์ด true์ด๋ฉด ๋ฆฌ๋ ๋๋ง ํ์ง ์๊ณ false๊ฐ ๋์ค๋ฉด ๋ฆฌ๋ ๋๋ง์ ์งํํ๋ค.
๊ทธ๋ฆฌ๊ณ shallowEqual๋ react-redux์ ๋ด์ฅ๋ผ์๋ ํจ์๋ก ๊ฐ์ฒด ์์ ๊ฐ์ฅ ๊ฒ์ ์๋ ๊ฐ๋ค์ ๋ชจ๋ ๋น๊ตํด์ค๋ค.
์ฌ๊ธฐ์ ๊ฐ์ฅ ๊ฒ์ ์๋ ๊ฐ์ ์๋ฏธ๊ฐ ๋ฌด์์ธ์ง ๊ถ๊ธํด์ง ๊ฒ์ด๋ค. ์ด์ ๋ํ ์์๋ ๋ค์๊ณผ ๊ฐ๋ค.
๋ง์ผ, ๋ค์๊ณผ ๊ฐ์ ๊ฐ์ฒด๊ฐ ์๋ค๋ฉด
const object = {
a: {
x: 3,
y: 2,
z: 1
},
b: 1,
c: [{ id: 1 }]
}
๊ฐ์ฅ ๊ฒ์ ์๋ ๊ฐ์ object.a, object.b, object.c์ด๋ค.
shallowEqual๋ ํด๋น ๊ฐ๋ค๋ง ๋น๊ตํ๋ค.
object.a ๋ด์ ์๋ x, y, z๋ object.c[0]๋ ๋น๊ต ๋์์ ํฌํจ๋์ง ์๋๋ค.
์ด์ ๊ฐ์ ๋ฐฉ๋ฒ์ ์ฌ์ฉํด์ ์ต์ ํ๋ฅผ ํด์ฃผ๋ฉด ์ปดํฌ๋ํธ์ ๋ฆฌ๋ ๋๋ง์ ์ต์ํ ํ ์ ์๋ค.
์ฐธ๊ณ
๋ฒจ๋กํผํธ์ ํจ๊ปํ๋ ๋ชจ๋ ๋ฆฌ์กํธ https://react.vlpt.us/redux/08-optimize-useSelector.html
'Redux' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Redux] 6. ๋ฆฌ๋์ค๋ก ํฌ๋ ๋ฆฌ์คํธ(TodoList) ๊ตฌํํ๊ธฐ (0) | 2021.06.29 |
---|---|
[Redux] 5. ๋ฆฌ๋์ค ๊ฐ๋ฐ์๋๊ตฌ ์ ์ฉํ๋ ๋ฐฉ๋ฒ (0) | 2021.06.29 |
[Redux] 4. ๋ฆฌ๋์ค๋ก ์นด์ดํฐ ๊ตฌํํ๊ธฐ (0) | 2021.06.29 |
[Redux] 3. ๋ฆฌ๋์ค ๋ชจ๋ ๋ง๋ค๊ธฐ (0) | 2021.06.29 |
[Redux] 2. ๋ฆฌ๋์ค ์ค์น ๋ฐ ์์ ์คํ (0) | 2021.06.28 |