我正在尝试将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 scrolling。当我运行这个例子时,它不起作用。所以我尝试直接绑定this._handleScroll渲染方法,它也不起作用。
<div ref="list" onScroll={this._handleScroll.bind(this)> ... </div>
所以我打开了chrome检查器,直接添加onscroll事件:
document.getElementById('#list').addEventListener('scroll', ...);
它正在工作!我不知道为什么会这样。这是React的错误还是什么?还是我错过了什么?任何设备都将非常感激。
答案 0 :(得分:9)
问题的根源是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);
}
/* .... */
}