【问题标题】:React onScroll not working反应 onScroll 不起作用
【发布时间】:2016-10-16 07:32:46
【问题描述】:

我正在尝试将 onscroll 事件处理程序添加到特定的 dom 元素。看这段代码:

class ScrollingApp extends React.Component {
    ...
    _handleScroll(ev) {
        console.log("Scrolling!");
    }
    componentDidMount() {
        this.refs.list.addEventListener('scroll', this._handleScroll);
    }
    componentWillUnmount() {
        this.refs.list.removeEventListener('scroll', this._handleScroll);
    }
    render() {
        return (
            <div ref="list">
                {
                    this.props.items.map( (item) => {
                        return (<Item item={item} />);
                    })
                }
            </div>
        );
    }
}

代码非常简单,如您所见,我想处理 div#list 滚动。当我运行这个示例时,它不起作用。所以我尝试直接在render方法上绑定this._handleScroll,也不管用。

<div ref="list" onScroll={this._handleScroll.bind(this)> ... </div>

所以我打开了 chrome 检查器,直接添加了 onscroll 事件:

document.getElementById('#list').addEventListener('scroll', ...);

它正在工作!我不知道为什么会这样。这是 React 的错误还是什么?还是我错过了什么?任何设备都会非常感激。

【问题讨论】:

  • 它对我有用 (webpackbin.com/V1ECCW5Vb),在块内滚动,然后单击页面顶部的“日志”按钮以查看日志。

标签: reactjs


【解决方案1】:

问题的根源在于this.refs.list 是一个 React 组件,而不是一个 DOM 节点。要获取具有addEventListener() 方法的DOM 元素,您需要调用ReactDOM.findDOMNode()

class ScrollingApp extends React.Component {

    _handleScroll(ev) {
        console.log("Scrolling!");
    }
    componentDidMount() {
        const list = ReactDOM.findDOMNode(this.refs.list)
        list.addEventListener('scroll', this._handleScroll);
    }
    componentWillUnmount() {
        const list = ReactDOM.findDOMNode(this.refs.list)
        list.removeEventListener('scroll', this._handleScroll);
    }
    /* .... */
}

【讨论】:

  • findDOMNode 已弃用。无需将 div ref 设置为“list”,您需要使用 &lt;div ref={node =&gt; this.list = node} 进行设置,然后您的挂载/卸载函数可以直接访问变量,而无需查找节点 this.list.addEventListener(...
猜你喜欢
  • 1970-01-01
  • 2017-07-07
  • 2017-03-10
  • 2018-10-31
  • 2016-11-13
  • 1970-01-01
  • 2017-10-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多