2017-03-20 2 views
0

Ich möchte nicht zwei Klassen verwendenReactjs Geschwister Klasse Toggle

Wie kann ich die Geschwister Feld grün angezeigt werden, wenn Taste schweben ist?

Derzeit sind alle Felder grün hinterlegt.

Unten ist der Code mit dem Schnipsel.

Vielen Dank für die Hilfe im Voraus.

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>

+0

Sagst du das nächste Geschwister wie die CSS '+' Wähler? –

+0

In Ordnung, ich habe meine Antwort gelöscht, da Sie explizit gesagt haben, dass Sie keine mehrere Klassen möchten. Darf ich fragen, warum Sie diese Einschränkung haben? –

Antwort

2

den Index des hovered Artikel in Zustand setzen, sowie ob etwas schwebte wird. Dann vergleichen Sie die gespeicherten Index mit der aktuellen Iteration Index:

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>

+0

Diese Lösung geht viel schneller als meine, und fügt auch einzigartige Element-IDs hinzu, die Likes reagieren. Die einzige Sache, die für meine Lösung geht, ist, dass es wirklich keinen Grund gibt, dass die globale Komponente Grün in seinem Zustand verfolgen muss. –

+0

Dies funktioniert, obwohl idealerweise jeder Knopf in seine eigene Komponente aufgeteilt würde, die für ihren eigenen Zustand verantwortlich ist. – jered

+0

@jered Ja stimme ich zu, aber ich habe versucht, die Anfrage von OP zu respektieren: 'Ich möchte nicht zwei Klassen verwenden '(Ich interpretiere das als React-Klasse und nicht als CSS-Klasse) –