โ—ผ FrontEnd/ReactJS

[ReactJS] React๋กœ ์š”์†Œ์— ํด๋ž˜์Šค ์ถ”๊ฐ€ ๋ฐ ์ œ๊ฑฐํ•˜๊ธฐ (๋ถ€์ œ : React์—์„œ ์ง์ ‘ DOM์„ ์กฐ์ž‘ํ•˜์ง€ ์•Š๋„๋ก ํ•˜์ž)

SangYoonLee (SYL) 2022. 11. 4. 17:16
๋ฐ˜์‘ํ˜•

๐Ÿšจ ๋ฌธ์ œ ์ƒํ™ฉ

์ธ์Šคํƒ€๊ทธ๋žจ์„ ํด๋ก  ์ฝ”๋”ฉํ•˜๋Š” ๊ณผ์ •์—์„œ ๋ฐ”๋‹๋ผ 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์—์„œ ํด๋ž˜์Šค๋ฅผ ๋™์ ์œผ๋กœ ์ถ”๊ฐ€ํ•˜๊ณ  ์ œ๊ฑฐํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ํ™•์‹คํžˆ ์ตํž ์ˆ˜ ์žˆ์–ด ์ข‹์•˜๋‹ค. ์ด์ œ ์ด ๋‚ด์šฉ์„ ํ™•์‹คํžˆ ๋‚ด ๊ฒƒ์œผ๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋„๋ก ๊ธฐํšŒ๊ฐ€ ๋  ๋•Œ๋งˆ๋‹ค ์ž์ฃผ ๋ณต์Šตํ•ด์ฃผ์–ด์•ผ๊ฒ ๋‹ค.

 

๋ฐ˜์‘ํ˜•