我正在尝试以与此https://www.ocado.com/browse/fresh-20002
类似的行为来实现Menu,即在悬停时具有延迟的子猫视图,在鼠标离开时具有延迟的子猫模糊 现在我做了类似的事情来删除subcat-> onMouseLeave
removeChildren() {
setTimeout(
function() {
this.setState({ selected: [] });
}.bind(this),
700
);
}
并以此为例显示subCats-> onMouseEnter
getChildren(category) {
let { selected } = this.state;
selected = [].concat(category);
setTimeout(
function() {
this.setState({ selected });
}.bind(this),
700
);
}
但是它导致了问题-当我开始在此Ocado菜单中的菜单周围快速移动时,菜单闪烁,它只是等待一段时间并显示/删除subcat,但是当我移动得太快时,它并没有改变。
答案 0 :(得分:1)
您需要的是延迟处理事件。当用户快速移动鼠标并触发一系列MouseLeave
/ MouseEnter
事件时,您的应用应延迟state
更新的处理,即触发UI更新,直到鼠标停止持续700毫秒(如您的代码所示)。只有这样才能执行最后一个setState
函数,并且UI应该反映出最后一个注册的事件。
您可以在React组件中创建一个名为timer
的新属性:
timer = null;
以您的getChildren
函数为例。在getChildren
事件发生时调用的MouseEnter
函数中:
getChildren(category) {
let { selected } = this.state;
selected = [].concat(category);
// Clear out the current stored event.
clearTimeout(this.timer)
// Store this event in `this.timer` and if this is the last one fired in 700ms, the `setState` function will execute and UI will update.
this.timer = setTimeout(function(){
this.setState({ selected });
}.bind(this), 700);
}
MouseLeave
和removeChildren
功能与上面的功能非常相似。