#javascript #reactjs #scroll #navbar
Вопрос:
У меня есть следующий код:
import React, {useState} from 'React';
import Header from './styles.js';
const HeaderComponent = props =>
{
const [navBg, setNavBg] = useState(false);
const isHome = props.name === 'Homepage' ? true : false;
const changeNavBg = () =>
{
window.scrollY >= 800 ? setNavBg(true) : setNavBg(false);
}
window.addEventListener('scroll', changeNavBg);
return (
<Header {...(isHome amp;amp; navBg ? { backgroundColor: '#00008' : {})} />
)
}
Чего я пытаюсь добиться, так это того, что при прокрутке выше 800 пикселей я хочу, чтобы мой заголовок менял цвета.
Выпьем за ваше время.
Ответ №1:
Вот несколько подходов, которые вы могли бы попробовать
1. Используйте событие пользовательского интерфейса React onScroll
return (
<div onScroll={changeNavBg}>
<Header {...(isHome amp;amp; navBg ? { backgroundColor: '#00008' : {})} />
</div>
)
2. Рассмотрите возможность привязки слушателя к useEffect
import React, {useState} from 'React';
import Header from './styles.js';
const HeaderComponent = props => {
const [navBg, setNavBg] = useState(false);
const isHome = props.name === 'Homepage' ? true : false;
const changeNavBg = () => {
window.scrollY >= 800 ? setNavBg(true) : setNavBg(false);
}
useEffect(() => {
window.addEventListener('scroll', changeNavBg);
return () => {
window.removeEventListener('scroll', changeNavBg);
}
}, [])
return (
<Header {...(isHome amp;amp; navBg ? { backgroundColor: '#00008' : {})} />
)
}
Комментарии:
1. Мне действительно удалось исправить это, передав navBg в качестве опоры в моем styles.js и проверяю там, установлено ли значение true amp; isHome. Тем не менее я отмечу ваш ответ как правильный, поскольку вы заслуживаете его за приложенные усилия. Спасибо.
2. Круто. Спасибо. В любом случае, вот рабочий пример stackblitz.com/edit/react-jddnch?file=src/App.js