728x90
*하루동안 새롭게 알게된 부분, 에러를 해결한 방법 등을 작성하는 개발일기입니다. 다른 사람에게도 설명해줄 수 있도록 제 머릿속에 넣기 위해 정리를 시작하게 되었습니다.
React 버튼 클릭 효과 유지하기
페이지 버튼이든 카테고리 버튼이든, 아래처럼 버튼을 클릭했을 때 style을 유지하고 싶은 경우가 있다.
클릭 효과를 유지하기 위한 방법은 여러가지가 있겠지만, 나는 클릭 이벤트 리스너를 붙여 classList를 추가해주고 지우는 방식을 택했다.
// 각 페이지 버튼마다 'pages'라는 클래스를 가지고 있다.
const pages = document.getElementsByClassName('pages');
const clickHandler = (e) => {
// 처음 로딩되었을 때는 1번 페이지에 선택되어 있어야 하기 때문에,
// 1번 페이지 버튼은 'first-page' 클래스를 가지고 있다.
// 만약, 클릭된 클래스 리스트에 first-page가 없다면 첫번째 페이지는
// 계속 선택되어 있을 필요가 없기 때문에 remove 해준다.
if (!e.target.classList.contains("first-page")) {
pages[1].classList.remove("first-page");
}
// 모든 페이지 버튼에서 활성 클래스인 'active-page'를 지워 초기화 해준다.
for (var i = 0; i < pages.length; i++) {
pages[i].classList.remove("active-page");
}
// 현재 클릭된 버튼에만 활성 클래스인 'active-page'를 붙여준다.
e.target.classList.add("active-page");
}
// 모든 pages 클래스를 가진 요소에 클릭 이벤트 리스너를 붙여주었다.
// 그래서 클릭 이벤트가 발생하면, clickHandler 함수가 실행된다.
const init= () => {
for (let i = 0; i < pages.length; i++) {
pages[i].addEventListener("click", clickHandler);
}
}
init();
- addEventListener - 특정 이벤트가 발생했을 때 특정 함수를 실행할 수 있게 해주는 기능. 여기서는 click 이벤트가 발생했을 때 clickHandler 함수를 실행해준다.
- document.getElementsByClassName(className) - HTML에서 있는 요소 중, 주어진 클래스명을 가진 모든 요소들을 배열에 담아 리턴해준다.
- e.target - 이벤트 객체의 타깃, 예를 들어, 2번 페이지를 눌렀다면 <li class="pages active-page" style="user-select: auto;">2</li>가 리턴된다.
728x90
'TIL_개발일기' 카테고리의 다른 글
[TIL_개발일기_210405] axios.defaults.baseurl / findOne (0) | 2021.04.06 |
---|---|
[TIL_개발일기_210326] table width 고정, 자동 줄바꿈 (0) | 2021.03.26 |
[TIL_개발일기_210323] React 게시판 최신순으로 정렬 (0) | 2021.03.23 |
[TIL_개발일기_210322] React에서 map 사용 시 key를 설정해줘야 하는 이유는 (0) | 2021.03.23 |
[TIL_개발일기_210320] Public key retrieval is not allowed 에러(allowPublicKeyRetrieval=true 추가해도 에러가 발생한다면) (0) | 2021.03.21 |