【问题标题】:How to trigger a state change when hovering over an element悬停在元素上时如何触发状态更改
【发布时间】:2016-05-20 20:48:18
【问题描述】:

我基本上想在用户将鼠标悬停在该组件上时触发组件状态的更改。

由于 onMouseEnter 和 onMouseLeave 在某些条件下无法正常工作 (https://github.com/facebook/react/issues/6807),是否有替代方案?

编辑: 我认为这与重新渲染有关。当组件属于同一类型但我强制重新渲染时,它会导致相同的问题。

class onHover extends Component {

  constructor(props) {
    super(props);
    this.state = {
      bool: false,
    }
  }

  render() {
    return (
      <div onMouseEnter={() => this.setState({ bool: true })} onMouseLeave={() => this.setState({ bool: false })}>
        {
          this.state.bool ? (
            <div key={Math.random()}>[OPTION1] show after onMouseEnter</div>
          ) : (
            <div key={Math.random()}>[OPTION2] show after onMouseLeave</div>
          )
        }
      </div>
    )
  }
}

【问题讨论】:

  • 对我来说,当我从右侧或左侧悬停在/外部时,它工作正常。从顶部/底部看它坏了。
  • 仅当节点不遵循正常的 dom 结构 e.G 位置:固定顶部:0 左侧:0

标签: reactjs


【解决方案1】:

来自文档:

onMouseEnter 和 onMouseLeave 事件从元素传播 留给正在输入的人,而不是普通的冒泡和 没有捕获阶段。

尝试使用 onMouseOut、onMouseOver 代替

<div onMouseOver={() => this.setState({ bool: true })} onMouseOut={() => this.setState({ bool: false })}>
  {
    this.state.bool ? (
      <span>[OPTION1] show after onMouseEnter</span>
    ) : (
      <div>[OPTION2] show after onMouseLeave</div>
    )
  }
</div>

【讨论】:

  • @MoeSattler 你解决了这个问题吗?我也面临同样的问题。
  • 如果您不想触发数百万次,则必须使用_.lodash debounce。
  • 迪米特里!在互联网搜索了几个小时并质疑我的理智之后,就是这样! debounce 减慢它,否则 mouseOver 将被一遍又一遍地调用
猜你喜欢
  • 2017-11-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-05
相关资源
最近更新 更多