这是一个基本组件。<ul>和<li>都有onClick函数。我只想在<li>上的onClick来触发,而不是<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

当前回答

这并不是100%理想的,但是如果在儿童->儿童时尚中传递道具太痛苦,或者创建Context. provider /Context。消费者只是为了这个目的),并且你正在处理另一个库,它有自己的处理程序,它在你的库之前运行,你也可以尝试:

   function myHandler(e) { 
        e.persist(); 
        e.nativeEvent.stopImmediatePropagation();
        e.stopPropagation(); 
   }

据我所知,这件事。persist方法可以防止对象立即被扔回React的SyntheticEvent池。因此,在React中传递的事件在你到达它的时候实际上并不存在!这种情况发生在孙辈中,因为React处理内部的事情的方式是首先检查父级的SyntheticEvent处理程序(特别是如果父级有一个回调)。

只要你没有调用持久化,这将创建重要的内存继续创建事件,如onMouseMove(你没有创建某种Cookie Clicker游戏,如奶奶的饼干),这应该是完全没问题的!

另外请注意:通过偶尔阅读他们的GitHub,我们应该密切关注React的未来版本,因为他们可能最终会解决一些痛苦,因为他们似乎正在朝着在编译器/编译器中折叠React代码的方向发展。

其他回答

我有问题得到event.stopPropagation()工作。如果您也这样做,尝试将其移动到您的点击处理程序函数的顶部,这是我需要做的事情来阻止事件冒泡。示例函数:

  toggleFilter(e) {
    e.stopPropagation(); // If moved to the end of the function, will not work
    let target = e.target;
    let i = 10; // Sanity breaker

    while(true) {
      if (--i === 0) { return; }
      if (target.classList.contains("filter")) {
        target.classList.toggle("active");
        break;
      }
      target = target.parentNode;
    }
  }

新的方法更简单,会节省你一些时间!只需将事件传递给原始的单击处理程序并调用preventDefault();。

clickHandler(e){
    e.preventDefault();
    //Your functionality here
}

这是一种简单的方法,可以防止单击事件向前移动到下一个组件,然后调用你的yourFunction。

<Button onClick={(e)=> {e.stopPropagation(); yourFunction(someParam)}}>Delete</Button>

可以通过检查事件目标来避免事件冒泡。 例如,如果你有输入嵌套到div元素,你有处理点击事件的处理器,你不想处理它,当输入被点击,你可以只传递事件。目标放入你的处理程序并检查处理程序是否应该基于目标的属性执行。 例如,你可以检查如果(目标。localName === "input") {return}。 因此,这是一种“避免”处理程序执行的方法

React在文档中使用事件委托和单个事件监听器来处理冒泡事件,比如本例中的'click',这意味着停止传播是不可能的;当你在React中与它交互时,真实的事件已经传播了。在React的合成事件上stopPropagation是可能的,因为React在内部处理合成事件的传播。

stopPropagation: function(e){
    e.stopPropagation();
    e.nativeEvent.stopImmediatePropagation();
}