Reputation: 2562
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
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
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