๊ณตํต ์ปดํฌ๋ํธ๋ฅผ ๋ง๋ค๋ค ๋ณด๋ฉด ์์ฃผ ๊ฒช๊ฒ ๋๋ ํ๋ฆ์ด ์๋ค.
์ฒ์์๋ ์ ์๋ํ๋ ๊ฒ์ฒ๋ผ ๋ณด์ด์ง๋ง, ์๊ฐ์ด ์ง๋จ์ ๋ฐ๋ผ ์์ธกํ์ง ๋ชปํ๋ ๊ธฐํ ์๊ตฌ๊ฐ ์ถ๊ฐ๋๊ณ , ๋ค์ํ ํ๊ฒฝ์์ ์ฌ์ฌ์ฉ๋๋ฉด์ props๋ ์ ์ ๋์ด๋๊ณ ๋ด๋ถ ๋ก์ง๋ ํจ๊ป ๋ณต์กํด์ง๋ ๊ฒฝ์ฐ๊ฐ ๋ง๋ค. ๊ทธ๋์ ํฅํ ์ด๋ค ์กฐ๊ฑด์ด ๋ํด์ง์ง๋ ์์ธกํ ์ ์์ง๋ง, ์ต์ํ ์ด๊ธฐ ์ค๊ณ ๋จ๊ณ์์๋ ๋ด๋ถ์์ ๋ชจ๋ ์ ์ฑ
์ ์ฒ๋ฆฌํ๋ ๋ฐฉํฅ์ผ๋ก ๊ตฌํํ๊ณ ์ถ์ ๋ง์์ด ๋ ์๋ค.
๋ฌผ๋ก ๊ณตํตํ๊ฐ ์ธ์ ๋ ์ ๋ต์ด๋ผ๊ณ ์๊ฐํ์ง๋ ์๋๋ค. ๊ธํ ์ผ์ ์์์ ๊ฐ๋ฐํ๊ฑฐ๋ ๊ธฐํ์ด 1์ฐจ, 2์ฐจ๋ก ๋๋ ์ง๋ ๊ฒฝ์ฐ์๋ ์ฃ๋ถ๋ฅธ ๊ณตํตํ๋ณด๋ค๋ ์ต๋ํ ์ ์ฝํ๋ ์ฝ๋๋ฅผ ์ฐ์ ์ผ๋ก ๊ฐ๋ฐํ ๋ค, ๋์ค์ ํผ์ ๋ฆฌํฉํ ๋งํ๋ ์์ผ๋ก ์ ๊ทผํ๋ค.
์ด๋ฒ์ ๊ฐ๋ฐํ ๊ธฐ๋ฅ์ ์ ๋ ฅ์ฐฝ ์์ ๋ฒํผ์ ๋ถ์ด๊ณ , ๋ฒํผ ํด๋ฆญ ์ ํ ์คํธ ์ธ์ ๊ฒฐ๊ณผ๋ฅผ ์ ๋ ฅ ํ๋์ ๋ฐ์ํ๋ OCR ๊ธฐ๋ฅ์ด์๋๋ฐ, ๊ณตํตํํด์ผ ํ ๋ถ๋ถ์ด ๋ช ํํ๊ณ ์์๊ธฐ์ ์ฒ์๋ถํฐ ์ต๋ํ ๋ด๋ถ์์ ๋ชจ๋ ์ ์ฑ ์ ๊ฐ์ธ๋ ๊ณตํต ์ปดํฌ๋ํธ๋ก ๊ตฌํํด๋ณด๊ณ ์ ํ๋ค.
๊ธฐ๋ฅ ์์ฒด๋ ๋จ์ํด ๋ณด์ผ ์ ์์ง๋ง ๋ค์๊ณผ ๊ฐ์ ์กฐ๊ฑด๋ค์ ํจ๊ป ๋ง์กฑํด์ผ ํ๋ค.
- ๋ฒํผ์ ์ ๋ ฅ ํ๋์ ํฌ์ปค์ค ๋์์ ๋๋ง ๋ ธ์ถ๋์ด์ผ ํจ
- ํด๋ฆญ ์ ํ์ค๋ฒ ํํ์ UI๊ฐ ํ์๋๊ณ , ๊ทธ ์์๋ ์ ์ฑ ์กฐ๊ฑด์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๋ ์ธ๋ถ ๋ก์ง์ด ์กด์ฌํจ
- ๋ฒํผ ํด๋ฆญ ๊ฒฐ๊ณผ๋ ์ธ๋ถ๋ก ์ฝ๋ฐฑ ํํ๋ก ์ ๋ฌ๋์ด์ผ ํจ
- ๋ง์นจํ, ์ค ๋ฐ๊ฟ ๋ฑ์ ๊ธฐํธ๋ฅผ ์ฝ์ ํ ์ ์๋ ์ ๋ ฅ ๋ณด์กฐ ๋ฒํผ ํจ๋์ด ํจ๊ป ๋์ํด์ผ ํจ
cloneElement ํ์ฉํ๊ธฐ
์ด๊ธฐ์๋ children์ ๋ฐ์ cloneElement๋ก ๊ฐ์ธ๋ ๋ฐฉ์์ผ๋ก ๊ตฌํํด ๋ณด์๋๋ฐ, ์ค์ ๋ก ์ ์ฉํด ๋ณด๋ ์ฌ๋ฌ ๋ฌธ์ ๊ฐ ๋๋ฌ๋ฌ๋ค.
React.cloneElement(children, {
onFocus: handleFocus,
onBlur: handleBlur,
ref: inputRef,
});
์ค์ ๋ก ๋ถ๋ชํ ๋ฌธ์ ๋ค
- ์ผ๋จ children์ด ๋จ์ผ ์์๋ผ๋ ๋ณด์ฅ์ด ์์๋ค.
- ์ค์ ๋ ๋๋ง๋๋ ์ปดํฌ๋ํธ๋ค ์ค ์ผ๋ถ๋ ์ ๋ ฅ ์์๊ฐ ํ๋๋ก ๊ณ ์ ๋์ด ์๋ ๊ฒ์ด ์๋๋ผ, ํด๋น ์ปดํฌ๋ํธ ๋ด๋ถ์์ ์กฐ๊ฑด ๋ถ๊ธฐ๋ฅผ ํตํด ์๋ก ๋ค๋ฅธ input / textarea ๊ฐ ๋ ๋๋ง๋๋ ๊ตฌ์กฐ์๋ค.
- ์ด๋ฏธ ์ธ๋ถ์์ onFocus, onBlur, ref๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ๊ฐ ์์ด ์ถฉ๋์ด ๋ฐ์ํจ.
๊ฒฐ๊ตญ cloneElement๋ ๊ตฌ์กฐ๊ฐ ์์ธก ๊ฐ๋ฅํ ๋จ์ํ ์ํฉ์์๋ ๊ด์ฐฎ์ง๋ง, ์ง๊ธ์ฒ๋ผ ๋ค์ํ ๊ตฌ์กฐ์์๋ ์คํ๋ ค ๋ ๋ง์ ์ ์ฝ์ ๋ฐ์์ํจ๋ค๋ ๊ฒ์ ์๊ฒ ๋์๋ค.
๋ด๋ถ ํ์ ๋ฐฉ์
์ธ๋ถ ๊ตฌ์กฐ์ ์์กดํ์ง ์๊ณ , ์ปดํฌ๋ํธ ๋ด๋ถ์์ ์ ๋ ฅ ํ๋๋ฅผ ์ง์ ํ์ํ๋ ๋ฐฉ์์ผ๋ก ์ ํํ๋ค.
const inputElement =
containerRef.current?.querySelector('input') ||
containerRef.current?.querySelector('textarea');
containerRef๋ฅผ ๊ธฐ์ค์ผ๋ก ๋ด๋ถ์์ ๊ฐ์ฅ ๊ฐ๊น์ด input ๋๋ textarea ์์๋ฅผ ํ์ํด focus ์ด๋ฒคํธ๋ฅผ ๊ฐ์งํ๊ณ , ๋ฒํผ ๋ ธ์ถ ์ฌ๋ถ๋ฅผ ๊ฒฐ์ ํ๋๋ก ํ์๋ค.
- ์ธ๋ถ์์ ref๋ฅผ ๋๊ธฐ์ง ์์๋ ๋จ
- ๊ตฌ์กฐ๊ฐ ๋ณต์กํด์ ธ๋ ๋ด๋ถ์์ ํ์ ๊ฐ๋ฅ
- ํฌ์ปค์ค ๊ฐ์ง, ๋ ๋๋ง ์กฐ๊ฑด, ๋ฒํผ ์์น ๋ฑ ๋ชจ๋ ํ๋จ์ ๋ด๋ถ์์ ์ฒ๋ฆฌ
์ ๋ ฅ ๋ณด์กฐ ํจ๋ ์ญ์ ๊ฐ์ ๊ตฌ์กฐ๋ก ์๋ํ๋๋ก ๋ง๋ค์๋ค. ref๋ฅผ ๋๊ฒจ๋ฐ๋ ๋์ , ๋์ผํ๊ฒ containerRef.current?. querySelector(...)๋ฅผ ์ฌ์ฉํด ์ ๋ ฅ ํ๋๋ฅผ ํ์ํ๊ณ , ํน์ ๋ฒํผ ํด๋ฆญ ์ ๋ด๋ถ์์ ์ ๋ ฅ ๊ฐ์ ์กฐ์ํ๊ณ ์ด๋ฒคํธ๋ฅผ ํธ๋ฆฌ๊ฑฐํ๋๋ก ๋ง๋ค์๋ค.
<EditorFieldWrapper>
<input type="text" />
</EditorFieldWrapper>
'๐ WIL' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๋ชจ๋ ธ๋ ํฌ์์ ์ค์ ๊ณตํตํํ๊ธฐ (1) | 2025.05.30 |
---|---|
React ๋ฒ๋ค ์ต์ ํ ์์ฝ (0) | 2025.05.25 |
ํจ์จ์ ์ธ DOM ์กฐ์์ผ๋ก ์ฑ๋ฅ ์ต์ ํํ๊ธฐ (0) | 2025.04.27 |
requestAnimationFrame ์ผ๋ก ํ๋ ์ ํ์ด๋ฐ ๋ง์ถ๊ธฐ (0) | 2025.03.30 |
๐ ๋ฆฌ๋ ๋๋ง ์ด์ ํด๊ฒฐํ๊ธฐ (0) | 2025.03.23 |