Как я могу изменить класс этого элемента при прокрутке в React?

Я хочу, чтобы элемент div получал класс «showtext», когда вы прокручиваете 100 пикселей или меньше над элементом. Когда вы находитесь на 100 или более пикселей выше него, он имеет класс «скрытый».

Я пытаюсь использовать ссылку для доступа к элементу div и использую метод showText, чтобы проверить и увидеть, когда мы прокручиваем до 100 пикселей или меньше над этим элементом div, я использую для этого scrollTop.

Затем я использую componentDidMount, чтобы добавить прослушиватель событий окна прокрутки и вызвать мой метод showText.

Я новичок в этом, поэтому я уверен, что здесь есть ошибки и, возможно, плохой код. Но любая помощь приветствуется!

import React, {Component} from 'react';

class SlideIn extends Component{

    state = {
        showTexts: false,
    }

    showText=()=>{
        const node= this.showTextRef;
        if (node.scollTop<=100)
        this.setState({
            showTexts: true
        })
    }



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



    render(){
        const intro= document.querySelector('.intro')
        return(
            <div classname = {this.state.showTexts ? 'showText' : 'hidden'} ref = {node =>this.showTextRef = node}>
             {window.addEventListener('scroll', this.showText)}


                <h1>You did it!</h1> 
            </div>
        )
    }
}

export default SlideIn

Я пытался использовать this.showText в моем событии прокрутки окна, и, как вы видите выше, this.showText() не сработало. Я попытался использовать текущее свойство в моем div ref в моем методе showText, и он выдал ошибку, говоря, что scrollTop не может определить свойство null.

Опять же, я новичок в этом и никогда не добавлял прослушиватель событий окна таким образом, и я никогда не использовал scrollTop.

Спасибо за любую помощь!

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
0
1 536
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ответ принят как подходящий

Когда вы подключаете прослушиватель событий, вы должны передать функцию в качестве параметра. Вы вызываете функцию напрямую, когда добавляете прослушиватель событий.

По сути, вам нужно изменить:

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

к:

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

В вашем прослушивателе прокрутки вы должны проверить положение прокрутки window (это элемент, в котором вы выполняете прокрутку):

showText = () => {
    if (window.scrollY <= 100) {
        this.setState({
            showTexts: true
        });
    }    
}

Кроме того, вы подключаете прослушиватель событий в методе render. Метод render должен содержать только логику для рендеринга элементов.

Эй, @mgarcia, я пробовал, но безуспешно :/

Skyline 14.06.2019 09:38

Я обновил ответ, чтобы исправить другие моменты в исходном коде.

mgarcia 14.06.2019 10:07

Это было правильно, но я сделал const top = window.pageYOffset; в своем методе showText и сделал if (top>100){ Основная проблема, с которой я столкнулся, заключалась в том, что я использовал CSS для тела и html для overflow-x:hidden, и это вызвало проблему с моим прослушивателем событий прокрутки. Поэтому я обернул весь свой основной компонент приложения в div и использовал для него overflow-x:hidden, оставив body и html нетронутыми, и событие прокрутки сработало. До этого не работало.

Skyline 14.06.2019 18:20

Передать функцию как параметр, например

window.addEventListener('scroll', this.showText)

и удалить его из возврата.

Тогда вам просто нужно сделать только это в функции

if (window.scrollY<=100)
    this.setState({
        showTexts: true
    })

используйте свою позицию div здесь

Вам нужно использовать getBoundingCLientRect(), чтобы получить позицию прокрутки. window.addEventListener("scroll", this.showText); вам нужно передать this.showText вместо его вызова. имя класса имеет орфографическую ошибку.

showText = () => {
    const node = this.showTextRef;
    const {
        y = 0
    } = (node && node.getBoundingClientRect()) || {};

    this.setState({
        showTexts: y <= 100
    });
};

componentDidMount() {
    window.addEventListener("scroll", this.showText);
}

render() {
    const intro = document.querySelector(".intro");
    return (
       <div
          className = {this.state.showTexts ? "showText" : "hidden"}
          ref = {node => (this.showTextRef = node)}
       >
          <h1>You did it!</h1>
       </div>
   );
}

condesandbox рабочего примера: https://codesandbox.io/s/intelligent-shannon-1p6sp

Я собрал для вас рабочий образец, вот ссылка: https://codesandbox.io/embed/лето-лес-cksfh

В вашем коде есть несколько вещей, на которые следует обратить внимание:

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

Как уже упоминалось mgracia, использование this.showText() означает, что вы напрямую вызываете функцию. Правильный способ — просто использовать this.showText.

Идея функции showText заключается в том, чтобы узнать, как далеко пользователь прокрутил страницу от верхней позиции документа. Как это называлось с использованием:

const top = window.pageYOffset || document.documentElement.scrollTop;

теперь можно безопасно проверить вашу логику и установить состояние в соответствии с желаемым значением, здесь я выразил это так:

this.setState({
  showTexts: top <= 100
})

В вашем componentDidMount вы должны вызвать showText один раз, чтобы вызвать первую загрузку страницы, иначе при перезагрузке страницы функция не запустится.

Надеюсь, это поможет

Полный код:

class SlideIn extends Component {
  state = {
    showTexts: false,
  }

  showText = () => {
    // get how many px we've scrolled
    const top = window.pageYOffset || document.documentElement.scrollTop;
    this.setState({
      showTexts: top <= 100
    })
  }

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

  render() {
    return (
      <div className = {`box ${this.state.showTexts ? 'visible' : 'hidden'}`}
        ref = {node => this.showTextRef = node}>
      
        <h1>You did it!</h1>
      </div>
    )
  }
}
.App {
  font-family: sans-serif;
  text-align: center;
  height: 2500px;
}

.box {
  width: 100px;
  height: 100px;
  background: blue;
  position: fixed;
  left: 10px;
  top: 10px;
  z-index: 10;
}

.visible {
  display: block;
}

.hidden {
  display: none;
}

Другие вопросы по теме