问题是,您想在点击事件上切换一些数据并相应地更改 html 元素的类名。
“选择”类所依据的数据可能来自任何地方,来自父级或组件状态。你会做这样的事情:
<div className={ myData ? 'selected' : '' } ></div>
但是有一个更好的方法来显示类名的变化,这个库叫做类名。完成同样的事情:
<div className={ classNames({ 'selected' : myData }) } ></div>
到目前为止,我们已经了解了如何在渲染函数上显示更改。您需要做的第二件事是监听点击事件并触发函数,该函数最终将切换控制“选定”类名的数据,在我的示例中为“myData”。
这是一个工作示例,可能有多种方法可以完成此操作。但我强烈建议使用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>
)
}
}