gpt4 book ai didi

javascript - 防止双击被解释为两次单击?

转载 作者:行者123 更新时间:2023-12-01 02:25:39 26 4
gpt4 key购买 nike

我有以下相当简单的 React 类:

import React from "react"

export default class DoubleClick extends React.Component {

constructor(props) {
super(props);
this.state = {
};
this.handleClick = this.handleClick.bind(this);
this.handleDoubleClick = this.handleDoubleClick.bind(this);
}
handleClick() {
console.log("Click");
}
handleDoubleClick() {
console.log("Double Click");
}
render() {
return (
<div style={{backgroundColor: 'pink'}}>
<div onClick={this.handleClick}>
<span onDoubleClick={this.handleDoubleClick}> Hello </span>
<span onDoubleClick={this.handleDoubleClick}> world. </span>
</div>
</div>
);
}
}

当有人单击外部 div 时,我想调用 handleClick,当有人双击任何内部 span 时,我想调用 handleDoubleClick,但也不包括外部 div 的 handleClick

但是,每当我双击时,handleDoubleClick() 就会被调用,但是 handleClick 也会被调用,即两次。

我想仅在单击时调用 handleClick(),但双击 - 这可能吗?

最佳答案

我有一个 HOC,我用它来近似您正在寻找的内容:

import React, { Component } from 'react';
import PropTypes from 'prop-types';

export default class DoubleClick extends Component {
constructor(props) {
super(props);
this.onClick = this.onClick.bind(this);
this.onDoubleClick = this.onDoubleClick.bind(this);
this.timeout = null;
}

onClick(e) {
e.preventDefault();

if(this.timeout === null) {
this.timeout = window.setTimeout(() => {
this.timeout = null;
this.props.onClick();
}, 300);
}
}

onDoubleClick(e) {
e.preventDefault();
window.clearTimeout(this.timeout);
this.timeout = null;
this.props.onDoubleClick();
}

render() {
const { onClick, onDoubleClick, children, ...childProps } = this.props;
const props = Object.assign(childProps, { onClick: this.onClick, onDoubleClick: this.onDoubleClick });
return React.cloneElement(children, props);
}
}

DoubleClick.propTypes = {
onClick: PropTypes.func.isRequired,
onDoubleClick: PropTypes.func.isRequired,
children: PropTypes.element.isRequired,
};

像这样使用:

<DoubleClick onClick={clickHandler} onDoubleClick={doubleClickHandler}>
<button>Click or double click me</button>
</DoubleClick>

当收到第一次点击时,它会设置 300 毫秒的超时。如果 300 毫秒内没有收到第二次点击,则将调用 onClick 属性中的函数。如果在 300 毫秒内收到第二次点击,则将调用 onDoubleClick 属性中的函数,并取消超时,因此 onClick 不会触发。

不用说,这是一个不完美的近似,但我发现它在实践中是一个足够令人满意的用户体验。

关于javascript - 防止双击被解释为两次单击?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48834211/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com