Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Reactjs 如何检测鼠标单击是长还是短?_Reactjs_React Hooks_Settimeout - Fatal编程技术网

Reactjs 如何检测鼠标单击是长还是短?

Reactjs 如何检测鼠标单击是长还是短?,reactjs,react-hooks,settimeout,Reactjs,React Hooks,Settimeout,我需要检测用户是否长时间按住鼠标或快速单击按钮 这是我的测试代码。mTimer值在onMouseDown()中设置,但在mTimeout()中计算为false。我做错了什么 import React, { useState } from "react"; import "./styles.css"; export default function App() { const [mouseInfo, setMouseInfo] = useState({

我需要检测用户是否长时间按住鼠标或快速单击按钮

这是我的测试代码。mTimer值在onMouseDown()中设置,但在mTimeout()中计算为false。我做错了什么

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

export default function App() {
  const [mouseInfo, setMouseInfo] = useState({
    mTimer: null,
    action: ""
  });

  const mTimeout = () => {
    if (mouseInfo && mouseInfo.mTimer) {
      setMouseInfo({
        mTimer: null,
        action: "More than 1 sec passed"
      });
    }
  };

  const onMouseDown = (ev) => {
    const timeoutId = setTimeout(mTimeout, 1000);
    console.log(typeof timeoutId, Boolean(timeoutId));
    setMouseInfo({
      mTimer: timeoutId,
      action: "mousedown"
    });
  };

  const onMouseUp = (ev) => {
    if (mouseInfo.mTimer) {
      clearTimeout(mouseInfo.mTimer);
      setMouseInfo({
        mTimer: null,
        action: "Mouseup before 1 sec"
      });
    } else {
      setMouseInfo({
        mTimer: null,
        action: "Mouseup after 1 sec"
      });
    }
  };

  return (
    <div className="App">
      <button onMouseDown={onMouseDown} onMouseUp={onMouseUp}>
        Click my slowly
      </button>
      <p>{mouseInfo.action}</p>
    </div>
  );
}
import React,{useState}来自“React”;
导入“/styles.css”;
导出默认函数App(){
const[mouseInfo,setMouseInfo]=useState({
mTimer:null,
行动:“”
});
常量mTimeout=()=>{
if(mouseInfo&&mouseInfo.mTimer){
setMouseInfo({
mTimer:null,
操作:“超过1秒”
});
}
};
const onMouseDown=(ev)=>{
const timeoutId=setTimeout(mTimeout,1000);
log(timeoutId的类型,布尔值(timeoutId));
setMouseInfo({
mTimer:timeoutId,
行动:“鼠标下”
});
};
const onMouseUp=(ev)=>{
if(mouseInfo.mTimer){
clearTimeout(mouseInfo.mTimer);
setMouseInfo({
mTimer:null,
动作:“1秒前鼠标悬停”
});
}否则{
setMouseInfo({
mTimer:null,
动作:“1秒后鼠标悬停”
});
}
};
返回(
慢慢地按我的按钮
{mouseInfo.action}

); }
您可以试试这个:

问题 这不起作用,因为
setMouseInfo
不会立即更改状态

const onMouseDown=(ev)=>{
const timeoutId=setTimeout(mTimeout,1000);
log(timeoutId的类型,布尔值(timeoutId));
setMouseInfo({
mTimer:timeoutId,
行动:“鼠标下”
});
};
因此,
mouseInfo.mTimer
即使在一秒钟之后也不会被设置,因此它可能是
null

const mTimeout=()=>{
控制台日志(“mTimeout”);
if(mouseInfo&&mouseInfo.mTimer){
setMouseInfo({
mTimer:null,
操作:“超过1秒”
});
} 
};
解决方案 只需删除或注释检查
mouseInfo
mouseInfo.mTimer
的if语句即可

const mTimeout=()=>{
控制台日志(“mTimeout”);
//if(mouseInfo&&mouseInfo.mTimer){
setMouseInfo({
mTimer:null,
操作:“超过1秒”
})
// }
};

“这不起作用,因为setMouseInfo不会立即更改状态。”-按钮下方页面上的文本几乎立即更改为“mousedown”,这意味着状态在1秒超时之前很久就会更改。问题是mTimeout()看不到更新的状态,只看到旧的状态。是的,您可以通过不依赖timeout方法中的状态来修复此示例,但是如果在timeout方法中需要正确的状态,您如何访问它呢?问题是mTimeout()看不到更新的状态,只看到旧的状态。您可以通过不依赖timeout方法中的状态来修复此示例,但是如果在timeout方法中需要正确的状态,您如何访问它呢?