меню bulma не работает в gatsbyjs - PullRequest
0 голосов
/ 01 ноября 2018

GatsbyJS новичок здесь, пытаясь заставить меню Bulma реагировать, чтобы применить класс «is-active» к меню (gatsby v2 с gatsby starter netlify cms). весь код здесь: https://github.com/pddew/gatsby-starter-netlify-cms

В настоящее время кнопка переключения и теги сценария появляются, но кнопка не отвечает.

Существует рабочая версия этого в gatsby startter business - когда я проверяю и сравниваю свой сайт с этим, я не могу обнаружить ошибку, только то, что на кнопке переключения нет прослушивателя событий когда кажется, что должно быть. Когда я проверяю сайт, вызывается сценарий toggle.js, который вставляется перед закрывающим тегом body и просматриваются.

Я безуспешно пытался создать и развернуть, очистить кеш и поменять сценарии на код, предложенный Булмой.

Вот соответствующий код. Любая помощь с этим очень ценится; Я немного застрял!

в Layout.js:

    import React from 'react' import Helmet from 'react-helmet'

import Navbar from '../components/Navbar' import Footer from '../components/Footer' import './all.sass'

const TemplateWrapper = ({ children }) => (   <div>
    <Helmet title="Immediate Start Jobs" />
    <Navbar />
    <div>{children}</div>
    <Footer />   </div> )

export default TemplateWrapper

в Навбаре:

<button className="button navbar-burger" data-target="navMenu">
      <span />
      <span />
      <span />
    </button>
  </div>
  <div className="navbar-menu" id="navMenu">
    <div className="navbar-start">
      <Link className="navbar-item" to="/about">
        About
      </Link>
      <Link className="navbar-item" to="/products">
        Products
      </Link>
      <Link className="navbar-item" to="/blog">
      Blog
    </Link>
    </div>

в html.js

    import React from "react"
import PropTypes from "prop-types"

export default class HTML extends React.Component {
  render() {
    return (
      <html {...this.props.htmlAttributes}>
        <head>
          <meta charSet="utf-8" />
          <meta httpEquiv="x-ua-compatible" content="ie=edge" />
          <meta
            name="viewport"
            content="width=device-width, initial-scale=1, shrink-to-fit=no"
          />
          {this.props.headComponents}
        </head>
        <body {...this.props.bodyAttributes}>
          {this.props.preBodyComponents}
          <div
            key={`body`}
            id="___gatsby"
            dangerouslySetInnerHTML={{ __html: this.props.body }}
          />
          {this.props.postBodyComponents}
          <script src={__PATH_PREFIX__ + '/js/toggle.js'} />

        </body>
      </html>
    )
  }
}

HTML.propTypes = {
  htmlAttributes: PropTypes.object,
  headComponents: PropTypes.array,
  bodyAttributes: PropTypes.object,
  preBodyComponents: PropTypes.array,
  body: PropTypes.string,
  postBodyComponents: PropTypes.array,
}

И мой toggle.js, хранящийся в static / js /

    document.addEventListener('DOMContentLoaded', function () {
  // Get all "navbar-burger" elements
  var $navbarBurgers = Array.prototype.slice.call(document.querySelectorAll('.navbar-burger'), 0)
  // Check if there are any navbar burgers
  if ($navbarBurgers.length > 0) {
    // Add a click event on each of them
    $navbarBurgers.forEach(function ($el) {
      $el.addEventListener('click', function () {
        // Get the target from the "data-target" attribute
        var target = $el.dataset.target
        var $target = document.getElementById(target)
        // Toggle the className on both the "navbar-burger" and the "navbar-menu"
        $el.classList.toggle('is-active')
        $target.classList.toggle('is-active')
      })
    })
  }
})

Ответы [ 2 ]

0 голосов
/ 28 мая 2019

Это просто стоимость моих двух пенни: https://nhpcr.codesandbox.io/

