如何在react组件中添加scroll事件

时间:2016-09-05 07:20:52

标签: javascript reactjs ecmascript-6

我试图在桌面上添加onScroll事件。这就是我尝试过的:

componentDidMount() {
    ReactDOM.findDOMNode(this.refs.table).addEventListener('scroll', this.listenScrollEvent);
}

componentWillUnmount() {
    ReactDOM.findDOMNode(this.refs.table).removeEventListener('scroll', this.listenScrollEvent);
}

listenScrollEvent() {
    console.log('Scroll event detected!');
}

render() {
    return (
        <table ref="table">
           [...]
        </table>
    )
}

我尝试了console.log(ReactDOM.findDOMNode(this.refs.table))并且我得到了正确的结果,但滚动事件根本没有被触发。我查看here但仍然失败了。任何帮助都会非常感激。

6 个答案:

答案 0 :(得分:8)

您需要将其绑定到上下文中的元素。

render() {
    return (
        <table ref="table" onScroll={this.listenScrollEvent.bind(this)}>
           [...]
        </table>
    )
}

答案 1 :(得分:4)

您可以使用'属性:

<a href="../admin/gambar/<?php echo $row['file']; ?>" class="btn btn-success" role="button" download>

以下是一个示例:https://jsfiddle.net/81Lujabv/

答案 2 :(得分:4)

我一直想做类似的事情。将事件侦听器而不是ReactDom添加到窗口中。findDOMNode对我有用...

componentDidMount() {
    window.addEventListener('scroll', this.handleScrollToElement);
}

componentWillUnmount() {
    window.removeEventListener('scroll', this.handleScrollToElement);
}

handleScrollToElement(event) {
    console.log('Fired ' + event)
}

答案 3 :(得分:0)

我一直在寻找解决这个问题的好方法。以下代码可以正常工作,其中侦听器仅位于特定的class / div 上: 反应版本为16.0.0

首次导入 ReactDOM,import ReactDOM from "react-dom";

class xyz extends Component部分中

然后

  constructor(props) {
    super();
    this.state = {
        vPos : 0
    }
    this.listenScrollEvent = this.listenScrollEvent.bind(this);
  }

  componentDidMount() {
    ReactDOM.findDOMNode(this.refs.category_scroll).addEventListener('scroll', this.listenScrollEvent);
  }

  componentWillUnmount() {
      ReactDOM.findDOMNode(this.refs.category_scroll).removeEventListener('scroll', this.listenScrollEvent);
  }

  listenScrollEvent(event) {
    console.log('firee');
    this.setState({
        vPos: event.target.body.scrollTop
    });
  }

粘贴上述功能后,在render()方法中,无论您想命名为ref方法如何,都可以做到,确保 findDOMNode中也使用了相同的名称,即findDOMNode(this.refs.category_scroll)

<div onScroll={this.listenScrollEvent} ref="category_scroll">
...
</div>

如果它是水平滚动,则event.currentTarget.scrollTop在listenScrollEvent()函数中起作用。

答案 4 :(得分:0)

根据React文档(https://reactjs.org/docs/handling-events.html

  

反应事件使用camelCase命名,而不是小写。   您可以像使用纯HTML一样设置属性。

HTML:

<div onclick="..." onscroll="...">
  ...
</div>

JSX:

<div onClick={...} onScroll={...}>
  ...
</div>

您应该创建一个具有固定高度的包装器块元素以启用滚动。

答案 5 :(得分:-1)

尝试一下,将.bind(this)添加到this.listenScrollEvent时将其传递给addEventListener

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

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

    listenScrollEvent() {
        console.log('Scroll event detected!');
    }

    render() {
        return (
            <table ref="table">
               [...]
            </table>
        )
    }