当前位置: 首页 > 面试题库 >

ReactJS SyntheticEvent stopPropagation()仅适用于React事件吗?

孟光耀
2023-03-14
问题内容

我试图在ReactJS组件中使用event.stopPropagation()来阻止单击事件冒泡并触发遗留代码中与JQuery关联的click事件,但是似乎React的stopPropagation()只能停止传播到事件也附加在React中,并且JQuery的stopPropagation()不会停止传播到随React附加的事件。

有什么方法可以使stopPropagation()在这些事件中起作用?我编写了一个简单的JSFiddle来演示这些行为:

/** @jsx React.DOM */
var Propagation = React.createClass({
    alert: function(){
        alert('React Alert');
    },
    stopPropagation: function(e){
        e.stopPropagation();
    },
    render: function(){
        return (
            <div>
                <div onClick={this.alert}>
                    <a href="#" onClick={this.stopPropagation}>React Stop Propagation on React Event</a>
                </div>
                <div className="alert">
                    <a href="#" onClick={this.stopPropagation}>React Stop Propagation on JQuery Event</a>
                </div>
                <div onClick={this.alert}>
                    <a href="#" className="stop-propagation">JQuery Stop Propagation on React Event</a>
                </div>
                <div className="alert">
                    <a href="#" className="stop-propagation">JQuery Stop Propagation on JQuery Event</a>
                </div>
            </div>
        );
    }
});

React.renderComponent(<Propagation />, document.body);

$(function(){    
    $(document).on('click', '.alert', function(e){
        alert('Jquery Alert');
    });

    $(document).on('click', '.stop-propagation', function(e){
        e.stopPropagation();
    });
});

问题答案:

React使用事件委派和单个事件侦听器来启动document冒泡的事件,如本例中的“
click”,这意味着无法停止传播;当您在React中与真实事件互动时,真实事件已经传播了。stopPropagation由于React在内部处理合成事件的传播,因此可以对React的合成事件进行处理。

使用下面的修补程序来工作JSFiddle。

在jQuery事件上反应停止传播

使用Event.stopImmediatePropagation以防止你的其他(jQuery的在这种情况下)听众根被调用。IE9
+和现代浏览器都支持它。

stopPropagation: function(e){
    e.stopPropagation();
    e.nativeEvent.stopImmediatePropagation();
},
  • 警告:侦听器按照其绑定的顺序进行调用。 必须先将React初始化为其他代码(此处为jQuery),然后才能工作。

jQuery在React事件上停止传播

您的jQuery代码也使用事件委托,这意味着stopPropagation在处理程序中的调用不会停止任何操作。事件已经传播到document,并且React的侦听器将被触发。

// Listener bound to `document`, event delegation
$(document).on('click', '.stop-propagation', function(e){
    e.stopPropagation();
});

为了防止传播到元素之外,侦听器必须绑定到元素本身:

// Listener bound to `.stop-propagation`, no delegation
$('.stop-propagation').on('click', function(e){
    e.stopPropagation();
});

编辑(2016/01/14):
说明了委派只必须用于冒泡的事件。有关事件处理的更多详细信息,React的源代码具有描述性注释:ReactBrowserEventEmitter.js。



 类似资料:
  • 问题内容: 我想在React中的div上使用keyDown事件。我做: 它工作正常,但我想以React风格做更多。我试过了 在组件上。但是它没有反应。我记得它可以处理输入元素。 码笔 我该怎么做? 问题答案: 您应该使用 tabIndex 属性,以便能够在React中的div上监听onKeyDown事件。设置tabIndex =“ 0”应该会触发您的处理程序。

  • 问题内容: 关闭页面时,我使用此代码注销用户,但是单击其他链接(相同的网站)时,用户也会注销: 有什么方法可以区分链接导航和实际页面关闭吗? 编辑: 我目前已实现此解决方案,但是它缺乏检测页面重新加载的能力 问题答案: 尝试以下解决方案,希望对您有所帮助 要么

  • 我将nginx设置为一种静态文件服务器。出于某种原因,只有当我去123.123.123.123/或123.123.123.123时,它才会起作用。然而,当我去123.123.123.123/static/content/或123.123.123.123/static/content/another.mp3它返回404未找到。下面是位于中并链接到的配置文件。我真的很困惑为什么它不起作用。 如有任何指

  • 例如,用谷歌搜索网站,登陆主页,然后进入跨域网站正确记录“有机”作为媒介 (已通过在GA中使用实时数据进行验证) 但是,通过谷歌搜索网站,登陆主页,然后进入跨域网站并完成一个事件,会错误地将“Direct”记录为该事件的媒介。 GTM设置已配置为: -5个域推送到“汇总”GA帐户 -autoLinker=true -Cookie-Domain=auto -auto-Link-domains=sit

  • 问题内容: 我正在使用Hibernate3.3.1,我想在人员和指定公司之间建立关系。他们应该松耦合,但我想安排通过级联创建公司,而不是显式调用saveOrUpdate(newCompany)。 我定义了以下实体: 在我的小岛内,我正在执行以下操作: 我得到一个例外 org.hibernate.TransientObjectException:对象引用了一个未保存的瞬态实例- 在刷新之前保存该瞬态

  • 我正在开发一个项目,它以前在API23和22上都能很好地工作,然而,当应用程序一启动它就会崩溃(甚至连activity都无法加载)--只在API22上,在API23上它能很好地工作。日志对我没有太大帮助,我已经不知道是什么导致了这个错误的发生。它抱怨的类是清单中定义的App类。下面是一些可能有助于分析的代码: null public class App扩展com.orm.sugarapp{ } 应