๐จ ๋ฌธ์ ์ํฉ
์ธ์คํ๊ทธ๋จ์ ํด๋ก ์ฝ๋ฉํ๋ ๊ณผ์ ์์ ๋ฐ๋๋ผ JS๋ก DOM ์์์ ์ ๊ทผํ ํ ํด๋์ค๋ฅผ ์ถ๊ฐํ๊ณ ์ ๊ฑฐํ๋ ๋ฐ classList์ add, remove ๋ฉ์๋๋ฅผ ํ์ฉํ์๋ค. ๊ทธ๋ฌ๋ ์ด ์ฝ๋๋ฅผ React๋ก ๋ณํํ๋ ๊ณผ์ ์์๋ classList๋ฅผ ๊ทธ๋๋ก ์ฌ์ฉํ์๋๋ ์ ์์ ์ผ๋ก ๋์ํ์ง ์๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค.
๊ทธ๋์ console.log()๋ฅผ ํตํด React์์๋ classList ํจ์๊ฐ ์ ๋๋ก ๋์ํ๋ ์ง ํ ๋ฒ ์คํํด๋ณด์๋๋ฐ, ํด๋์ค๊ฐ ์ ๋๋ก ์ ๊ฑฐ๋๊ณ ์ถ๊ฐ๋จ์ ํ์ธํ ์ ์์๋ค. ํ์ง๋ง ์ ๋๋ก ๋์ํ๋ ์ฝ๋์ ๋ฌ๋ฆฌ ํ๋ฉด์ ๋ณด์ด๋ ๊ฒฐ๊ณผ๋ ๊ทธ๋ ์ง ์์๋ค.
(๋์์ด ๋๋ ํด๋์ค๊ฐ opacity: 0.6 ์คํ์ผ ์์ฑ์ด ๋ถ์ฌ๋ ํด๋์ค๋ผ, ๊ฒฐ๊ณผ๋ฅผ ํ๋ฉด์์ ๋ฐ๋ก ํ์ธํ ์ ์๋ ์ํฉ์ด์๋ค.)
// SyLogin.js
const loginBtn = document.querySelector(".first-box__login-form__btn");
const opacityClass = "opacity";
function btnActivate() {
if (isIdVaild && isPwVaild) {
loginBtn.classList.remove(opacityClass);
allVaild = true;
} else {
loginBtn.classList.add(opacityClass);
allVaild = false;
}
}
/* Login.scss */
.opacity {
opacity: 0.6;
}
๐ก ๋ฌธ์ ํด๊ฒฐ ๋ฐ ๊ณผ์
React์์๋ classList๋ฅผ ์ฌ์ฉํ๋ฉด ์ ๋๋์ง ๊ตฌ๊ธ์ ๊ฒ์์ ํด๋ณด์๋ค. (๊ฒ์ ํค์๋ : 'react classlist')
๊ทธ๋ฆฌ๊ณ ๋ค์ ๋ ์๋ฃ๋ฅผ ํตํด ํด๋น ๋ฌธ์ ์ ์์ธ์ ํ์ ํ๊ณ ํด๊ฒฐํ ์ ์์๋ค.
[Stack Overflow] adding and removing a classList in react js
[๋ธ๋ก๊ทธ ํฌ์คํธ] [๋ฒ์ญ] ์ฃผ๋์ด React ๊ฐ๋ฐ์๋ค์ ์ค์๋ค (๊ทธ๋ฆฌ๊ณ ๊ทธ๋ค์ ํผํ๋ ๋ฐฉ๋ฒ)
React๋ ๊ฐ์ DOM์ ์์ฑํ ํ ์ด๋ฅผ ์ค์ DOM๊ณผ ๋น๊ตํ๊ณ ๋ฌ๋ผ์ง ๋ถ๋ถ๋ง์ ์ค์ DOM์ ๋ฐ์ํ๋ ๋ฐฉ์์ผ๋ก ๋ ๋๋ง์ด ์ด๋ฃจ์ด์ง๋ค. ์ด๋ฐ ๋ฐฉ์์ ํตํด ๋ ๋๋ง ๊ณผ์ ์ ์ต์ํํ๋ค. ๊ทธ๋ฐ๋ฐ ๋ง์ฝ ์คํฌ๋ฆฝํธ ์ฝ๋๋ฅผ ํตํด ์ง์ DOM์ ์ ๊ทผํด๋ฒ๋ฆฐ๋ค๋ฉด ๋ถํ์ํ ๋ ๋๋ง์ด ๋ฐ์ํ ๋ฟ๋ง ์๋๋ผ, ์น ์ ํ๋ฆฌ์ผ์ด์ ์ DOM ๋ด๋ถ์ React ๋ด๋ถ์ ์ํ๊ฐ ํผํฉ๋์ด ๋ฒ๋ฆฌ๊ธฐ ๋๋ฌธ์ ์ ์ง๋ณด์๊ฐ ๊น๋ค๋ก์์ง๋ ๋ฌธ์ ์ ์ด ๋ฐ์ํ๋ค. ๋ฐ๋ผ์ React์์ ์ง์ ์ ์ธ DOM์ ์กฐ์์ ์ต๋ํ ์ํ๋ ๊ฒ์ด ์ข๋ค.
๋์ , ์๋์ฒ๋ผ JSX ํ๊ทธ์ className์ ์์ฑ๊ฐ์ ์ผํญ ์ฐ์ฐ์๋ฅผ ํ์ฉํ ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋๋ฅผ ์์ฑํด์ฃผ๋ ๋ฐฉ์์ผ๋ก ์ง์ ์ ์ธ DOM ์กฐ์ ์์ด ์ํ๋ ์์์ ํน์ ํด๋์ค์ ์ด๋ฆ์ ์ถ๊ฐํ๊ณ ์ ๊ฑฐํ ์ ์๋ค.
export default function Login() {
const [isAllVaild, setIsAllVaild] = useState(false);
...
return (
...
<button
className={`first-box__login-form__btn ${isAllVaild ? '' : 'opacity'}`}
onClick={() => handleBtnClick()}
>
๋ก๊ทธ์ธ
</button>
...
);
}
๐ฌ ๋๋ ์
์ฒ์์ผ๋ก ๋ฐ๋๋ผ JS๋ฅผ React๋ก ๋ณํํ๋ ์์ ์ ์งํํ๋ฉฐ ์ฌ๋ฌ ํฌ๊ณ ์์ ์ด๋ ค์๋ค์ ๋ง๋ฌ๊ณ , ์ด๋ฐ ์ด๋ ค์๋ค์ ํด๊ฒฐํด๊ฐ๋ฉฐ ๋ด๊ฐ ์กฐ๊ธ์ฉ ์ฑ์ฅํด๋๊ฐ๊ณ ์๋ค๋ ๋๋์ ๋ฐ์๋ค. ์ด๋ฒ์ ๋ง์ฃผํ๋ ๋ฌธ์ ๋ ๊ทธ ์ ๊น์ง ์์ง ๋ชปํ๋ ๋ด์ฉ์ด์๋๋ฐ, ์ด๋ฒ ๊ธฐํ๋ฅผ ํตํด React์์ ํด๋์ค๋ฅผ ๋์ ์ผ๋ก ์ถ๊ฐํ๊ณ ์ ๊ฑฐํ๋ ๋ฐฉ๋ฒ์ ํ์คํ ์ตํ ์ ์์ด ์ข์๋ค. ์ด์ ์ด ๋ด์ฉ์ ํ์คํ ๋ด ๊ฒ์ผ๋ก ๋ง๋ค ์ ์๋๋ก ๊ธฐํ๊ฐ ๋ ๋๋ง๋ค ์์ฃผ ๋ณต์ตํด์ฃผ์ด์ผ๊ฒ ๋ค.