Как добавить JS для компонентов React в Гэтсби? - PullRequest
0 голосов
/ 11 ноября 2018

Я пытаюсь добавить функцию прокрутки в тегах сценария к этому компоненту заголовка в Гэтсби. Я знаю, что это может работать в html и не реагировать, но как правильно это сделать? Спасибо!

import React from 'react'
import Link from 'gatsby-link'
import './header.css'

const Header = () => (
  <div className='Header'>

    <div className='HeaderGroup'>
      <Link to='/'><img src={require('../img/logo_nav.png')} width='60' /></Link>
      <Link to='/index'>Selected Works</Link>
      <Link to='/uber'>Uber Thoughts</Link>
      <Link to='/awards'>Awards</Link>
      <Link to='/about'>About</Link>
    </div>
  </div>
)

export default Header

<script>
  $(window).scroll(function () {
    if ($(window).scrollTop() > 10) {
      $('.Header').addClass('floatingHeader');
    } else {
      $('.Header').removeClass('floatingHeader');
    }
  }
</script>

1 Ответ

0 голосов
/ 11 ноября 2018

Если вы хотите, чтобы скрипты загружались до готовности DOM, вы можете добавить свои скрипты в файл html.js.

Из документов Гэтсби:

Гэтсби использует компонент React для рендеринга сервера и других части HTML за пределами основного приложения Gatsby.

Подробнее об этом здесь .

В вашем случае вы можете написать свой сценарий в методе жизненного цикла реакции componentDidMount, потому что вам нужен доступ к DOM (поскольку вы используете там jQuery), вам нужно запустить скрипт после тела загружен, поэтому размещение вашего скрипта в <head> не будет работать, вам нужно добавить его в метод componentDidMount, сначала сделав компонент компонентом класса, чтобы получить доступ к методам жизненного цикла реагирования.

import React from 'react'
import Link from 'gatsby-link'
import $ from 'jquery'

import './header.css'

class Header extends React.Component {
  componentDidMount () {
    $(window).scroll(function () {
      if ($(window).scrollTop() > 10) {
        $('.Header').addClass('floatingHeader');
      } else {
        $('.Header').removeClass('floatingHeader');
      }
    })
  }
  render () {
    return (
      <div className='Header'>
        <div className='HeaderGroup'>
          <Link to='/'><img src={require('../img/logo_nav.png')} width='60' /></Link>
          <Link to='/index'>Selected Works</Link>
          <Link to='/uber'>Uber Thoughts</Link>
          <Link to='/awards'>Awards</Link>
         <Link to='/about'>About</Link>
        </div>
      </div>
    )
  }
}

export default Header

Вы также можете использовать шаблон макета Gatsby, такой как проект gatsby-starter-blog , и поместить свой сценарий внизу вызова {children} как <script>Your script</script>, и он будет доступен во всех ваши страницы, так же, как и файл html.js, но поскольку вам нужен доступ к DOM, вам нужно поместить его в тело, чтобы ваш скрипт работал (больше информации о макетах Gatsby здесь ).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...