// top 버튼 컴포넌트 이벤트 예시// ...// 클릭 시, 화면 최상단으로 스크롤 시키기consthandleTopBtn=()=>{
window.scrollTo({
top:0,
behavior:"smooth"})}// ...return(<TopBtnWrapperonClick={handleTopBtn}><StaticImagesrc="../../images/up-arrow.svg"alt="top"css={upArrow}/></TopBtnWrapper>);
4. 조건부 렌더링 - useState, useEffect
3번까지 작성될 경우, 기본적인 top 버튼이 생성되어 작동되지만, 화면의 상단부에 있을 경우에는 안 보이도록 처리하고 싶었다.
따라서 useState로 버튼 보임의 상태를 관리하고, useEffect로 마운트 시, 스크롤 이벤트를 생성하고 언마운트 시, 메모리 절약을 위해 이벤트를 삭제하도록 처리하였다.
스크롤 이벤트는 200px을 내리면 보이고, 그 위로는 안 보이도록 window.scrollY를 이용해 분기 처리하였다.
// top 버튼 컴포넌트 조건부 렌더링 예시import{FC, useEffect, useState }from"react";// ...// 버튼을 보여줄지에 대한 상태를 boolean 값으로 관리const[showBtn, setShowBtn]=useState(false);// 화면 마운트 시, 스크롤 이벤트 생성// 스크롤을 200px 내리면 true로 올리면 false로 전환useEffect(()=>{consthandleShowBtn=()=>{if(window.scrollY >200){setShowBtn(true)}else{setShowBtn(false)}}
window.addEventListener("scroll", handleShowBtn)return()=>{
window.removeEventListener("scroll", handleShowBtn)}});// ...// showBtn 값이 true이면 버튼이 렌더링되도록 하기
showBtn &&(<TopBtnWrapperonClick={handleTopBtn}><StaticImagesrc="../../images/up-arrow.svg"alt="top"css={upArrow}/></TopBtnWrapper>)
에러
showBtn && <...> 이 부분에서 false가 리턴될 수 있음 => 컴포넌트가 boolean 값을 리턴하지 않도록 처리해야 함
5. 에러 해결하기
// top 버튼 컴포넌트 에러 처리 예시//...if(!showBtn){returnnull;// 이 부분을 추가해서 boolean 타입이 아닌 JSX.Element 타입을 반환하도록 함}return(<TopBtnWrapperonClick={handleTopBtn}><StaticImagesrc="../../images/up-arrow.svg"alt="top"css={upArrow}/></TopBtnWrapper>)