你如何在 ReactJS 中悬停?- 在快速悬停期间未注册 onMouseLeave

IT技术 javascript css reactjs mouseevent dom-events
2021-03-02 04:56:28

当您进行内联样式时,如何在 ReactJS 中实现悬停事件或活动事件?

我发现 onMouseEnter, onMouseLeave 方法有问题,所以希望有另一种方法来做到这一点。

具体来说,如果您非常快速地将鼠标悬停在某个组件上,则只会注册 onMouseEnter 事件。onMouseLeave 永远不会触发,因此无法更新状态......让组件看起来好像它仍然被悬停在上面。如果您尝试模仿 ":active" css 伪类,我会注意到同样的事情。如果您单击非常快,则只会注册 onMouseDown 事件。onMouseUp 事件将被忽略...让组件显示为活动状态。

这是一个显示问题的 JSFiddle:https ://jsfiddle.net/y9swecyu/5/

有问题的 JSFiddle 视频:https ://vid.me/ZJEO

代码:

var Hover = React.createClass({
    getInitialState: function() {
        return {
            hover: false
        };
    },
    onMouseEnterHandler: function() {
        this.setState({
            hover: true
        });
        console.log('enter');
    },
    onMouseLeaveHandler: function() {
        this.setState({
            hover: false
        });
        console.log('leave');
    },
    render: function() {
        var inner = normal;
        if(this.state.hover) {
            inner = hover;
        }

        return (
            <div style={outer}>
                <div style={inner}
                    onMouseEnter={this.onMouseEnterHandler}
                    onMouseLeave={this.onMouseLeaveHandler} >
                    {this.props.children}
                </div>
            </div>
        );
    }
});

var outer = {
    height: '120px',
    width: '200px',
    margin: '100px',
    backgroundColor: 'green',
    cursor: 'pointer',
    position: 'relative'
}

var normal = {
    position: 'absolute',
    top: 0,
    bottom: 0,
    left: 0,
    right: 0,
    backgroundColor: 'red',
    opacity: 0
}

var hover = {
    position: 'absolute',
    top: 0,
    bottom: 0,
    left: 0,
    right: 0,
    backgroundColor: 'red',
    opacity: 1
}

React.render(
    <Hover></Hover>,         
    document.getElementById('container')
)
6个回答

你试过这些吗?

onMouseDown onMouseEnter onMouseLeave onMouseMove onMouseOut onMouseOver onMouseUp

合成事件

它还提到以下内容:

React 规范化事件,以便它们在不同浏览器中具有一致的属性。

下面的事件处理程序由冒泡阶段的事件触发。要为捕获阶段注册事件处理程序,请将 Capture 附加到事件名称;例如,您可以使用 onClickCapture 来处理捕获阶段的点击事件,而不是使用 onClick。

只是提到 onMouseEnter 和 onMouseLeave,来自文档: The onMouseEnter and onMouseLeave events propagate from the element being left to the one being entered instead of ordinary bubbling and do not have a capture phase.
2021-05-07 04:56:28

前面的答案很混乱。您不需要react状态来解决这个问题,也不需要任何特殊的外部库。可以使用纯 css/sass 来实现:

风格:

.hover {
  position: relative;

  &:hover &__no-hover {
    opacity: 0;
  }

  &:hover &__hover {
    opacity: 1;
  }

  &__hover {
    position: absolute;
    top: 0;
    opacity: 0;
  }

  &__no-hover {
    opacity: 1;
  }
}

react组件

一个简单的Hover纯渲染函数:

const Hover = ({ onHover, children }) => (
    <div className="hover">
        <div className="hover__no-hover">{children}</div>
        <div className="hover__hover">{onHover}</div>
    </div>
)

用法

然后像这样使用它:

    <Hover onHover={<div> Show this on hover </div>}>
        <div> Show on no hover </div>
    </Hover>
你可能会喜欢这个答案:stackoverflow.com/a/50342093/101290
2021-04-28 04:56:28
这是这个问题的最佳答案。
2021-04-29 04:56:28

您可以使用onMouseOver={this.onToggleOpen}onMouseOut={this.onToggleOpen}反复思考组件

它对我来说非常有效,非常感谢。但是,我怎样才能访问像我这样的其他函数会存在“onMauseOverFirstTime”?你从哪里得到这些信息?
2021-04-16 04:56:28
我创立!非常感谢你!:D
2021-04-26 04:56:28
@MtgKhaJeskai reactjs.org/docs/events.html如果你想要像 onMouseOverFirstTime 这样的东西,你必须自己创建它,例如,让函数只在你状态中的 'firstMouseOver' 为真时触发,并在函数被调用一次。
2021-05-07 04:56:28
不,它不存在“onMauseOverFirstTime”函数;但是您可以使用标志来执行此操作,将其添加到您的状态“ states :{ isFirstTime:false} ”并在“onMouseOver”@MtgKhaJeskai 中使其为真
2021-05-10 04:56:28

注意:此答案针对此问题的先前版本,其中提问者试图使用 JavaScript 来应用 css 样式……这可以简单地使用 CSS 来完成。

一个简单的css解决方案。

对于应用基本样式,CSS 在 99% 的情况下都比 JS 解决方案更简单、更高效。(尽管更现代的 CSS-in-JS 解决方案——例如 React Components 等——可以说更易于维护。)

运行此代码片段以查看其实际效果……

.hover-button .hover-button--on,
.hover-button:hover .hover-button--off {
  display: none;
}

.hover-button:hover .hover-button--on {
  display: inline;
}
<button class='hover-button'>
  <span class='hover-button--off'>Default</span>
  <span class='hover-button--on'>Hover!</span>
</button>

@tsujin - 请参阅上面的注释。
2021-04-15 04:56:28
more performant that JS solutions 99% of the time不对。阅读揭穿这个神话的文章。你有任何来源吗?
2021-04-20 04:56:28
这并没有回答这个问题。
2021-05-05 04:56:28
@CludiuCreanga - 请链接到揭穿这个神话的文章。
2021-05-09 04:56:28
@ClaudiuCreanga - 我已经澄清了你反对的句子,更简洁。
2021-05-11 04:56:28

如果您可以制作一个显示 onMouseEnter / onMouseLeave 或 onMouseDown / onMouseUp 错误的小演示,将其发布到 ReactJS 的问题页面或邮件列表中是值得的,只是为了提出问题并听取开发人员对此的看法。

在您的用例中,您似乎暗示 CSS :hover 和 :active 状态足以满足您的目的,因此我建议您使用它们。CSS 比 Javascript 快和可靠几个数量级,因为它直接在浏览器中实现。

但是,不能在内联样式中指定 :hover 和 :active 状态。您可以做的是为您的元素分配一个 ID 或一个类名,并在样式表中编写您的样式,如果它们在您的应用程序中有些恒定,或者在动态生成的<style>标签中。

这是后一种技术的示例:https : //jsfiddle.net/ors1vos9/

@clusterBuddy 我想这是 JsFiddle 或库中的错误,因为代码是正确的并且一直运行良好。
2021-04-17 04:56:28