Css 如果单击另一个元素,则使用react移除类
目前正在从jquery/php webapp升级到react。一切进展顺利,我理解react等背后的概念。我唯一找不到解决方法的问题是如何根据用户单击的位置动态添加/删除类。我需要这个,因为我有一些下拉列表,当用户点击它时会触发,如果他们点击其他地方,需要隐藏 发件人: 我举了这个例子,因为它是问题的简单Jquery解决方案:Css 如果单击另一个元素,则使用react移除类,css,reactjs,Css,Reactjs,目前正在从jquery/php webapp升级到react。一切进展顺利,我理解react等背后的概念。我唯一找不到解决方法的问题是如何根据用户单击的位置动态添加/删除类。我需要这个,因为我有一些下拉列表,当用户点击它时会触发,如果他们点击其他地方,需要隐藏 发件人: 我举了这个例子,因为它是问题的简单Jquery解决方案: var h2 = $("h2 a"); h2.on("click", function() { if ($(this).is(".selected")) {
var h2 = $("h2 a");
h2.on("click", function() {
if ($(this).is(".selected")) {
$(this).removeClass("selected");
} else {
h2.removeClass("selected")
.filter(this).addClass("selected")
}
});
如何在react(和/或redux)中模拟相同的功能?
图像进一步澄清
问题是,您希望在单击事件上切换一些数据,并相应地更改html元素的类名 “选定”类所基于的数据可以来自任何地方,从父级或组件状态。您可以这样做:
<div className={ myData ? 'selected' : '' } ></div>
但是有一种更好的方法可以通过类名库显示类名更改。完成同样的事情如下:
<div className={ classNames({ 'selected' : myData }) } ></div>
到目前为止,我们已经了解了如何显示渲染函数的更改。您需要做的第二件事是侦听click事件并启动函数,该函数最终将切换控制“selected”类名的数据,在我的示例“myData”中
下面是一个工作示例,可能有多种方法来实现这一点。但我强烈建议使用库来切换类名
当另一个元素(除了我们观察到的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>
)
}
}
例如:
从“React”导入React,{Component}
从“classNames”导入类名
类下拉列表扩展组件{
建造师(道具){
超级(道具)
此.state={
所选活动项:“”
}
this.handleClick=this.handleClick.bind(this)
}
componentDidMount(){
global.document.addEventListener('click',this.handleClick,false)
}
组件将卸载(){
global.document.removeEventListener('click',this.handleClick,false)
}
handleClick(事件){
if(event.target.className.includes('not-changing-css-class')&&
this.state.activeSelected!=''
)this.setState({activeSelected:''})
}
render(){
让{activeSelected}=this.state
返回(
- this.setState({activeSelected:activeSelected==='item1'?'''item1'})}
>
项目1
- this.setState({activeSelected:activeSelected==='item2'?'''item2'})}
>
项目2
- this.setState({activeSelected:activeSelected==='item3'?'''item3'})}
>
项目3
)
}
}
您可以在组件状态下保存选定的元素索引(或ID,如果使用ID)。如果您认为此状态与应用程序中的任何其他组件相关,则可以使用redux应用商店,但从状态开始更简单
一旦你有了这种状态。通过与组件状态进行比较,可以在render()
函数中检查链接是否被选中。单击链接时,您还将更新selectedIndex
呈现链接的简单示例如下所示。注意,您可以将这些函数的一部分提取为函数,而不是在JSX中使用表达式
```
allLinks.map((链接,索引)=>
)
```wll如果用户单击其他位置(即不在这3项中的一项上),这也会删除所选的
类?你是什么意思?只有当有人单击我代码中的li元素时,才会发生这些切换。我理解,但是如果他们单击页面上的另一个元素呢?下拉列表仍将选择类
。他们需要手动关闭它,这是我想要避免的。如果我有不止一个地方可以实现这一点,这会起作用吗?让我们一起来。我不确定使用map()创建所有链接是否明智,因为有些链接显然可以通过ajax调用创建。不确定你的应用程序,但如果你不想使用map,您可以继续使用数据-
属性或ID,而不是在回答中提到的状态下保存索引。
allLinks.map( (link, index) =>
<a href={link.target} className={this.state.selectedIndex === index ? 'selected' : null}/>
)