Реагировать в CSS с реакцией в окне просмотра

#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 в компоненте класса). В соответствии с состоянием измените класс элемента, который вы хотите показать или скрыть.