reactjs에서 hover 상태에 액세스하려면 어떻게해야합니까?


101

나는 많은 농구 팀과 함께 사이드 네비게이션을 가지고 있습니다. 그래서 팀 중 하나를 가리키면 각 팀마다 다른 것을 표시하고 싶습니다. 또한 Reactjs를 사용하고 있으므로 변수가 있으면 다른 구성 요소에 전달할 수 있습니다.


답변:


160

React 구성 요소는 최상위 인터페이스에서 모든 표준 Javascript 마우스 이벤트를 노출합니다. 물론 :hoverCSS에서 여전히 사용할 수 있으며 일부 요구 사항에 적합 할 수 있지만 마우스 오버로 트리거되는 고급 동작의 경우 Javascript를 사용해야합니다. 따라서 마우스 오버 상호 작용을 관리하려면 onMouseEnter및 을 사용하는 것이 좋습니다 onMouseLeave. 그런 다음 구성 요소의 핸들러에 다음과 같이 연결합니다.

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

그런 다음 상태 / 소품의 일부 조합을 사용하여 변경된 상태 또는 속성을 자식 React 구성 요소에 전달합니다.


좋아요, 그게 효과가있을 것 같아요. 테스트 해 보겠습니다. 또한이 변수를 다른 / 연결되지 않은 구성 요소에 어떻게 전달할 수 있습니까?
사용자 이름

1
그것은 실제로 까다로워지고 React는 그것을 정확하게 제공하지 않습니다. 웹 앱의 아키텍처에서는 선택한 글로벌 전반에 걸친 커뮤니케이션 방법론에 적용됩니다. 많은 사람들은 일부 글로벌 이벤트 관리자가 서로 다른 구성 요소에서 이벤트를 게시하고 수신하는 이벤트 버스 유형 솔루션을 선택합니다. 이러한 이벤트 메시지에는 인수로 전달하려는 데이터가 포함됩니다. 이것은 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 문서-이벤트


1

내가 허용 대답은 잘 알고 있지만, 누군가를 위해 당신이 사용할 수있는 느낌 같은 호버 찾고있는 사람 setTimeoutmouseover와 (의 setTimeout 처리 할 수있는하자의 말리스트 ID의)지도에 핸들을 저장합니다. 에서 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 } = {};

내가 좋아 onMouseOver하고 onMouseOut그것은 또한 모든 아이들에게 적용되기 때문에 HTMLElement. 이것이 필요하지 않은 경우 onMouseEnteronMouseLeave각각을 사용할 수 있습니다 .


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.