본문 바로가기
웹/react.js

onMouseEnter 이슈

by java개발자 2021. 3. 3.

보통

onMouseEnter, onMouseLeave 를 쌍으로 사용한다.

그런데 간혹 onMouseLeave event가 발생되지 않는 케이스가 있다.

leaver가 발생할 수 있는 dom 자체가 사라지면, leave가 발생하지 않는다.

import React from 'react';

export default function Component() {
  const [highlight, setHighlight] = React.useState(false);
  const [visible, setVisible] = React.useState(true);
  return (
    <>
      <div onMouseEnter={() => {
        setHighlight(true);
      }}
        onMouseLeave={() =>{
          setHighlight(false);
        }}
      >
        <div>Event1</div>
        <div>highlight: {highlight + ''}</div>
        {
          visible && <button onClick={() => {
            setVisible(false);
          }}>클릭</button>
        }   
      </div>
    </>
  )
}

 

해결1

Component로 분리하고, clean up에서 처리한다.

import React from 'react';

const Btn = ({setVisible, setHighlight}: {setVisible: any, setHighlight: any}) => {
  React.useEffect(() => {
    return () => {
      setHighlight(false);
    }
  }, [])
  return (
    <button onClick={() => {
      setVisible(false);
    }}>클릭</button>
  )
}
export default function Component() {
  const [highlight, setHighlight] = React.useState(false);
  const [visible, setVisible] = React.useState(true);
  return (
    <>
      <div onMouseEnter={() => {
        setHighlight(true);
      }}
        onMouseLeave={() =>{
          setHighlight(false);
        }}
      >
        <div>Event1</div>
        <div>highlight: {highlight + ''}</div>
        {
          visible && <Btn setVisible={setVisible} setHighlight={setHighlight} />
        }   
      </div>
    </>
  )
}

' > react.js' 카테고리의 다른 글

react-redux  (0) 2021.03.03
onClick 대신 onMouseDown  (0) 2021.03.03
ie11에서 onMouseEnter가 중첩되었을때 event를 하위 컴포넌트까지 pass 하지 않음.  (0) 2021.03.03
Context 예제  (0) 2021.03.03