2017-09-23 11 views
0

私はliのリスト内のホバリングボタンに問題があります。ホバーした後、1つのli項目ボタンがすべてのli項目に表示されます。コードの下のcodepenにリンクします。反応すると、onMouseOverイベントは1つではなくリスト内のすべてのアイテムをトリガーします

const ItemView = (props) => { 
return <li 
onMouseOver={() => props.onMouseOver()} 
onMouseMove={() => props.onMouseOver()} 
onMouseLeave={() => props.onMouseLeave()} 
> 
    <div className="item__row"> 
     <h5>{props.name}</h5> 
     <h6>Age: {props.age}</h6> 
     <p>{props.strenght}/100</p> 


    {props.isHover ? props.children[0] : null} 


    </div> 
    {props.children[1]} 
</li> 

}

Codepen:https://codepen.io/dominik3246/pen/QqKzzp

答えて

0

あなたは、特定の要素が推移しているのを追跡する要素の配列を使用する必要があります。その後

constructor(){ 
    ... 
    this.state ={ 
    ... 
    isHover: [false, false, false, false, false], 
    ... 
    } 
} 

ような配列は、この

mouseOver(i) { 
    return() => { 
     if (this.state.isHover[i] === true) { 
     return this.state; 
     } 
     let isHover = [...this.state.isHover] 
     isHover[i] = true; 
     this.setState({ ...this.state, isHover }); 
    } 
    } 

のような項目のインデックスの範囲を含む関数を返すために、そしてisHovermouseOver小道具を渡すためにあなたのマウスオーバー機能を作るようにisHover状態変数を取りますItemViewこのように

{this.state.data.map((d, i) => { 
      return (
      <ItemView 
       key={d.id} 
       name={d.name} 
       strenght={d.strenght} 
       age={d.age} 
       onMouseOver={this.mouseOver(i)} 
       onMouseLeave={this.mouseExit} 
       isHover={this.state.isHover[i]} 
      > 
      ... 

ここにあなたのコードの実例があります:Link of example

+0

それは素晴らしいですが、どれだけのデータを受け取るかわからない場合はどうすればよいですか?時々私は5つのデータ項目、時には100を受け取ることができるデータを取得することを意味します。残念ながら、あなたは手動でisHover状態を設定する必要があります – dominik

+0

@dominikそれは親の各子要素のホバリングを追跡しているのでどの子要素がホバリングされたかを追跡する配列を保持する。 他の方法として、ホバーハンドラ関数を子要素に移動し、各子が独自のホバリングロジックを処理する必要があります。その場合、あなたは、どの子供が抱かれていたかを追跡せずに、子供をレンダリングするだけです。 –

関連する問題