我正在尝试在ReactJS组件中使用event.stopPropagation()来阻止点击事件冒泡并触发遗留代码中使用JQuery附加的单击事件,但似乎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){ …Run Code Online (Sandbox Code Playgroud) 这是一个基本组件.无论是<ul>和<li>拥有的onClick功能.我只想点击on on <li>,而不是<ul>.我怎样才能做到这一点?
我打得四处e.preventDefault(),e.stopPropagation(),但没有成功.
class List extends React.Component {
constructor(props) {
super(props);
}
handleClick() {
// do something
}
render() {
return (
<ul
onClick={(e) => {
console.log('parent');
this.handleClick();
}}
>
<li
onClick={(e) => {
console.log('child');
// prevent default? prevent propagation?
this.handleClick();
}}
>
</li>
</ul>
)
}
}
// => parent
// => child
Run Code Online (Sandbox Code Playgroud) 现在已经有几天了.
根据文档,React有一个合成事件系统,它是一个a cross-browser wrapper around the browser's native event.通过文档,我的理解是正确的,自定义(合成)事件系统,不是效率,而是跨浏览器兼容性.
换句话说,React仍然将事件附加到元素而不是父元素上更有效的事件委派方法?
我在Firefox Inspector中也注意到了这一点,这引起了最初的好奇心.
提出问题的原因是我正在开发一个应用程序,用户可能会选择一千个元素并将它们拖动到屏幕上,因此最终会出现事件委托.