events - 双击并单击 ReactJS 组件

标签 events reactjs double-click

我有一个 ReactJS 组件,我希望它在单击和双击时具有不同的行为。

我读到this问题。

<Component
    onClick={this.onSingleClick}
    onDoubleClick={this.onDoubleClick} />

我自己尝试过,似乎无法在 ReactJS 组件上同时注册单击和双击。

我不确定这个问题有什么好的解决方案。我不想使用计时器,因为我的页面上将有 8 个这样的单个组件。

在这个组件中添加另一个内部组件来处理双击情况是一个很好的解决方案吗?

编辑:

我尝试了这种方法,但它在渲染函数中不起作用。

render (

    let props = {};

    if (doubleClick) {
        props.onDoubleClick = function
    } else {
        props.onClick = function
    }
    <Component
        {...props} />
);

最佳答案

这是最快最短答案:

基于类的组件


class DoubleClick extends React.Component {
    timer = null

    onClickHandler = event => {
        clearTimeout(this.timer);

        if (event.detail === 1) {
            this.timer = setTimeout(this.props.onClick, 200)
        } else if (event.detail === 2) {
            this.props.onDoubleClick()
        }
    }

    render() {
        return (
            <div onClick={this.onClickHandler}>
                {this.props.children}
            </div>
        )
    }
}

功能组件


const DoubleClick = ({ onClick = () => { }, onDoubleClick = () => { }, children }) => {
    const timer = useRef()

    const onClickHandler = event => {
        clearTimeout(timer.current);

        if (event.detail === 1) {
            timer.current = setTimeout(onClick, 200)
        } else if (event.detail === 2) {
            onDoubleClick()
        }
    }

    return (
        <div onClick={onClickHandler}>
            {children}
        </div>
    )
}

演示

var timer;

function onClick(event) {
  clearTimeout(timer);
  
  if (event.detail === 1) {
    timer = setTimeout(() => {
      console.log("SINGLE CLICK");
    }, 200)

  } else if (event.detail === 2) {
    console.log("DOUBLE CLICK");
  }
}

document.querySelector(".demo").onclick = onClick;
.demo {
  padding: 20px 40px;
  background-color: #eee;
  user-select: none;
}
<div class="demo">
  Click OR Double Click Here
</div>

关于events - 双击并单击 ReactJS 组件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35491425/

相关文章:

javascript - 悬停标记时能够滚动 map 吗?

javascript - 如何通过双击下拉列表提交值?

c# - 冒泡事件的首选方式是什么?

c# - 事件取消订阅/重新订阅属性更改

javascript - 实时事件和查询元素是否将响应事件

reactjs - 不得设置 compilerOptions.paths(不支持别名导入)

reactjs - 无法导入语义-ui-css

java - 双击启动时无法从 jar 中打开资源

jquery - ASP.NET 防止双击

javascript - 即使提示位于函数之后,我的 Javascript 提示也会在函数之前运行