상태가 필요한 요소는 클래스 이름을 추가 제거하는 기능이 필요하다. 이를 상태를 통해서 제어해보자.
import './AppNavigation.scss'
import React from 'react'
class AppNavigation extends React.Component {
constructor(props) {
super(props)
this.state = {
// hidden 속성을 제어하는 상태
isOpen: false,
// is-active를 추가 제거할 수 있도록 className 상태 설정
navClassName: 'appNavigation',
}
}
handleOpenNav = () => {
this.setState({
isOpen: true,
navClassName: 'appNavigation is-active'
})
}
handleCloseNav = () => {
this.setState({
isOpen: false,
navClassName: 'appNavigation',
})
}
render() {
return (
<>
<button
onClick={this.handleOpenNav}
className="resetButton is-open-menu"
type="button"
title="메뉴 열기"
aria-label="메뉴 열기"
>
<span className="ir"></span>
</button>
<nav className={this.state.navClassName} hidden={!this.state.isOpen}>
<h2 className="a11yHidden">메인 메뉴</h2>
<ul className="resetList">
{ ** }
</ul>
<button
onClick={this.handleCloseNav}
className="resetButton is-close-menu"
type="button"
title="메뉴 닫기"
aria-label="메뉴 닫기"
>
<span className="close" aria-hidden="true">
×
</span>
</button>
</nav>
</>
)
}
}
export default AppNavigation
handleOpenNav = () => {
this.setState(
{
isOpen: true,
},
() => {
window.setTimeout(() => {
this.setState({ navClassName: 'appNavigation is-active' })
}, 400)
}
)
}
handleCloseNav = () => {
this.setState(
{
navClassName: 'appNavigation',
},
() => {
window.setTimeout(() => {
this.setState({ isOpen: false })
}, 400)
}
)
}