2016-04-28 170 views
1

我碰到过这样的问题: 有mousedown处理程序和子元素的父元素。React模板鼠标事件在容器的鼠标事件后触发

如果我需要通过创建子事件之前,鼠标按下处理器阵营里

var mousedown = function(e) { console.log('child-2: mousedown') }; 
    var childTemplate = React.createClass({ 
    render: function() { 
     return React.createElement("rect", {id: "child-2", x: "220", y: "220", width: "30", height: "30", onMouseDown: mousedown, fill: "blue"}); 
    } 
    }); 

    var template = React.createElement(childTemplate, {}); 
    ReactDOM.render(template, document.getElementById('area')); 

然后父鼠标按下火灾模板添加子元素(jsfiddle example)

有没有办法先强迫孩子鼠标按下(并阻止父母的鼠标按下与例如e.stopPropagation)而不重写反应模板中的所有内容?

回答

1

因为您正在使用jQuery处理某些事件处理程序,而针对其他事件处理程序使用jQuery,因此事件顺序不能仅通过e.stopPropagation进行管理。根据我所做的一些测试,甚至没有发生事件冒泡。

解决方法是使用React来管理所有内容,但如果这不是一个选项,您可以明确地检查您点击哪个组件,并在需要时停止运行parent

例如:

$('#parent').unbind('mousedown').bind('mousedown', function(e) { 
    if(e.target.id != "parent") return; //if not "#parent" don't proceed. 
    console.log('parent: mousedown'); 
}); 

通过传递事件对象到事件处理程序,您可以检查被点击哪个元素。如果我们点击任何元素不是parent,然后返回。如果元素点击确实parent ID,那么它将执行控制台日志。

这里是一个完整的演示:Fiddle

$(document).ready(function() { 
    $('#parent').unbind('mousedown').bind('mousedown', function(e) { 
    if(e.target.id != "parent") return; 
    console.log('parent: mousedown'); 
    }); 

    $('#child-1').on('mousedown', function() { 
    console.log('child-1: mousedown'); 
    }); 

    var mousedown = function(e) { 
    console.log('child-2: mousedown') 
    }; 

    var childTemplate = React.createClass({ 
    render: function() { 
     return React.createElement("rect", {id: "child-2", x: "220", y: "220", width: "30", height: "30", onMouseDown: mousedown, fill: "blue"}); 
    } 
    }); 

    var template = React.createElement(childTemplate, {}); 
    ReactDOM.render(template, document.getElementById('area')); 
}); 
+0

我害怕它。你能否说这是否真的是一个反应的缺陷(特征),还是这是一种常见的预期行为? 无论如何谢谢您的详细解答 – user1820686

+0

我无法肯定地说,但jQuery并非真正意义上与Reactjs合作,反之亦然。所以这不是一个错误(因为它们不是为了一起工作),但它也不是故意的效果。 – Chris