Как отловить событие scroll? In react

218
17 апреля 2018, 03:44

Мне нужно отловить событие scroll вверх и вниз, и в зависимости от этого менять this.props.history.

componentDidMount() {
    window.addEventListener('scroll', this.handleScroll);
}
componentWillUnmount() {
    window.removeEventListener('scroll', this.handleScroll);
}
handleScroll = () => {
    if (window.scrollY === 0) {
        console.log('up');
    }
    else if (window.scrollY !== 0) {
        console.log('down');
    }
};
Answer 1

Попробуйте данный вариант (главное чтобы страница скролилась):

Создаете в компоненте переменную в которую будете записывать последнее значение (по умолчанию 0) и переменную для направления (по умолчанию false - она нужна для того чтобы не делать лишние изменения в this.props.history):

class ... extends ... {
    lastScroll = 0
    directionDown = false
    componentDidMount() {
        ...
    }
}

Далее переписываете свою функцию:

handleScroll = () => {
    // Берете значение
    const scrollTop = document.documentElement.scrollTop || document.body.scrollTop;
    // Сравниваете 2 значение
    if (scrollTop > this.lastScroll && !this.directionDown) {
        console.log('down');
        this.directionDown = true;
        // здесь манипуляции с this.props.history
    } else if (scrollTop < this.lastScroll && this.directionDown) {
        console.log('up');
        this.directionDown = false;
        // здесь манипуляции с this.props.history
    }
    this.lastScroll = scrollTop;
}

Если нужно чтобы просто отслеживалось вниз и вверх (не изменения, было вверх стало вниз), то уберите все что связано с directionDown.

READ ALSO
Создать новые строки из строки

Создать новые строки из строки

Есть переменная которая хранит строки текста, текст разделяется пробеламиКак извлечь из переменной слова и расположить с новой строки с последующим...

150
Не работает .focus()

Не работает .focus()

Не работаетfocus() В консоли console

125
На происходит вставка(prepend) html из js

На происходит вставка(prepend) html из js

У меня есть форма, при сабмите которой мне нужно что бы на странице появились введенные данныеНа странице они выводятся так: Есть один блок...

113