Rob Terrell
Rob Terrell

Reputation: 2562

Glide JS with react

followed the documentation and got the following error: TypeError: Cannot read property 'querySelector' of undefined. I have added the following to my index.html

<link
      rel="stylesheet"
      href="node_modules/@glidejs/glide/dist/css/glide.core.min.css"
    /> 

for some reason glide breaks my entire application. Is there another step I need to follow in order to get GlideJS to work in a create-react-app? any suggestions would help a lot. Thanks! my code is as follows:

import React from "react"
import Glide from "@glidejs/glide"

const Test = () => {
  new Glide(".glide").mount()
  return (
    <>
      {" "}
      <div className='glide'>
        <div className='glide__track' data-glide-el='track'>
          <ul className='glide__slides'>
            <li className='glide__slide slider'>1</li>
            <li className='glide__slide slider'>2</li>
            <li className='glide__slide slider'>3</li>
            <li className='glide__slide slider'>4</li>
          </ul>
        </div>
        <div className='glide__arrows' data-glide-el='controls'>
          <button
            className='glide__arrow glide__arrow--prev'
            data-glide-dir='<'
          >
            prev
          </button>
          <button
            className='glide__arrow glide__arrow--next'
            data-glide-dir='>'
          >
            next
          </button>
        </div>
      </div>
    </>
  )
}

export default Test


Upvotes: 1

Views: 5621

Answers (2)

MistaPrime
MistaPrime

Reputation: 1677

Here is just a different way to do the same thing:

import React, { useEffect } from 'react';

import './Test.css';

const Test = () => {
  useEffect(() => {
    // eslint-disable-next-line no-unused-vars
    window.addEventListener('load', (event) => {
      // eslint-disable-next-line no-undef
      new Glide('.glide', {
        gap: 50,
        // eslint-disable-next-line no-undef
        // focusAt: 1,
        peek: 200,
        perView: 3,
        type: 'carousel',
        breakpoints: {
          1600: {
            perView: 2,
          },
          1100: {
            perView: 1,
            peek: 80,
          },
        },
      }).mount();
    });
  }, []);

  return (
    <div className="tiers" id="tiers">
      <h2 className="sectionTitle">Tiers</h2>

      <div className="glide">
        <div className="glide__track" data-glide-el="track">
          <div className="glide__slides">
            <div className="glide__slide tierBox">
              <h4>Tier One</h4>
              <span className="tierTitle">Description:</span>

              <span className="tierTitle">Cost:</span>

              <span className="tierTitle">Starting:</span>

              <span className="tierTitle">Test:</span>

              <span className="tierTitle">Test 2:</span>
            </div>

            <div className="glide__slide tierBox">
              <h4>Tier One</h4>
              <span className="tierTitle">Description:</span>

              <span className="tierTitle">Cost:</span>

              <span className="tierTitle">Starting:</span>

              <span className="tierTitle">Test:</span>

              <span className="tierTitle">Test 2:</span>
            </div>

            <div className="glide__slide tierBox">
              <h4>Tier One</h4>
              <span className="tierTitle">Description:</span>

              <span className="tierTitle">Cost:</span>

              <span className="tierTitle">Starting:</span>

              <span className="tierTitle">Test:</span>

              <span className="tierTitle">Test 2:</span>
            </div>

            <div className="glide__slide tierBox">
              <h4>Tier One</h4>
              <span className="tierTitle">Description:</span>

              <span className="tierTitle">Cost:</span>

              <span className="tierTitle">Starting:</span>

              <span className="tierTitle">Test:</span>

              <span className="tierTitle">Test 2:</span>
            </div>

            <div className="glide__slide tierBox">
              <h4>Tier One</h4>
              <span className="tierTitle">Description:</span>

              <span className="tierTitle">Cost:</span>

              <span className="tierTitle">Starting:</span>

              <span className="tierTitle">Test:</span>

              <span className="tierTitle">Test 2:</span>
            </div>
          </div>
        </div>
        <div className="glide__arrows" data-glide-el="controls">
          <button type="button" className="glide__arrow glide__arrow--left" data-glide-dir="<">prev</button>
          <button type="button" className="glide__arrow glide__arrow--right" data-glide-dir=">">next</button>
        </div>
      </div>

    </div>
  );
};
export default Test;

You also don't need import Glide from "@glidejs/glide" if you are inserting the Glide.js scripts into the head of index.html.

Upvotes: 0

Andre Wicaksono
Andre Wicaksono

Reputation: 64

Use useEffect to mimick componentDidMount(). And mount the slider inside of useEffect()

Try something like this:

import React, { useEffect } from "react"
import Glide from "@glidejs/glide"

// Using SCSS
import "./styles.scss"

const sliderConfiguration= {
  gap: 20,
  perView: 2,
  startAt: 0,
  type: "slider"
};

const Test = () => {
  const slider = new Glide('.glide', sliderConfiguration);

  useEffect(() => {
    return () => slider.mount()
  }, [slider])

  return (
    <>
      {" "}
      <div className='glide'>
        <div className='glide__track' data-glide-el='track'>
          <ul className='glide__slides'>
            <li className='glide__slide slider'>1</li>
            <li className='glide__slide slider'>2</li>
            <li className='glide__slide slider'>3</li>
            <li className='glide__slide slider'>4</li>
          </ul>
        </div>
        <div className='glide__arrows' data-glide-el='controls'>
          <button
            className='glide__arrow glide__arrow--prev'
            data-glide-dir='<'
          >
            prev
          </button>
          <button
            className='glide__arrow glide__arrow--next'
            data-glide-dir='>'
          >
            next
          </button>
        </div>
      </div>
    </>
  )
}

export default Test

styles.scss

// Required Core Stylesheet
@import "node_modules/@glidejs/glide/src/assets/sass/glide.core";

Note: If your slide items using a dynamic data, you should pass variable that contain the data, to useEffect() dependencies.

Upvotes: 4

Related Questions