【问题标题】:Reactjs siblings class toggleReactjs 兄弟类切换
【发布时间】:2017-08-12 09:26:25
【问题描述】:

我不想使用两个类

当按钮悬停时,如何使同级框显示为绿色?

目前所有的框都悬停在绿色上。

下面是带有sn-p的代码。

提前感谢您的帮助。

class Lol extends React.Component{
  constructor(props){
    super(props)
    this.state = {
      green : false
    };
  }
  render = () =>{
    let green = (this.state.green) ? 'green' : '';
    let outs = [];
    for(let i=0;i<5;i++){
      outs.push( 
        <div>
          <button onMouseOver={() => {
              this.setState({green : true});
           }}
           onMouseLeave={() => {
              this.setState({green : false});
           }}  
          >
           Turn box green 
         </button>
         <div className={'box '+green}>
         </div>
       </div>
       );
    }
    return (
       <div>
        {outs}
      </div>
    );
  }
}
ReactDOM.render(<Lol />,document.getElementById("a"));
.box{
  border:1px solid #000;
  height:20px;
  width:20px;
}
.green{
  background:green;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>

<div id="a">
  </div>

【问题讨论】:

  • 你是说像 css + 选择器这样的下一个兄弟吗?
  • 好吧,我删除了我的答案,因为您明确表示您不想要多个课程。请问你为什么有这个限制?

标签: javascript class reactjs events components


【解决方案1】:

设置状态下悬停项的索引,以及是否悬停。然后将存储的索引与当前的迭代索引进行比较:

class Lol extends React.Component{
  constructor(props){
    super(props)
    this.state = {
      greenIndex: null
    };
  }
  render = () =>{
    
    let outs = [];
    for(let i=0;i<5;i++){
      const { greenIndex } = this.state;
      const greenClass = (greenIndex === i) ? 'green' : '';

      outs.push( 
        <div>
          <button onMouseOver={() => {
              this.setState({ greenIndex: i });
           }}
           onMouseLeave={() => {
              this.setState({ greenIndex: null });
           }}  
          >
           Turn box green 
         </button>
         <div className={'box '+greenClass}>
         </div>
       </div>
       );
    }
    return (
       <div>
        {outs}
      </div>
    );
  }
}
ReactDOM.render(<Lol />,document.getElementById("a"));
.box{
  border:1px solid #000;
  height:20px;
  width:20px;
}
.green{
  background:green;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>

<div id="a">
  </div>

【讨论】:

  • 这个解决方案比我的解决方案更快地切入正题,而且它还添加了独特的元素 id,它会反应喜欢。我的解决方案唯一可行的是,全局组件确实没有理由需要跟踪其状态中的绿色。
  • 这行得通,尽管理想情况下每个按钮都会被分解成自己的组件来负责自己的状态。
  • @jered 是的,我同意,但是我试图尊重 OP 的要求:I dont want to use two classes(我将其解释为 React 类,而不是 CSS 类)
猜你喜欢
  • 2013-04-19
  • 2017-06-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-21
  • 2018-10-08
相关资源
最近更新 更多