React์์ useReducer๋ฅผ ์ฌ์ฉํด ์ฅ๋ฐ๊ตฌ๋ ๊ธฐ๋ฅ์ ๊ตฌํํ๋ ์ค,
์๋์ ์กฐ์ ํ๋ + ๋ฒํผ์ ํด๋ฆญํ์ ๋ ๊ฐ๊ฒฉ์ด NaN์ผ๋ก ํ์๋๊ฑฐ๋,
์๋๊ณผ ๋ง์ง ์๋ ๊ฐ๊ฒฉ์ด ํ์๋๋ ํ์์ด ๋ํ๋ฌ์ต๋๋ค.์ด ๊ธ์์๋ 1๏ธโฃ ๋ฌธ์ ์ํฉ, 2๏ธโฃ ์์ธ ๋ถ์, 3๏ธโฃ ํด๊ฒฐ ๋ฐฉ๋ฒ๊ณผ ํจ๊ป ๊ด๋ จ ๊ฐ๋ ์ ์ ๋ฆฌํด๋ณด์์ต๋๋ค.
๐ก ๋ด๊ฐ ๊ตฌํํ๊ณ ์ ํ๋ ๊ธฐ๋ฅ
- "React ํฐ์ ์ธ ์ถ๊ฐ"๋ฒํผ์ ๋๋ฅด๋ฉด ์ฅ๋ฐ๊ตฌ๋์ ์ํ์ด ์ถ๊ฐ๋๋ค.
- +,- ๋ฒํผ์ ๋๋ฌ ์๋์ ์กฐ์
- ๊ฐ ์์ดํ ์ ์๋์ ๋ฐ๋ผ ๊ฐ๊ฒฉ์ด ์ค์๊ฐ์ผ๋ก ๋ฐ์
๐จ ๋ฌธ์ 1: ๊ฐ๊ฒฉ์ด NaN์ผ๋ก ํ์๋จ
๐ ๋ฐ์ ์ํฉ
- ์๋ ์ฆ๊ฐ(+) ๋ฒํผ์ ๋๋ ์ ๋ ๊ฐ๊ฒฉ์ด NaN์ผ๋ก ํ์๋จ
๐ ์์ธ
- sampleItem ๊ฐ์ฒด ๋ด๋ถ์์ total: this.price * this.quantity๋ฅผ ์ฌ์ฉํจ
- ํ์ง๋ง ์ผ๋ฐ ๊ฐ์ฒด ๋ฆฌํฐ๋ด์์ this๋ ์ฌ์ฉํ ์ ์์.
- ํจ์ ์ปจํ ์คํธ ๋ด์์๋ง this๊ฐ ๋ฐ์ธ๋ฉ๋จ.
๐ก์๋ชป ์ดํดํ๊ณ ์๋ ๊ฐ๋
๊ฐ์ฒด ๋ฆฌํฐ๋ด์์๋ this๊ฐ ํด๋น ๊ฐ์ฒด๋ฅผ ๊ฐ๋ฆฌํค์ง ์์.
this.price * this.quantity๋ undefined * undefined๊ฐ ๋์ด NaN์ด ๋ฐ์ํจ.
const sampleItem = {
id: 1,
name: "React ํฐ์
์ธ ",
price: 25000,
quantity: 1,
total: this.price * this.quantity // โ ์๋ชป๋ ์ฝ๋
};
โ ํด๊ฒฐ ๋ฐฉ๋ฒ
- sampleItem์์๋ total์ ์ ์ํ์ง ์๊ณ , ADD ์ก์ ์ฒ๋ฆฌ ์ ๊ณ์ฐํด์ ์ถ๊ฐํจ
case command.ADD:
return [
...state,
{
...action.payload,
total: action.payload.price * action.payload.quantity,
},
];
๐จ ๋ฌธ์ 2: ์๋ ์กฐ์ ํ ๊ฐ๊ฒฉ์ด ์๋ชป๋จ
๐ ๋ฐ์ ์ํฉ
- + ๋ฒํผ์ ๋๋ฅผ ๋ ์๋์ ๋์ด๋์ง๋ง ๊ฐ๊ฒฉ(total) ๊ณ์ฐ์ด ์ด์ํจ
๐ ์์ธ
- ์๋ ์ฆ๊ฐ ํ total์ ๊ณ์ฐํ ๋ item.quantity๋ฅผ ๊ทธ๋๋ก ์ฌ์ฉํจ (์ ๋ฐ์ดํธ ์ ๊ฐ)
- ์ํ๋ฅผ ์ ๋ฐ์ดํธํ๊ธฐ ์ ์ ๊ธฐ์กด ๊ฐ์ ๋ฐ๋ก ์ฌ์ฉํ๋ฉด ๋ฐ์์ด ์ ๋ ๊ฐ์ผ๋ก ๊ณ์ฐํ๊ฒ ๋จ.
// โ ์๋ชป๋ ๋ฐฉ์
price: 25000 * item.quantity
โ ํด๊ฒฐ ๋ฐฉ๋ฒ
์๋ก์ด ์๋์ ๋จผ์ ๋ณ์๋ก ๊ณ์ฐํ๊ณ , ๊ทธ ๊ฐ์ ๊ธฐ์ค์ผ๋ก total์ ๋ค์ ๊ณ์ฐํจ
๐ก์๋ชป ์ดํดํ๊ณ ์๋ ๊ฐ๋
React์ ์ํ ์ ๋ฐ์ดํธ๋ ๋น๋๊ธฐ์ ์ผ๋ก ์ฒ๋ฆฌ๋๋ฏ๋ก, ๊ธฐ์กด ๊ฐ์ ์ฆ์ ์ฌ์ฉํ๋ ๋์ ์๋ก์ด ๊ฐ์ ๋ณ์๋ก ๊ณ์ฐ ํ ์ฌ์ฉํด์ผ ์ ํํ ์ฐ์ฐ์ด ๊ฐ๋ฅํ๋ค.
case command.PLUS:
return state.map((item) => {
if (item.id === action.id) {
const newQuantity = item.quantity + 1;
return {
...item,
quantity: newQuantity,
total: newQuantity * item.price,
};
}
return item;
});
๐จ ๋ฌธ์ 3: ํ๋ฉด์ด ๊น๋นก์ด๊ณ ์๋ฌด๊ฒ๋ ๋ณด์ด์ง ์์
๐ ๋ฐ์ ์ํฉ
- ์ํ ์ถ๊ฐ ํ + ๋ฒํผ์ ๋๋ฅด๋ฉด ์ ์ฒด ํ๋ฉด์ด ํ์๊ฒ ๋จ
๐ ์์ธ
- map() ํจ์์์ return์ ์๋ตํ์ฌ undefined ๋ฐฐ์ด์ด ์์ฑ๋จ.
- React๋ undefined๋ฅผ ๋ ๋๋งํ ์ ์์ผ๋ฏ๋ก ์ค๋ฅ ๋ฐ์
// โ ์๋ฌด๊ฒ๋ ๋ฐํํ์ง ์์
state.map((item) => {
if (item.id === action.id) {
// ...์๋ต
}
})
โ ํด๊ฒฐ ๋ฐฉ๋ฒ
- ์กฐ๊ฑด๋ฌธ ์ธ์๋ ํญ์ return item์ ํด์ค์ผ ํจ
๐ก์๋ชป ์ดํดํ๊ณ ์๋ ๊ฐ๋
์๋ชป ์ดํดํ๊ณ ์๋ ๊ฐ๋ map()์ ๊ฐ ์์์ ๋ํด ๋ฐ๋์ ๋ฐํ๊ฐ์ ๊ฐ์ ธ์ผ ํ๋ฉฐ, ์กฐ๊ฑด ๋ถ๊ธฐ ์ธ๋ถ์ ๊ธฐ๋ณธ return์ ๋๋ ๊ฒ์ด ์ค์ํจ.
state.map((item) => {
if (item.id === action.id) {
const newQuantity = item.quantity + 1;
return {
...item,
quantity: newQuantity,
total: newQuantity * item.price,
};
}
return item; // โ
ํ์!
});
๐ ์ต์ข ๊ฒฐ๊ณผ
๋ชจ๋ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ํ, ์ฅ๋ฐ๊ตฌ๋๋ ๋ค์๊ณผ ๊ฐ์ด ์ ์ ์๋ํ๋ค:
- ํฐ์ ์ธ ๋ฅผ ์ฌ๋ฌ ๊ฐ ์ถ๊ฐ ๊ฐ๋ฅ
- ๊ฐ ํญ๋ชฉ๋ณ๋ก + / - ๋ฒํผ์ ๋๋ฌ ์๋ ์กฐ์
- ์๋์ ๋ง์ถฐ total ๊ฐ๊ฒฉ ์๋ ๊ณ์ฐ
- ์ญ์ ๋ฒํผ์ผ๋ก ๊ฐ๋ณ ์ญ์ ๊ฐ๋ฅ
โจ ๋ง๋ฌด๋ฆฌํ๋ฉฐ
์ด ๊ณผ์ ์ ํตํด useReducer์ ๊ตฌ์กฐ์ ์ด์ , map() ์ฌ์ฉ ์ return์ ์ค์์ฑ, ๊ฐ์ฒด ์ด๊ธฐํ ์ this ์ฌ์ฉ์ ์ค๋ฅ ๋ฑ์ ๋ช ํํ๊ฒ ๋ฐฐ์ธ ์ ์์๋ค. ์ํ ๊ด๋ฆฌ๋ฅผ ๊ตฌ์กฐ์ ์ผ๋ก ํ๋, ๋ก์ง์ ํญ์ ํ ๋จ๊ณ์ฉ ๊ณ์ฐ → ์ ๋ฐ์ดํธ → ๋ ๋๋ง ์์๋ก ์ ํํ๊ฒ ์ฒ๋ฆฌํด์ผ ํ๋ค๋ ๊ตํ๋ ์ป์๋ค.