#css #reactjs
#css #reactjs
Вопрос:
Я использую react в окне просмотра отсюда: https://github.com/roderickhsiao/react-in-viewport и я настроил котловую плиту так, чтобы работала следующая строка кода:
<ViewportBlock onEnterViewport={() => console.log('enter')} onLeaveViewport={() => console.log('leave')} />
Смотрю на консоль.в журнале говорится, что введите и оставьте там, где мне это тоже нужно. Тем не менее, мне нужно, чтобы это указывало onEnterViewport set .Заголовок (имя класса css — заголовок) display:none
в css, а onLeaveViewport установлен в display:block
Редактировать: полный код:
const Block = (props: { inViewport: boolean }) => {
const { inViewport, forwardedRef } = props;
const color = inViewport ? '#217ac0' : '#ff9800';
const text = inViewport ? 'In viewport' : 'Not in viewport';
return (
<div className="viewport-block" ref={forwardedRef}>
{/* <h3>{ text }</h3>
<div style={{ width: '400px', height: '300px', background: color }} /> */}
<Link to="Header" spy={true} smooth={true} offset={-100} duration={1400}><img src={arrow} alt="arrow" className={inViewport ? 'hide' : 'Header-div2-mainnav-arrow' } /></Link>
</div>
);
};
const ViewportBlock = handleViewport(Block, /** options: {}, config: {} **/);
export const Header = () => ({
componentDidMount: function() {
Events.scrollEvent.register('begin', function(to, element) {
console.log('begin', arguments);
});
Events.scrollEvent.register('end', function(to, element) {
console.log('end', arguments);
});
scrollSpy.update();
},
componentWillUnmount: function() {
Events.scrollEvent.remove('begin');
Events.scrollEvent.remove('end');
},
scrollToBottom: function() {
scroll.scrollToBottom();
},
handleSetActive: function(to) {
console.log(to);
},
render: function() {
return (
<div className="Header">
<div className="Header-div1">
{/* background image */}
<h1 className="Header-div1-number">910-910-910</h1>
<h2 className="Header-div1-email">larryslawn@gmail.com</h2>
</div>
<div className="Header-div2">
<h1 className="Header-div2-h1"><span className="Header-div2-span">Larry's </span>Lawn Mowing</h1>
<p className="Header-div2-p">No job too big or too small, we do it all </p>
<div className="Header-div2-mainnav">
<Link to="Pricing" spy={true} smooth={true} offset={-50} duration={1200}><p>Pricing</p></Link>
<Link to="Services" spy={true} smooth={true} offset={-100} duration={1200}><p className="Header-div2-mainnav-p">Services</p></Link>
<Link to="Contact" spy={true} smooth={true} offset={-100} duration={1400}><p>Contact</p></Link>
</div>
<Block />
</div>
</div>
)
}
})
Ответ №1:
Используется useState
для переключения класса с display: none
Header
помощью компонента:
const Example = () => {
const [inView, setInView] = useState(false)
return (
<>
<ViewportBlock
onEnterViewport={() => setInView(true)}
onLeaveViewport={() => setInView(false)}
/>
<Header className={inView ? 'hide' : '' }>Header</Header>
</>
)
}
CSS:
hide { display: none; }
Комментарии:
1. Мне пришлось переместить некоторые вещи, чтобы включить это, и теперь заголовок отображается, несмотря ни на что, я могу обновить свой пост, чтобы показать код.
2. Вы добавили класс с
display: none
помощью ?3. да, у меня это было написано неправильно, но теперь это исправлено, все еще не работает.
4. Я не уверен, как контролировать, где находится окно просмотра.
5. Используйте
ViewportBlock
и нетBlock
, и передайте обработчики для изменения состояния (setState
в компоненте класса). В соответствии с состоянием измените класс элемента, который вы хотите показать или скрыть.