버튼을 클릭했을 때 모달창이 뜨고 다시 버튼을 클릭했을 때 모달창이 사라지게 하려면 어떻게 해야 할까? 🤔

자바스크립트로 작성 시 변수에 값을 저장하고 재사용할 때마다, 즉 변수 값이 바뀔 때마다 html을 직접 렌더링 해줘야 했다.
ex. document.getElementById('box').innerText = ~~
하지만 리액트에는 html 재렌더링 과정을 자동적으로 실행하는 state가 있다! 그만큼 코드 효율성이 좋아지는 이점이 있는 동시에 주의할 사항도 생긴다. 바로 값을 변경하려고 할 때 접근 방식이 달라져야 한다는 거다. 이젠 직접 html 요소에 접근할 필요가 없다.
대신 스위치 On/Off 하듯 state를 어떻게 변경할지 고민해야 한다. 지금 하려는 작업은 툴킷, 사이드바, 팝업창, 버튼 등의 구현 작업과 본질적으로 똑같다. 클릭하면 특정 component를 보여주고, 다시 클릭하면 그 component가 사라진다. 자바스크립트의 toggleClass 활용법과 유사하다고 느꼈다.
차근차근 문제를 해결해보자.
Modal component부터 만들자.
// app.js
function Modal(){
return (
<div className="box">
<h4>Title</h4>
<p>Contents</p>
<span>Date</span>
</div>
)
}
/* app.css */
.box {
width: 250px;
height: 200px;
background-color: antiquewhite;
text-align: left;
margin: 10px;
padding: 15px;
}
div에 간단한 속성을 넣어주어 위 움짤 같은 베이지 색 박스로 만들었다.
초기화면엔 Modal이 보이지 않아야 한다.
button에 onClick 이벤트를 걸어준다.
// app.js
function app() {
const [modal, setModal] = useState(false);
return (
// 버튼을 클릭하면 modal이 true로 바뀐다.
<button onClick={setModal(true)}>Modal Switch</button>
// modal이 true일 때만 component를 보여준다.
{
modal === true ? <Modal /> : null
}
</div>
)
}
여기까지 완성! 삼항 조건 연산자만 쓸 수 있단 점을 강의에서 듣고 해결할 수 있었다.
난관은 그 다음..
강의는 들었어도 프로그래밍 경험이 거의 없어선지 조건을 파악하고 적용하는 데에 오래 걸렸다. (1시간......) 답지를 너무너무 열어보고 싶었지만, 최소 하루는 고민해 보라는 말을 읽고 꾹 참았다.
아오 그냥 속시원하게 답 볼까? 마음이 근질거릴 때
- 마인드 세팅하기
ex. 모달은 여러모로 쓰이는 곳이 많으니까 첫 단추를 제대로 꿰어줘야 다른 곳에도 적용할 수 있다. 모두 다 내 힘으로 해결할 훗날을 위해 지금은 스스로 생각하기!- 수강생/공부 후기 구경
혼자 고민하고, 구글링 해보고, 하루 지나고 다시 해보며 실력이 늘었다는 심금 울리는 경험담이 꼭 있다. 그 결과를 위해서는 지금을 견디자.- 강의 다시 보기
분명 배운 내용에 해결 방법이 담겨있다. 필기하지 말고 눈과 귀를 열에 온 신경을 집중 해본다.- 관련 키워드 구글링
공식문서의 설명과 예시를 보는 게 좋은 것 같다. 개인 블로그 글은 대놓고 답 코드가 있는 경우가 다반사라서..
setModal과 modal에 다른 값이 담기는 줄
state를 선언할 때 배열의 두번째 변수는 전자의 값을 바꿔주는 함수를 담은 것이다. 이 경우엔 setModal이 modal값을 바꿔주는 함수다. 곧 setModal(true)를 입력하는 순간 modal 값도 true! 이걸 헷갈려서 오래 삽질했다.
그럼 어느 부분을 건드려야 하지?
강의에서 조건식이라는 힌트는 얻었는데.. 1번을 해결하며 작성한 조건식은 Modal 보여주기/안 보이기에 대한 내용이었다. 그런데 Modal이 on이었을 때와 off일 때를 구분해서 조건식을 넣어주려면 onClick 부분을 수정해야 할 것 같은데?
onClick의 setModal을 어떻게 바꿀까?
modal===true ? <Modal /> : null과 형태는 거의 동일하다.
다만 클릭할 때 / 모달이 true면 / 모달을 false로 값을 바꿔주고 / 그렇지 않으면 모달을 true로 바꾼다. 즉 setModal 함수 안에 조건식을, 조건의 참과 거짓 실행문에 setModal(false)와 setModal(true)를 넣어줘야겠는데?
머리를 쥐어 뜯는 고민 끝에 답을 냈다.
// button과 조건식 부분만 작성
<button onClick={
()=>{modal === true ? setModal(false) : setModal(true)}
}>Modal Switch</button>
{
modal === true ? <Modal /> : null
}
onClick={ 함수 }
1) 외부에 함수를 작성한 후 해당 함수명을 적거나
2) onClick={ ()=>{} } 로 작성한다. 물론 내부 함수를 재사용 할 것 같으면 기명함수로 적는 게 좋음!
작성하고 보니 얼떨떨했다. 분명 사고의 흐름을 거쳐 나온 결과였으나, 이게 왜 되는가 하면서 다시 코드를 되짚어보며 정리했다.
드디어 열어 본 답지에는 modal === true ? setModal(false) : setModal(true) 를 아주 간단히 만드는 방법이 있었다.
<button onClick={setModal(!modal)}>Modal Switch</button>
{
modal === true ? <Modal /> : null
}
모달은 기본적으로 on/off를 딸깍이는 거다. 이걸 if문의 참/거짓으로 로직화한 건데 참과 거짓에서 건드리는 부분이 동일(setModal)하고 그 결과값이 true/false라면, not 논리 연산자를 활용하기 좋다.
그래서setModal(!modal) 이거 하나로 저 조건식을 간결하게 표현할 수 있다.