延迟反应 onMouseOver 事件

Pie*_*ran 6 javascript events mouseevent dom-events reactjs

我有一个元素列表,当悬停其中一个时,我想改变我的状态。

<ListElement onMouseOver={() => this.setState({data})}>Data</ListElement>
Run Code Online (Sandbox Code Playgroud)

不幸的是,如果我将鼠标移到列表上,我的状态会快速连续更改几次。我想延迟状态更改,以便它在被解雇前等待半秒钟。有没有办法这样做?

小智 10

我可能有点晚了,但我想使用 Lodash 添加上面的一些答案debounce。当对方法进行去抖动时,该debounce函数允许您根据某些事件取消对方法的调用。请参阅功能组件示例:

const [isHovered, setIsHovered] = React.useState(false)

const debouncedHandleMouseEnter = debounce(() => setIsHovered(true), 500)

const handlOnMouseLeave = () => {
  setIsHovered(false)
  debouncedHandleMouseEnter.cancel()
}

return (
  <div
    onMouseEnter={debouncedHandleMouseEnter}
    onMouseLeave={handlOnMouseLeave}
  >
   ... do something with isHovered state...
  </div>
)

Run Code Online (Sandbox Code Playgroud)

此示例允许您仅在用户将鼠标悬停在元素中 500 毫秒后调用函数,如果鼠标离开元素,则调用将被取消。


小智 9

这里有一个方法,你可以使用的组合延迟500毫秒通过您的活动onMouseEnteronMouseLeavesetTimeout

请记住,数据的状态更新可以由父组件管理并作为道具传入。

import React, { useState } from 'react'

const ListElement = () => {
    const [data, setData] = useState(null)
    const [delayHandler, setDelayHandler] = useState(null)

    const handleMouseEnter = event => {
        setDelayHandler(setTimeout(() => {
            const yourData = // whatever your data is

            setData(yourData)
        }, 500))
    }

    const handleMouseLeave = () => {
        clearTimeout(delayHandler)
    }

    return (
        <div
            onMouseEnter={handleMouseEnter}
            onMouseLeave={handleMouseLeave}
        >
            I have a delayed event handler
        </div>
    )
}

export default ListElement
Run Code Online (Sandbox Code Playgroud)


hsz*_*hsz 5

您可以将其用作debounce专用包或从 等处获取lodash

对于实现仅应在重复操作完成后发生的行为很有用。

const debounce = require('debounce');

class YourComponent extends Component {
  constructor(props) {
    super(props);

    this.debouncedMouseOver = debounce(handleMouseOver, 200);
  }

  handleMouseOver = data => this.setState({ data });

  render() {
    const data = [];
    return <ListElement onMouseOver={() => this.debouncedMouseOver(data)}>Data</ListElement>;
  }
}
Run Code Online (Sandbox Code Playgroud)