명확합니다.
'선택한'클래스를 기반으로 한 데이터는 부모 또는 구성 요소 상태의 어느 곳에서나 올 수 있습니다.
<div className={ myData ? 'selected' : '' } ></div>
그러나 classname이라는 라이브러리로 클래스 이름을 변경하는 더 좋은 방법이 있습니다. 같은 일이 다음과 같이 수행됩니다 :
<div className={ classNames({ 'selected' : myData }) } ></div>
지금까지는 렌더링 기능의 변경 사항을 표시하는 방법을 살펴 보았습니다. 두 번째로해야 할 일은 click 이벤트를 듣고 'myData'에서 'selected'클래스 이름을 제어하는 데이터를 토글하는 함수를 실행하는 것입니다.
여기에 실제 예가 있습니다.이를 수행하는 방법에는 여러 가지가있을 수 있습니다. 그러나 클래스 이름을 토글하려면 classnames 라이브러리를 사용하는 것이 좋습니다.
다른 요소 (우리가 관찰 한 li 요소 제외)가 클릭되었을 때 클래스 제거에 대한 해결 방법은 클릭 이벤트 리스너가 해결할 수 있습니다.
For instance :
import React, { Component } from 'react'
import classNames from 'classnames'
class DropDown extends Component {
constructor(props){
super(props)
this.state = {
activeSelected : ''
}
this.handleClick = this.handleClick.bind(this)
}
componentDidMount(){
global.document.addEventListener('click', this.handleClick, false)
}
componentWillUnmount(){
global.document.removeEventListener('click', this.handleClick, false)
}
handleClick(event){
if(event.target.className.includes('not-changing-css-class') &&
this.state.activeSelected !== ''
) this.setState({ activeSelected : '' })
}
render(){
let { activeSelected } = this.state
return (
<ul>
<li
className={ classNames({
'not-changing-css-class' : true,
'selected' : activeSelected === 'item1'
}) }
onClick={ event => this.setState({ activeSelected : activeSelected === 'item1' ? '' : 'item1' }) }
>
Item 1
</li>
<li
className={ classNames({
'not-changing-css-class' : true,
'selected' : activeSelected === 'item2'
}) }
onClick={ event => this.setState({ activeSelected : activeSelected === 'item2' ? '' : 'item2' }) }
>
Item 2
</li>
<li
className={ classNames({
'not-changing-css-class' : true,
'selected' : activeSelected === 'item3'
}) }
onClick={ event => this.setState({ activeSelected : activeSelected === 'item3' ? '' : 'item3' }) }
>
Item 3
</li>
</ul>
)
}
}
WLL 사용자가 (그 3 개 항목 중 하나에 일명되지 않음) 다른 곳에서 클릭하면이 또한'selected' 클래스를 제거? – NealVDV
무슨 소리 야? 이 토글 링은 누군가 내 코드에서 li 요소를 클릭 할 때만 발생합니다. – FurkanO
페이지에서 다른 요소를 클릭하면 어떻게됩니까? 드롭 다운에는 여전히'selected' 클래스가 있습니다. 그들은 그것을 수동으로 닫아야 할 것이고 그것은 내가 피하기를 원하는 것입니다. – NealVDV