gpt4 book ai didi

javascript - 检查延迟后元素是否仍然有 mouseenter

转载 作者:行者123 更新时间:2023-12-04 10:20:16 25 4
gpt4 key购买 nike

我用 mouseentermouseleave 制作了一些积木

<button onMouseEnter={this.MouseEnter}>hover</button>

MouseEnter(e) {
setTimeout(() => {
//check if mouse over still on this element
// do action
}, 600);
}

问题是当我非常快速地移动 block 时,最后一个 block 在超时之前检测到鼠标输入并执行操作,即使我没有悬停在 block 上这是一个错误,我想让它只运行操作在 block 上悬停 500 毫秒 之后。

p.s: 我正在使用 react.js

最佳答案

真正缺少的部分是在触发 mouseLeave 事件时超时回调的失效。为此,您需要保留返回的 setTimeout 值,以便在计时器到期(或者组件卸载!!)之前调用 clearTimeout )

以下是基于类的组件中的基 native 制:

state = {
hovered: false
};
timer;

mouseEnterHandler = () => this.setState({ hovered: true });
mouseLeaveHandler = () => this.setState({ hovered: false });

onTimeout = () => {
// Do action
};

clearTimer = () => {
clearTimeout(this.timer);
};

// Here's the meat:
// If state updates, then componentDidUpdate is called,
// if the new hovered state is true, set timeout and save the
// returned reference, else clear the timeout using the saved
// timer reference.

componentDidUpdate() {
const { hovered } = this.state;

if (hovered) {
this.timer = setTimeout(this.onTimeout, 500);
} else {
this.clearTimer();
}
}

// This is component cleanup, if the component unmounts before
// the timer expires you may not want the "Do action" to fire,
// so we go ahead and clear the timeout so you're not accidentally
// accessing state/props of an unmounted component.

componentWillUnmount() {
this.clearTimer();
}

以下是等效的功能组件逻辑:

const [hovered, sethovered] = useState(false);

const mouseEnterHandler = () => sethovered(true);
const mouseLeaveHandler = () => sethovered(false);

const onTimeout = () => {
// Do action
};

useEffect(() => {
const timer = hovered && setTimeout(onTimeout, 500);
return () => {
clearTimeout(timer);
};
}, [hovered]);

Edit pedantic-flower-wsp3z

关于javascript - 检查延迟后元素是否仍然有 mouseenter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60895526/

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