[TIL/React] 2023/06/09

์›๋ฏผ๊ด€ยท2023๋…„ 6์›” 9์ผ

[TIL]

๋ชฉ๋ก ๋ณด๊ธฐ
81/210

loading spinner ๊ตฌํ˜„ํ•˜๊ธฐ ๐ŸŸฃ

loading spinner๋ฅผ ๊ตฌํ˜„ํ•˜๊ธฐ์— ์•ž์„œ, action์ด ๋ฌด์—‡์ธ์ง€ console์— ์ฐ์–ด๋ดค๋‹ค. action์€ ๊ธฐ๋ณธ์ ์œผ๋กœ '๊ฐ์ฒด'์ด๋‹ค. action ๊ฐ์ฒด ๋‚ด๋ถ€์—์„œ 'requestStatus๋ผ๋Š” key์™€ fulfilled๋ผ๋Š” value'๋กœ ๊ตฌ์„ฑ๋œ ํ”„๋กœํผํ‹ฐ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด requestStatus๋ฅผ ํ™œ์šฉํ•ด์„œ 'pending'์ผ ๋•Œ์—๋Š” loading spinner๋ฅผ ๋ณด์—ฌ์ฃผ์ง€ ์•Š๊ณ , 'fulfilled'์ผ ๋•Œ์—๋Š” UI ๋‹จ์—์„œ ๋‚˜ํƒ€๋‚˜๋„๋ก ์„ค์ •ํ•  ์ˆ˜ ์žˆ์ง€ ์•Š์„๊นŒ?

slice ํŒŒ์ผ์—์„œ ์ดˆ๊ธฐ๊ฐ’์˜ ํ˜•ํƒœ๋ฅผ ๋ณ€๊ฒฝํ•˜๊ณ , pending์— ๋Œ€ํ•œ case๋ฅผ ์ถ”๊ฐ€ํ–ˆ๋‹ค. ์ปดํฌ๋„ŒํŠธ์—์„œ๋Š” useEffect๋ฅผ ํ†ตํ•ด ํ™”๋ฉด์ด ๋ Œ๋”๋ง๋˜์ž๋งˆ์ž thunk ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋„๋ก ์„ค์ •ํ–ˆ๋‹ค.

ํ™”๋ฉด์„ ๋„์šฐ๋Š” ์ˆœ๊ฐ„ useEffect๋ฅผ ํ†ตํ•ด thunk ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋˜๊ณ , pending์— ๋Œ€ํ•œ case๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ฒŒ ๋˜๋Š”๋ฐ, ์ด๋•Œ requestStatus๊ฐ€ pending์ด๋ฉด ์ดˆ๊ธฐ๊ฐ’ loading์„ true๋กœ ๋ณ€ํ™˜ํ•œ๋‹ค. ์ปดํฌ๋„ŒํŠธ์—์„œ๋Š” loading์ด true์ด๋ฉด '๋กœ๋”ฉ์ค‘'์ด๋ผ๋Š” ๋ฌธ๊ตฌ๊ฐ€ ๋‚˜ํƒ€๋‚˜๋„๋ก ์„ค์ •ํ–ˆ๋‹ค.

๋ณ„๊ฑฐ ์•„๋‹Œ ๊ณผ์ •์ด์—ˆ๋Š”๋ฐ ๊ฝค ์˜ค๋ž˜ ๊ฑธ๋ ธ๋‹ค. ์ดˆ๊ธฐ๊ฐ’์˜ ํ˜•ํƒœ๋ฅผ ๊ฐ์ฒด๋กœ ๋ณ€ํ™˜ํ•˜๋ฉด์„œ fulfilled์ผ ๋•Œ state.push๋ฅผ state.todo.push๋กœ ๋ณ€๊ฒฝํ–ˆ์–ด์•ผ ํ–ˆ๋Š”๋ฐ ์ด ๋ถ€๋ถ„์„ ๋†“์ณค๋‹ค. fulfilled์ผ ๋•Œ๋Š” loading์— ๋Œ€ํ•œ ์„ค์ •์„ ํ•˜์ง€ ์•Š์•˜๊ธฐ์—, ๊ณ„์†ํ•ด์„œ ๋กœ๋”ฉ ํ™”๋ฉด์ด ๋‚˜์˜ค๊ฒŒ ๋œ๋‹ค. ์œ„ ์บก์ณ๋ณธ์˜ ์ฝ˜์†”์„ ๋ณด๋ฉด loading data๊ฐ€ true๋กœ ์ž˜ ๋ณ€ํ™˜๋˜์—ˆ์Œ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

spinner๋Š” ๊ณตํ†ต์ ์œผ๋กœ ์‚ฌ์šฉ๋  ์ปดํฌ๋„ŒํŠธ์ด๊ธฐ์— src์˜ commons ํŒŒ์ผ ๋‚ด๋ถ€์— ์ปดํฌ๋„ŒํŠธ ํŒŒ์ผ๋กœ ๋ถ„๋ฆฌํ–ˆ๋‹ค. keyframes๋Š” ๋ณ„๋„์˜ ํŒŒ์ผ๋กœ ๋ถ„๋ฆฌํ•ด์•ผ ํ•œ๋‹ค. if ๋ฌธ ๋‚ด์— ํ•ด๋‹น ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ ์šฉํ•˜๋ฉด, ์œ„์™€ ๊ฐ™์ด loading spinner๊ฐ€ ๋™์ž‘ํ•˜๊ฒŒ ๋œ๋‹ค.

