Я хочу, чтобы элемент 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.
Спасибо за любую помощь!



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Когда вы подключаете прослушиватель событий, вы должны передать функцию в качестве параметра. Вы вызываете функцию напрямую, когда добавляете прослушиватель событий.
По сути, вам нужно изменить:
componentDidMount(){
window.addEventListener('scroll', this.showText() )
}
к:
componentDidMount(){
window.addEventListener('scroll', this.showText)
}
В вашем прослушивателе прокрутки вы должны проверить положение прокрутки window (это элемент, в котором вы выполняете прокрутку):
showText = () => {
if (window.scrollY <= 100) {
this.setState({
showTexts: true
});
}
}
Кроме того, вы подключаете прослушиватель событий в методе render. Метод render должен содержать только логику для рендеринга элементов.
Я обновил ответ, чтобы исправить другие моменты в исходном коде.
Это было правильно, но я сделал const top = window.pageYOffset; в своем методе showText и сделал if (top>100){ Основная проблема, с которой я столкнулся, заключалась в том, что я использовал CSS для тела и html для overflow-x:hidden, и это вызвало проблему с моим прослушивателем событий прокрутки. Поэтому я обернул весь свой основной компонент приложения в div и использовал для него overflow-x:hidden, оставив body и html нетронутыми, и событие прокрутки сработало. До этого не работало.
Передать функцию как параметр, например
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;
}
Эй, @mgarcia, я пробовал, но безуспешно :/