这是一个基本组件。<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

当前回答

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

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

其他回答

解决这个问题的另一种方法是在子进程上设置onMouseEnter和onMouseLeave事件。(你的< li >标签) 当鼠标悬停在子进程上时,您可以设置一个特定的状态来停止父进程以执行onClick函数内容。 喜欢的东西:

class List extends React.Component {
  constructor(props) {
    super(props)
    this.state.overLi = false
  }

  handleClick() {
    // do something
  }

  render() {
    return (
      <ul
        onClick={(e) => {
          if (!this.state.overLi) {
            console.log("parent")
            this.handleClick()
          }
        }}
      >
        <li
          onClick={(e) => {
            console.log("child")
            // prevent default? prevent propagation?
            this.handleClick()
          }}
          onMouseEnter={() =>
            this.setState({
              overLi: true,
            })
          }
          onMouseLeave={() =>
            this.setState({
              overLi: false,
            })}
        ></li>
      </ul>
    )
  }
}

我已经搜索了很多,没有设法实现任何解决方案为我的上下文使用e.s stoppropagation ()

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

我有问题得到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;
    }
  }

我也有同样的问题。我发现stopPropagation确实有用。我将把列表项拆分为一个单独的组件,如下所示:

class List extends React.Component {
  handleClick = e => {
    // do something
  }

  render() {
    return (
      <ul onClick={this.handleClick}>
        <ListItem onClick={this.handleClick}>Item</ListItem> 
      </ul>
    )
  }
}

class ListItem extends React.Component {
  handleClick = e => {
    e.stopPropagation();  //  <------ Here is the magic
    this.props.onClick();
  }

  render() {
    return (
      <li onClick={this.handleClick}>
        {this.props.children}
      </li>       
    )
  }
}

如果希望发生嵌套元素中的操作而不是父元素中的操作,则可以从父元素的操作处理程序中检查目标的类型,然后根据该类型执行操作,也就是说,如果目标是嵌套元素,则不执行任何操作。否则两个处理程序都将被调用。

// Handler of the parent element. Let's assume the nested element is a checkbox
function handleSingleSelection(e) {
    if(e.target.type !== 'checkbox') {
        // We do not do anything from the 
        // parent handler if the target is a checkbox ( our nested element)
        // Note that the target will always be the nested element
        dispatch(lineSelectionSingle({ line }))
    }
}