Add Todo Area & Delete Btn ๐ŸŸฃ

์ถ”๊ฐ€๋œ Todo๋ฅผ ๋ณด์—ฌ์ฃผ๋Š” ์˜์—ญ์— ๋Œ€ํ•œ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ƒ์„ฑํ–ˆ๋‹ค. ๊ฐ€์žฅ ๋จผ์ € useSelector๋ฅผ ํ†ตํ•ด todo์— ๋Œ€ํ•œ ์ƒํƒœ๋ฅผ ๊ฐ€์ ธ์™”๋‹ค. ํ•ด๋‹น todo๋Š” value์™€ id๋ผ๋Š” key๋กœ ๊ตฌ์„ฑ๋œ ๊ฐ์ฒด์˜ ์ง‘ํ•ฉ(=๋ฐฐ์—ด)์ด๋‹ค. ๋”ฐ๋ผ์„œ todo์˜ isDone ์†์„ฑ์— ์ ‘๊ทผํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” 'todo๊ฐ์ฒด.value.isDone'์˜ ๋‹จ๊ณ„๋ฅผ ๊ฑฐ์ณ์•ผ ํ•œ๋‹ค.

์œ„ ์ ‘๊ทผ์„ ํ†ตํ•ด '์™„๋ฃŒ๋˜์ง€ ์•Š์€ ํ•ญ๋ชฉ'์„ noCompleteArray๋ผ๋Š” ๋ณ€์ˆ˜์— ํ• ๋‹นํ–ˆ๋‹ค. todo์นด๋“œ์—์„œ์˜ elem์€ ๊ฒฐ๊ตญ todo๋ฅผ ์˜๋ฏธํ•œ๋‹ค. ๋™์ผํ•œ ๋งค์ปค๋‹ˆ์ฆ˜์œผ๋กœ title์„ ๋ Œ๋”๋งํ•œ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์ฝ˜์†”์—์„œ todo์—๋Š” ํ•ด๋‹น data๊ฐ€ ๋‹ด๊ธฐ๋Š”๋ฐ, noCompleteArray๋Š” ๋ฐ˜์˜๋˜์ง€ ์•Š๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค. Add Click์—์„œ inputValue๋ฅผ ์ดˆ๊ธฐํ™”ํ•  ๋•Œ isDone๊ณผ id์— ๋Œ€ํ•œ ๋‚ด์šฉ์„ ๋ฐ˜์˜ํ•ด์ฃผ์ง€ ์•Š์•„์„œ ๋ฐœ์ƒํ•œ ๋ฌธ์ œ์˜€๋‹ค.

์•„๋‹ˆ๋‹ค id๋Š” add๋ฅผ clickํ•  ๋•Œ ๋ณด๋‚ด์ฃผ๋ฉด ๋˜๋Š” ๊ฒƒ์ด๋‹ค.

๋‹ค์‹œ ํŽ˜์ด์ง€ ๊ตฌ๋ถ„ ๋จผ์ € ๐ŸŸฃ

์‹œํ—˜๊ธฐ๊ฐ„ ์ด์Šˆ๋กœ ์ž ์ • ์ค‘๋‹จํ–ˆ์—ˆ๋‹ค. ๋‹ค์‹œ ์ฐจ๊ทผ์ฐจ๊ทผ ์‹œ์ž‘ํ•œ๋‹ค.

Delete button์„ ๋งˆ์ง€๋ง‰์œผ๋กœ ๊ตฌํ˜„ํ•œ ๊ฒƒ ๊ฐ™์€๋ฐ, ์‚ฌ์‹ค์€ ์ƒ์„ธ ํŽ˜์ด์ง€์—์„œ ์‚ญ์ œ ์ž‘์—…์„ ํ•˜๋„๋ก ๋งŒ๋“œ๋Š” ๊ฒƒ์ด ๋ชฉํ‘œ์˜€๋‹ค.

๋ฉ”์ธ ํŽ˜์ด์ง€์—์„œ title์„ ํด๋ฆญํ•ด์„œ ์ƒ์„ธ ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•˜๊ฒŒ ํ•˜๋ ค๋ฉด, title์— ๋Œ€ํ•ด onClick event๊ฐ€ ํ•„์š”ํ•˜๊ณ  ํ•ด๋‹น event๋Š” navigate์— ๋Œ€ํ•œ ๋‚ด์šฉ์„ ๋‹ด๊ณ  ์žˆ์–ด์•ผ ํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  main๊ณผ detail๋กœ ๊ตฌ๋ถ„ํ•ด์„œ ์ฃผ์†Œ๋ฅผ ๋ถ€์—ฌํ•˜๊ณ ์ž ํ–ˆ๋‹ค.

๊ฐ€์žฅ ๋จผ์ € input field์™€ todo field, ๋‘ ์ปดํฌ๋„ŒํŠธ๋ฅผ main์œผ๋กœ ๋ฌถ์–ด์คฌ๋‹ค.

ํŒŒ์ผ์ด ์•Œ ์ˆ˜ ์—†๋Š” ์ด์œ ๋กœ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š”๋‹ค. ์‚ญ์ œํ•˜๊ณ  ๋‹ค์‹œ ์‹œ์ž‘ํ•œ๋‹ค.

profile
Write a little every day, without hope, without despair โœ๏ธ

0๊ฐœ์˜ ๋Œ“๊ธ€