[React] input tag์ ์กฐ๊ฑด์ ๋ฐ๋ฅธ focus ์ด๋ ์์ ๊ด๋ จ ์๋ฌธ ์ฌํญ ๐ค(#useEffect, #onChange)
์ด๋ค ์น์ฌ์ดํธ์์ form์ ์ ๋ ฅํ ๋ ์ ๋ ฅ์ด ๋ชจ๋ ์๋ฃ๋๋ฉด ์๋์ผ๋ก ๋ค์ ์ ๋ ฅํด์ผ ํ๋ ๋น์นธ์ผ๋ก ๋์ด๊ฐ๋๋ก ๊ตฌํ๋ ์น์ฌ์ดํธ๊ฐ ๋ง๋ค. id์ pw๋ฅผ ์ ๋ ฅ๋ฐ์ ๋ id๋ฅผ 10์ ์ด์ ์ ๋ ฅํ๋ฉด pw ์ ๋ ฅ ์นธ์ผ๋ก ๋ฐ๋ก ๋์ด๊ฐ๋ ๊ธฐ๋ฅ์ ๊ตฌํํ๋ ์ค React์ ๋ฐฐ์น ์ ๋ฐ์ดํธ ํน์ฑ์ ์ ์ด๋ ค์ ๊ตฌํ๋์๋์ง ์๋ฌธ์ด ๋ค์๋ค.
๊ตฌํ
App.js์ App() ์ปดํฌ๋ํธ์์ return ํ๋ input tag๋ฅผ ๋ค์๊ณผ ๊ฐ์ด ๊ตฌํํ ์ ์๋ค.
function App() {
...
useEffect(() => {
if (id.length >= 10) {
pwRef.current.focus();
}
}, [id]);
return (
<>
<div>
์์ด๋ :
<input
type="text"
ref={idRef}
value={id}
onChange={onIdChangeHandler}
/>
</div>
<div>
๋น๋ฐ๋ฒํธ : <input type="password" ref={pwRef} />
</div>
</>
);
}
id input tag์์ onChange ์์ฑ์ผ๋ก onIdChangeHandler๋ฅผ ํธ์ถํ ์ ์๊ณ , input tag์ ref ์์ฑ์ ์ถ๊ฐํ๋ค. ์ด ref๋ก focusํ tag๋ฅผ ์ง์ ํ๊ฒ ๋๋ค.
function App() {
const idRef = useRef("");
const pwRef = useRef("");
const [id, setId] = useState("");
const onIdChangeHandler = (event) => {
setId(event.target.value);
};
useEffect(() => {
idRef.current.focus();
}, []);
useEffect(() => {
if (id.length >= 10) {
pwRef.current.focus();
}
}, [id]);
return (
<>
<div>
์์ด๋ :
...
}
onIdChangeHandler๊ฐ ํธ์ถ๋๋ฉด, setId(event.target.value)๋ก state ๋ณ๊ฒฝ์ด ์ผ์ด๋๋ค. ์ด๋ state ๋ณ๊ฒฝ์ผ๋ก ์ธํ ๋ฆฌ๋ ๋๋ง์ด ์ผ์ด๋๋ค. ๋ฆฌ๋ ๋๋ง ์ useEffect()๊ฐ ์คํ๋๊ณ , ์กฐ๊ฑด์ ๋ถํฉํ ๊ฒฝ์ฐ focus ์ด๋์ด ์ผ์ด๋๋ค(pwRef.current.focus()).
๐ค
ํ์ฌ ์ฝ๋์์๋ useEffect() ๋ด๋ถ์์ id์ length๋ฅผ ๊ณ์ฐํ์ฌ ์กฐ๊ฑด์ ๊ฒ์ฌํ๋ค. ์กฐ๊ฑด ๊ฒ์ฌ๋ฅผ useEffect์์ ํ๋ ์ด์ ๋ React์ ๋ฐฐ์น ์ ๋ฐ์ดํธ์ ์ํ ํจ์จ์ฑ์ ์ ๊ณ ํ๊ธฐ ์ํด์๋ผ๊ณ ํ๋ค.
๋ด๊ฐ ์๊ฐํ๊ธฐ์ onIdChangeHandler() ํจ์ ๋ด๋ถ์์ setId()๋ก state๋ฅผ ๋ณ๊ฒฝํ๊ธฐ ์ ์ ์กฐ๊ฑด ๊ฒ์ฌ๋ฅผ ํด์ผ, ๋ถํ์ํ ๋ฆฌ๋ ๋๋ง์ด ์ผ์ด๋์ง ์์ ๊ฒ ๊ฐ์๋ฐ, ๊ต์ฌ์์๋ ์์ ๊ฐ์ ๋ฐฉ์์ผ๋ก ๊ฐ๋ฅํ๋ค๊ณ ํ๋ค.
๊ด๋ จํ์ฌ ๋ด์ผ ์ข ๋ ๋๊ธฐ๋ค๊ณผ ์๊ธธ ๋๋ ๋ด์ผ๊ฒ ๋ค.