【问题标题】:Event handles in multiple hierarchies React多个层次结构中的事件句柄 React
【发布时间】:2016-02-29 09:55:57
【问题描述】:

我有一个包装按钮的第三方组件:

<ExtComponent> <!-- this component has it's own internal onClick handler -->
  <button />
</ExtComponent>

该组件有一个内部onClick 事件处理程序,它优先于我尝试添加到&lt;button&gt; 的任何onClick。所以当我这样做时

<ExtComponent> <!-- this component has it's own internal onClick handler -->
  <button onClick={this.onClick} /> <!-- this is not being triggered as ExtComponent onClick is being called instead -->
</ExtComponent>

我的组件 onClick 没有被调用。

有没有办法先处理子组件(按钮)onClick,然后继续(或不)到ExtComponent onClick?

(假设我可以更改第 3 方组件(我可以分叉并更改它))

【问题讨论】:

  • 不清楚你在问什么。单击按钮会调用错误的处理程序,还是根本不触发?你能提供一个组件渲染后 HTML 的示例吗?
  • @DanPrince 这是一个比较笼统的问题,我更新了这个问题更清楚
  • 我知道,但即使在一般情况下,React 组件也不能拥有响应点击的事件处理程序,因为它们不会呈现到 DOM 中。内部点击处理程序附加到哪个元素,它与按钮之间的层次关系是什么?
  • @DanPrince ExtComponent 最终被渲染成带有onClick 处理程序的&lt;div&gt;,该处理程序打开某种对话框。我想根据某些道具有条件地打开该对话框,但由于我无法访问我要询问的那个元素

标签: javascript reactjs


【解决方案1】:

您不需要从组件中删除或更新点击处理程序。只是阻止事件到达那里。

如果按钮在具有点击处理程序的 div 内呈现,那么您可以 prevent the click event from propagating 直到该 div。

onClick: function(event) {
  event.stopPropagation();
  // now handle the click
}

如果您想允许事件在某些条件下传播,那么就不要停止传播。

onClick: function(event) {
  if(this.prop.foo == 'bar') {
    event.stopPropagation();
  } else {
    // let the event trigger the upper event listeners too
  }
}

【讨论】:

  • 似乎我遇到了一个问题,阻止了我的内部组件注册点击事件。修复了这个问题,我确实看到了,就像你说的,从内到外的均匀气泡,我可以使用stopPropagation 来阻止它。很抱歉,感谢您为我指出正确的方向:-)
猜你喜欢
  • 1970-01-01
  • 2019-03-22
  • 2022-06-29
  • 1970-01-01
  • 2011-09-04
  • 2018-06-27
  • 1970-01-01
  • 1970-01-01
  • 2016-03-29
相关资源
最近更新 更多