ЦСИ / Navbar.js


import React from 'react';
import PropTypes from 'prop-types';

const NavbarItem = props => (
  <a className="navbar-item is-capitalized" href={`#${props.page}`}>
    {props.page}
  </a>
);
const NavbarBurger = props => (
  <button
    onClick={props.toggleMenu}
    className={`button navbar-burger ${props.active ? 'is-active' : ''}`}
  >
    <span />
    <span />
    <span />
  </button>
);

export default class Navbar extends React.Component {
  state = {
    activeMenu: false,
  };
  toggleMenu = () => {
    this.setState({
      activeMenu: !this.state.activeMenu,
    });
  };
  render() {
    let { pages = [], color } = this.props;
    let navbarItems = pages.map(page => <NavbarItem page={page} key={page} />);
    return (
      <nav className={`navbar is-fixed-top is-${color}`}>
        <div className="navbar-brand">
          <NavbarItem page="logo" />
          <NavbarBurger
            active={this.state.activeMenu}
            toggleMenu={this.toggleMenu}
          />
        </div>
        <div
          className={`navbar-menu ${this.state.activeMenu ? 'is-active' : ''}`}
        >
          <div className="navbar-start">{navbarItems}</div>
        </div>
      </nav>
    );
  }
}

Navbar.propTypes = {
  pages: PropTypes.array.isRequired,
  color: PropTypes.string,
};

ЦСИ / index.js

import React from 'react';
import { render } from 'react-dom';

import Navbar from './Navbar';

import 'bulma/css/bulma.css';

const styles = {
  fontFamily: 'sans-serif',
  textAlign: 'center',
};

const pages = ['about', 'contact', 'sitemap'];
const App = () => (
  <div style={styles}>
    <Navbar pages={pages} />
  </div>
);

render(<App />, document.getElementById('root'));
0 голосов
/ 17 ноября 2018

Я новичок в Гэтсби, но мне нужно было найти способ заставить мою навигационную панель работать. Мое решение довольно быстрое и грязное, но оно работает. Если вы создаете веб-сайт с большим количеством компонентов, которые меняют состояние, я бы предложил вместо этого использовать redux и центральный магазин. Моим решением было просто использовать панель навигации, которая обрабатывает свое собственное состояние.

import React, { Component } from 'react'
import Link from 'gatsby-link'

class Navbar extends Component {

    state = {
        //This sets the state of Bulma elements
        navbarIsActive: "navbar-item has-dropdown"
      }

      //This opens the navbar dropdown
      navbarOpenDropdown = () => {
        this.setState({
          navbarIsActive: "navbar-item has-dropdown is-active"
        })
      }

      //This closes the navbar dropdown
      navbarCloseDropdown = () => {
        this.setState({
          navbarIsActive: "navbar-item has-dropdown"
        })
      }

    render() {
        return(
            <div>
                <nav class="navbar is-transparent" role="navigation" aria-label="dropdown navigation">
                    <a class="navbar-item">
                        <h1>Title!</h1>
                    </a>

                    <div 
                        class={this.state.navbarIsActive}
                        onMouseEnter={this.navbarOpenDropdown}
                        onMouseLeave={this.navbarCloseDropdown}
                        >
                        <a class="navbar-link">
                            Docs
                        </a>

                        <div class="navbar-dropdown is-boxed">
                            <Link to="/">Home</Link>
                            <Link to="/about">About Us</Link>
                            <Link to="/blog">Blog</Link>
                            <hr class="navbar-divider"/>
                            <div class="navbar-item">
                                Version 0.7.2
                            </div>
                        </div>
                    </div>
                </nav>

                <section class="hero">
                    <div class="hero-body">
                        <p class="title">
                            Documentation
                        </p>
                        <p class="subtitle">
                            Everything you need to <strong>create a website</strong> with Bulma
                        </p>
                    </div>
                </section>
            </div>
        )
    }
}

export default Navbar;
...