只要鼠标悬停在 React 中的元素上,就会改变状态

Posted

技术标签:

【中文标题】只要鼠标悬停在 React 中的元素上,就会改变状态【英文标题】:Change state as long as mouse is over an element in React 【发布时间】:2020-08-27 23:08:47 【问题描述】:

我有一个计数器功能组件,有 2 个按钮:incrementdecrement,目前,当它们被单击时,状态会发生变化。但我希望状态改变只要鼠标悬停在元素上。 (不像onMouseOver 在鼠标悬停时执行事件,然后当您将鼠标移出元素然后再次悬停在元素上时再次执行)。我希望它是一个持续的悬停事件。

这是我的counter 代码:

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

export default function App() 

  const [counter, setCounter] = useState(0)

  return (
    <div className="App">
      <h1>counter</h1>
      <button onClick=() => setCounter(counter + 1)>Increment</button>
      <button onClick=() => setCounter(counter - 1) disabled=counter < 1 ? true : false>Decrement</button>
    </div>
  );

我希望这是有道理的!提前致谢。

【问题讨论】:

upmostly.com/tutorials/… 可能我会尝试基于此SO question 的onMouseDownonMouseEnteronMouseLeave 事件。一个补充是我会在事件中包含一个去抖动,以免在一秒钟内触发多次,请参阅this one。 谢谢!我去看看。 【参考方案1】:

给你:

为此,您可能需要一个状态变量来启动和停止鼠标悬停时的间隔,

运行下面的代码sn-p,希望能解开你的疑惑。

const  useState , useEffect , useRef  = React;

const App = () => 

  const _intervalRef = useRef(null);
  const [startCounter,setStartCounter] = useState(false);
  const [counter,setCounter] = useState(0);

  useEffect(() => 
    if(startCounter) 
         _intervalRef.current = setInterval(() => 
          setCounter((counter) => counter+1);
      ,250);
     else 
      clearInterval(_intervalRef.current);
    
    return () => clearInterval(_intervalRef.current);
  ,[startCounter]);

  return (
    <div>
      <div onMouseOver=() => setStartCounter(true) onMouseOut=() =>setStartCounter(false)>
        HOVER ME TO START COUNTER :  counter 
      </div>

    </div>
  );


ReactDOM.render(<App />, document.getElementById('react-root'));
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.8.4/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.8.4/umd/react-dom.production.min.js"></script>
<div id="react-root"></div>

【讨论】:

谢谢!这正是我想要的。 @Roy,很高兴它有帮助,:)

以上是关于只要鼠标悬停在 React 中的元素上,就会改变状态的主要内容,如果未能解决你的问题,请参考以下文章

jQuery Time 鼠标悬停在元素上(悬停)

Java Swing:在鼠标悬停时更改背景颜色

如何将鼠标悬停在元素上并改变远祖的风格? [重复]

如果父元素也有鼠标悬停,如何为子元素触发鼠标悬停事件?

悬停元素改变其他元素

如何将鼠标悬停在子元素上而不悬停在 CSS 中的父元素上?