onMouseUp和onClick事件发生冲突

时间:2019-06-14 22:35:17

标签: javascript html reactjs typescript responsive-design

我有一个滚动条,我想在单击一个按钮时滚动40像素,并且按住同一按钮时,它会连续滚动

所以我使用onClick事件进行了40px的单步走 并且我使用onMouseDown和onMouseUp来实现连续滚动效果

问题在于onMouseUp也会触发onClick事件..因此,当我们释放鼠标按钮时,滚动条会移动40px以上,这会产生不良影响

我在onMouseDown内部使用了setInterval:

clickScroll = () => {
    const slider : HTMLElement = this.state.scrollRef.current;
    slider.scrollBy(40, 0)
}

holdScroll = (type : string) => {   
    const slider : HTMLElement = this.state.scrollRef.current;
    this.setState({
        interval : setInterval(() => {
            slider.scrollBy(walk, 0)
        }, 100)
    })
}

stopHoldScroll = () => {
    clearInterval(this.state.interval);
}

还有我的按钮:

<Button onClick={this.clickScroll}
  onMouseDown={this.holdScroll}
  onMouseUp={this.stopHoldScroll}>
      <span className="fas fa-chevron-right" /> 
</Button>

关于如何分离这两种差异效应的任何想法? 谢谢

1 个答案:

答案 0 :(得分:0)

我终于找到了一种方法!感谢雅克的想法

我们可以结合使用setTimeout和setInterval在点击和按住按钮之间创建一个小的差异 如果我们按住或单击,布尔值可以在onMouseUp内指示我们。保持300毫秒后变为true,否则,只需单击即可

    const slider : HTMLElement = this.state.refs.current;
    scrollHold = () => {
        this.setState({
            timer: setTimeout(() => {
                this.setState({
                    interval : setInterval(() => {
                        slider.scrollBy(8, 0)
                    }, 20),
                    holded: true
                })
            },300)
        })
    }
    stopScroll = () => {
        if (!this.state.holded){
            this.state.current.scrollBy(40, 0)
        }
        clearTimeout(this.state.timer)
        clearInterval(this.state.interval);
        this.setState({ holded: false })
    }
<Button 
  onMouseDown={this.scrollHold}
  onMouseUp={this.stopScroll}>
      <span className="fas fa-chevron-right" /> 
</Button>