【问题标题】:How to add scroll event on a React component instead of adding on window object?如何在 React 组件上添加滚动事件而不是在窗口对象上添加?
【发布时间】:2019-02-15 11:42:48
【问题描述】:

我使用 ReactJS 创建了一份简历,该简历的正文有 100vw100vh 尺寸,即在窗口/正文级别没有滚动,但在简历里面有一个包含滚动的组件。最后我想创建一个粘性标题。但在创建粘性标头之前,此代码应首先运行。我试过这个:

componentDidMount() {
 ReactDOM.findDOMNode(this.refs.stickyHeader).addEventListener('scroll', this.isScrollOccured.bind(this));
}

componentWillUnmount() {
 ReactDOM.findDOMNode(this.refs.stickyHeader).removeEventListener('scroll', this.isScrollOccured.bind(this));
}

isScrollOccured() {
    console.log('Scrolling Occured');
}

render() {
    return (
        <div className="Container">
                        <div className="Header" ref="stickyHeader">
                        [...]
                        </div>
                </div>
                )
}

这没有给出任何响应,但是如果我在 addEventListener 中用 wheel 事件更改 scroll 事件,它可以正常工作,但我不想使用 轮子。我检查了Other's Solution,但它对我不起作用。帮我找出解决办法。如有必要,我将上传我的作品的 Image.png。

【问题讨论】:

    标签: reactjs


    【解决方案1】:

    refs API 已更改。试试这个

      stickyHeader = React.createRef()
      componentDidMount() {
        this.stickyHeader.current.addEventListener(
          "scroll",
          this.isScrollOccured.bind(this)
        );
      }
    
      componentWillUnmount() {
        this.stickyHeader.current.removeEventListener(
          "scroll",
          this.isScrollOccured.bind(this)
        );
      }
    
      isScrollOccured() {
        console.log("Scrolling Occured");
      }
    
      render() {
        return (
          <div className="Container">
            <div className="Header" ref={this.stickyHeader}>
              [...]
            </div>
          </div>
        );
      }
    

    您可以了解更多关于 refs here

    【讨论】:

    • 但这不起作用,发生错误:TypeError: Cannot read property 'addEventListener' of undefined at "this.stickyHeader.current.removeEventListener(" line. 如果我从上面的代码中删除当前,则不会发生错误,但代码也无法正常工作。
    • 对不起,这是我的错误。我同时使用了回调 refs 和 createRef API。我已经更新了答案。很抱歉造成混乱。
    • 现在错误消失了,但 "scroll" 仍然不起作用。只有 "wheel" 工作。
    • 我不确定为什么会发生这种情况...尝试找出“滚动”是否是唯一发生故障的事件...如果没有任何效果,我建议在 SO 上发布一个新问题
    • 我发现我经常不得不使用setTimeoutref.current.addEventListenercurrent 很少立即可用。检查current 的存在也可能会有所帮助。
    猜你喜欢
    • 1970-01-01
    • 2022-11-10
    • 1970-01-01
    • 2017-01-12
    • 2013-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多