reactjsでホバー状態にアクセスするにはどうすればよいですか?


99

私はたくさんのバスケットボールチームのサイドナブを持っています。ですから、チームの1つがホバーされているときに、チームごとに異なるものを表示したいと思います。また、私はReactjsを使用しているので、別のコンポーネントに渡すことができる変数があれば、すばらしいでしょう。


回答:


157

Reactコンポーネントは、トップレベルのインターフェースですべての標準Javascriptマウスイベントを公開します。もちろん、:hoverCSSで使用することもできますが、これは一部のニーズには十分かもしれませんが、ホバーによってトリガーされるより高度な動作には、JavaScriptを使用する必要があります。したがって、ホバー操作を管理するにはonMouseEnter、およびを使用する必要がありonMouseLeaveます。次に、それらをコンポーネントのハンドラーに次のようにアタッチします。

<ReactComponent
    onMouseEnter={this.someHandler}
    onMouseLeave={this.someOtherHandler}
/>

次に、状態/プロップの組み合わせを使用して、変更された状態またはプロパティを子Reactコンポーネントに渡します。


大丈夫、私はそれがうまくいくと思います。試してみましょう。また、この変数を別の/接続されていないコンポーネントに渡すにはどうすればよいですか?
ユーザー

1
それは実際にはトリッキーになります、Reactは正確にそれを提供しません。Webアプリのアーキテクチャーでは、選択されたグローバルな包括的な通信方法論に入ります。多くの人々は、イベントバスタイプのソリューションを選択します。この場合、一部のグローバルイベントマネージャーは、異なるコンポーネントでイベントをポストおよび受信します。これらのイベントメッセージには、引数として渡すデータが含まれます。:これは、Facebookが話題に自分のドキュメントに提案するものですfacebook.github.io/react/tips/...
stolli

2
追加したいのは、onMouseEnter onMouseLeaveDOMイベントです。彼らは、カスタムで動作しませんReactComponent、あなたはその中でDOM要素に小道具やバインドとして、これらのイベントをダウンイベントを渡す必要がありますReactComponentように、<div onMouseOver={ () => this.props.onMouseOver }>
DAMIEN JIANG

30

ReactJsは、マウスイベントに対して以下の合成イベントを定義します。

onClick onContextMenu onDoubleClick onDrag onDragEnd onDragEnter onDragExit
onDragLeave onDragOver onDragStart onDrop onMouseDown onMouseEnter onMouseLeave
onMouseMove onMouseOut onMouseOver onMouseUp

ご覧のとおり、ブラウザーはホバーイベントをネイティブに定義していないため、ホバーイベントはありません。

ホバー動作のonMouseEnterおよびonMouseLeaveのハンドラーを追加する必要があります。

ReactJSドキュメント-イベント


0

私は受け入れられた答えが素晴らしいことを知っていますが、マップ上でハンドルを使用setTimeoutmouseoverて保存できると感じているようなホバーを探している人にとっては(たとえば、リストIDをsetTimeoutハンドルに)します。上mouseoverのsetTimeoutからハンドルをクリアしてマップから削除

onMouseOver={() => this.onMouseOver(someId)}
onMouseOut={() => this.onMouseOut(someId)

次のようにマップを実装します。

onMouseOver(listId: string) {
  this.setState({
    ... // whatever
  });

  const handle = setTimeout(() => {
    scrollPreviewToComponentId(listId);
  }, 1000); // Replace 1000ms with any time you feel is good enough for your hover action
  this.hoverHandleMap[listId] = handle;
}

onMouseOut(listId: string) {
  this.setState({
    ... // whatever
  });

  const handle = this.hoverHandleMap[listId];
  clearTimeout(handle);
  delete this.hoverHandleMap[listId];
}

そして地図はこんな感じです

hoverHandleMap: { [listId: string]: NodeJS.Timeout } = {};

私は好むonMouseOveronMouseOut、それはまた、すべての子供に適用されるためHTMLElement。これが必要ない場合はonMouseEnter、およびをonMouseLeaveそれぞれ使用できます。


0

ホバー効果がある場合は、このコードを試してください

import React from "react";
  import "./styles.css";

    export default function App() {

      function MouseOver(event) {
        event.target.style.background = 'red';
      }
      function MouseOut(event){
        event.target.style.background="";
      }
      return (
        <div className="App">
          <button onMouseOver={MouseOver} onMouseOut={MouseOut}>Hover over me!</button>
        </div>
      );
    }

または、useState()フックを使用してこの状況を処理する場合は、次のコードを試すことができます

import React from "react";
import "./styles.css";


export default function App() {
   let [over,setOver]=React.useState(false);

   let buttonstyle={
    backgroundColor:''
  }

  if(over){
    buttonstyle.backgroundColor="green";
  }
  else{
    buttonstyle.backgroundColor='';
  }

  return (
    <div className="App">
      <button style={buttonstyle}
      onMouseOver={()=>setOver(true)} 
      onMouseOut={()=>setOver(false)}
      >Hover over me!</button>
    </div>
  );
}

上記のコードはどちらもホバー効果で機能しますが、最初の手順を記述して理解する方が簡単です

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.