Как добавить событие прокрутки в компоненте реакции
Я пытаюсь добавить 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))
и я получаю правильный результат, но событие прокрутки никогда не запускается вообще. Я заглянул сюда, но все равно не смог. Любая помощь будет высоко ценится.
4 ответа
Вы должны связать это с элементом в контексте.
render() {
return (
<table ref="table" onScroll={this.listenScrollEvent.bind(this)}>
[...]
</table>
)
}
Ты можешь использовать onScroll
атрибут:
listenScrollEvent() {
console.log('Scroll event detected!');
}
render() {
return (
<table onScroll={this.listenScrollEvent}>
[...]
</table>
)
}
Вот пример: https://jsfiddle.net/81Lujabv/
Я искал что-то подобное. Добавление прослушивателя событий в окно вместо ReactDom.findDOMNode работало для меня...
componentDidMount() {
window.addEventListener('scroll', this.handleScrollToElement);
}
componentWillUnmount() {
window.removeEventListener('scroll', this.handleScrollToElement);
}
handleScrollToElement(event) {
console.log('Fired ' + event)
}
Согласно документам React ( https://reactjs.org/docs/handling-events.html),
События React называются с использованием camelCase, а не в нижнем регистре. Вы можете установить атрибуты, как вы делаете с чистым HTML.
HTML:
<div onclick="..." onscroll="...">
...
</div>
JSX:
<div onClick={...} onScroll={...}>
...
</div>
Вы должны создать элемент блока обертки, который имеет фиксированную высоту, чтобы включить прокрутку.
Я нашел хорошее решение этой проблемы. Работает следующий фрагмент кода, где слушатель находится только в определенном классе / div:React версия 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().
Дайте это попробовать, добавил .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>
)
}