WEB33 React v19 โ useActionState: ReactDOM.useFormState → ์ด๋ฆ ๋ณ๊ฒฝ + ๊ธฐ๋ฅ ๊ฐํuseActionState๋ ์๋ฒ ์ก์ (server actions)์ ์ฒ๋ฆฌํ ์ ์๋๋ก ์ค๊ณ๋ ํ ์ ๋๋ค.์๋๋ ReactDOM.useFormState๋ผ๋ ์ด๋ฆ์ด์์ผ๋ React v19์์ useActionState๋ก ๋ณ๊ฒฝ๋์์ต๋๋ค.tsx๋ณต์ฌํธ์งconst [state, formAction] = useActionState(myAction, initialState); ์ด ํ ์ ํด๋ผ์ด์ธํธ์์ ํผ ์ก์ ์ ์ฒ๋ฆฌํ ๋, ์๋ฒ์์ ์ธํฐ๋์ ์ํ(๋ก๋ฉ, ์ฑ๊ณต, ์คํจ ๋ฑ)๋ฅผ ๊ด๋ฆฌํด์ฃผ๋ ์ญํ ์ ํฉ๋๋ค. ์ค์ํ ์ ์ action์ด ์ฑ๊ณตํ๋ฉด ํผ์ ์๋์ผ๋ก resetํ๋ค๋ ๊ฒ์ ๋๋ค. ๋ ์ด์ e.preventDefault() → f.. 2025. 4. 16. Ref๋ฅผ ์ข ๋ ์ ์จ๋ณผ๊น? (forwardRef์ useImperativeHandle) ๋ค์ด๊ฐ๋ฉฐ: React์ Ref ์ ๋ฌ ๋ฌธ์ React์ ์ปดํฌ๋ํธ์์ ref๋ฅผ ์ ๋ฌํ๋ ค๊ณ ํ๋ฉด ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค.// ๐จ ๋์ํ์ง ์๋ ์ฝ๋const Input = (props) => { return ;};// ๋ถ๋ชจ ์ปดํฌ๋ํธconst Parent = () => { const inputRef = useRef(null); return ; // ref๊ฐ ์ ๋ฌ๋์ง ์์};์ด๋ React๊ฐ ๊ธฐ๋ณธ์ ์ผ๋ก ref๋ฅผ ์ผ๋ฐ prop์ผ๋ก ์ ๋ฌํ์ง ์๊ธฐ ๋๋ฌธ์ ๋๋ค. ์ด๋ฐ ์ ํ์ด ์๋ ์ด์ ๋:1. ์บก์ํ ์ ์ง: ๋ด๋ถ ๊ตฌํ ์ธ๋ถ์ฌํญ์ ๋ณดํธ2. ์์ธก ๊ฐ๋ฅํ ๋ฐ์ดํฐ ํ๋ฆ ๋ณด์ฅ3. ๋ถํ์ํ ๋ ธ์ถ ๋ฐฉ์ง forwardRef: React์ ๊ณต์์ ์ธ ref ์ ๋ฌ ๋ฉ์ปค๋์ฆReact ๊ณต์ ๋ฌธ์์ ๋ฐ๋ฅด๋ฉด, `forwardRef`๋ ๋ค์๊ณผ ๊ฐ์ .. 2024. 6. 28. ๋ setTimeout, setInterval ๋ก ์๊ฐ ๋ณด์ฅํ๋ค๊ณ ํ ์ ์์ด? ์ด๋ป๊ฒ? ํ์ด๋จธ๋ฅผ ๊ตฌํํ๋ค๊ฐ ๋ฌธ๋ ๊ทธ๋ฐ ์๊ฐ์ด ๋ค์๋ค. ์๋ฌด ์๊ฐ ์์ด setTimeout ๊ณผ setInterval์ ์ฌ์ฉํ๋ฉด์ ์๋ค๋ ์ด๋ป๊ฒ ๋์๊ฐ๋๊ฑฐ์ง? ์๋ค๋ฅผ ๋ฏฟ๊ณ ์จ๋๋๋๊ฑด๊ฐ? ๊ณผ์ฐ setTimeout๊ณผ setInterval์ด ์๊ฐ์ ๋ณด์ฅํด์ฃผ๋ ๊ฒ ๋ง๋? ๊ทธ๋์ ๊ณต๋ถํ๊ฒ ๋๋ค. ๐TL; DR setTimeout, setInterval์ ์ฐจ์ด์ ์ง์ฐ ๊ฐ๊ฒฉ์ด ๋ณด์ฅ๋๋? ์๊ฐ์ ์ธก์ ํด์ผ๋๋ ํ์ด๋จธ๋ผ๋ฉด Date๊ฐ ํด๊ฒฐ์ฑ ์ด ๋ ์๋..? setTimeout ์ง์ ํด์ค ์๊ฐ์ด ์ง๋ ํ์ 1ํ ํน์ ์ฝ๋๋ฅผ ์คํํ๋ ๋ฐฉ๋ฒ ๋น๋๊ธฐ ํจ์ setTimeout์ด ๋น๋๊ธฐ์ฒ๋ฆฌ๊ฐ ๊ฐ๋ฅํ ์ด์ ๋ JS์์ง์ด ์๋๋ผ WebAPI์์ ์ฒ๋ฆฌ๋ฅผ ํ๋ค. ์ด๋ฅผ ํตํด์ ์ฑ๊ธ์ค๋ ๋์ธ JS์์ ๋น๋๊ธฐ์ ์ธ ์ฒ๋ฆฌ๊ฐ ๊ฐ๋ฅํ๊ฒ ๋๋ค. setInterval ์ง์ ํด.. 2024. 1. 16. styled-components๋ฌด์์ tailwind CSS ๋์ ๊ธฐ - 1 ๐TL; DR ์๋๋ styled-components๋ฅผ ์ฃผ๋ก ์ฌ์ฉํ๋ค. ๋์์ธ์์คํ ๊ตฌ์ถ์ ํ๋ฉฐ styled-components์ ํ๊ณ๋ฅผ ๋๊ผ๋ค. tailwind CSS๋ฅผ ๋์ ํ๋ค. ์์ง์ ํผ๋์ค๋ฝ๋ค.. tailwind CSS๋ฅผ '์ ์ฐ๋' ๋ฐฉ๋ฒ์ ๋ชจ์์ค์ด๋ค styled-components๋ฅผ ์ฌ์ฉํ๋ ์ด์ ์คํ์ผ๋ ์ปดํฌ๋ํธ๋ฅผ ์ฌ์ฉํ๋ ์ด์ ๋ '์ปดํฌ๋ํธํ'์ ์์๋ค. ์ปดํฌ๋ํธํํ๋ ๊ฑธ ์ข์ํ๊ธฐ๋ ํ๊ณ , ์ปดํฌ๋ํธ ์ด๋ฆ์ ๋ช ์ํ๋ฉด์ ๋ช ํํ ํด๋น ํ๊ทธ์ ์ญํ ์ด ๋๋ฌ๋๋ค๋ ์ ๋ ์ข์๋ค. ์ด ์ ์ ๋ฒ๊ทธ ํฝ์ฑ์๋ ๊ต์ฅํ ๊ฐํธํจ์ ๋๋ผ๊ฒ ํด์คฌ๋ค. (๋ฌธ์ ์ ์์ธ์ ์ฐพ๋ ๋ถ๋ถ์์ ๋ช ์์ฑ์ ์ฅ์ ) ๊ทธ๋ฆฌ๊ณ props๋ก ์กฐ๊ฑด๋ถ ์คํ์ผ๋ง์ ์ฅ์ ๋ ๋งค์ฐ ์ข์๋ค. ๋ฐ๋ณต๋๋ ์ปดํฌ๋ํธ์์ ์๊น๋ง ๋ฐ๋๋ ๊ฒฝ์ฐ๋ฅผ ๋ง์ด ๋ดค๊ณ , ๋ฐ๋ณต๋๋ ์ฝ๋.. 2024. 1. 8. ๊ณผ์ฐ ๋๊ตฌ๋ฅผ ์ํ ์น ์ ๊ทผ์ฑ์ธ๊ฐ 11์ 7์ผ์ ์น ์ ๊ทผ์ฑ์ ๋ํ ๊ฐ์ฐ์ ๋ฃ๊ณ ์๋ค. ์ง์ง ๋ง์ ๊ฑธ ์ป์๋ ๊ฐ์์๋ค. ์๋ํ๋ฉด ๋๋ ์ ์ด์ ์๋ชป ์๊ณ ์์๋ ๊ฐ๋ ์ด์๊ธฐ ๋๋ฌธ์ด๋ค. ์ฐฝํผํ์ง๋ง, ์ ๋ณด ์ ๊ทผ์ฑ์ด๋ผ๋ ๋ง์ ๋ณด์ ๊ด๋ จ ๋ฌธ์ ๋ฅผ ๋ค๋ฃฌ๋ค๊ณ ์๊ฐํ๋ ๋๋ ๋จธ๋ฆฌ๋ฅผ ๋~~ ๋ง์๋ค. ์ด๋ฒ ๊ธฐํ์ ์๋ชป๋ ์ง์์ ๋ฐ๋ก ์ก์ ์ ์์ด์ ๋๋ฌด ์ข์๋ค. ์๋ ๋ด์ฉ์ ๊ฐ์ฐ์ ๋ค์ผ๋ฉด์ ์ ๋ฆฌํ ๋ด์ฉ์ด๋ค. ๋์ฒ๋ผ '์น ์ ๊ทผ์ฑ'์ ๋ํด์ ์ ๋ชจ๋ฅธ๋ค๊ฑฐ๋, ๋ค์ด๋ง ๋ณธ ์ฌ๋์ด ์ฐธ๊ณ ํ๋ฉด ์ข์ ๊ฒ ๊ฐ๋ค. ๋ง์ฝ, ์ ๊ทผ์ฑ์ ๋ํด์ ์กฐ๊ธ ์๊ณ ์๋ค๋ฉด ์๋ ์ง๋ฌธ์ ํ ๋ฒ ๋ตํด๋ณด๋ ๊ฒ ์ข์ ๊ฒ ๊ฐ๋ค. ์๋น์ค๋ฅผ ๋ง๋ค๋ ์ ๊ทผ์ฑ์ ์ด๋์ ๋ ๊ฐ์น๋ฅผ ๋๋๊ฐ? ์ ๊ทผ์ฑ์ ์ค์์ฑ๊ณผ ํ์์ฑ์ ์๋์ง ์๋น์ค ๊ฐ๋ฐ ํ๋ก์ธ์ค์์ ๊ณ ๋ คํ๊ณ ์๋์ง ๋ด๊ฐ ๋ง๋ ์๋น์ค๋ฅผ ์ฅ์ ์ธ์ด ์ฌ์ฉํ๋ค๊ณ ๊ฐ์ ํ์๋, ์ด.. 2023. 11. 22. [โ๏ธํธ๋ฌ๋ธ์ํ ] useEffect ๋ด setState ๋ฌดํ๋ฃจํ ์๋ ๋ฌธ์ ๊ฐ ์๋ ์ฝ๋์ ์ด๋ฒ์ border๋ฅผ linear๋ก ๋ฐ๊พธ๋ฉด์ setํจ์๋ฅผ ๋ฐฐ์ด๋ก ๋๊ฐ ๋ฃ์ด์ฃผ๋ค๋ณด๋ ์๋ฌ๊ฐ ๋ฐ์ํ๋ค. # ์๋ ์ฝ๋ useEffect(() => { if (isPost.data?.isAllSeen == false) { for (let i = 0; i < isPost.data?.seenPostList.length; i++) { if (isPost.data?.seenPostList[i].isSeen == false) { if (isPost.data?.seenPostList[i].isPublic == true) { setBorderColor(['#6935FD', '#9747FF']); setIndex(i); break; } if (isPost.data?.seenPostList[i].is.. 2023. 10. 5. ์ด์ 1 2 3 4 ยทยทยท 6 ๋ค์ ๋ฐ์ํ