I\'m using GlideJS with a React Project, but it\'s returning a strange behavior. The components are not showing one per view and the width of them is changed.
I just set up the full working demo for you using glidejs
with React
. check it out and let me know whether it works for you. code sandbox
index.js
class Plans extends Component {
state = {
myPlans: [
{ id: 0, text: "plan 0", price: 0 },
{ id: 1, text: "plan 1", price: 1 },
{ id: 2, text: "plan 2", price: 2 },
{ id: 3, text: "plan 3", price: 3 }
]
};
handleOffer = id => {
console.log("handleOffer clicked, id: ", id);
};
render() {
const carouselOptions = { type: "slide", perView: 1, startAt: 0 };
return (
<div className="home-section test">
<SliderGlide options={carouselOptions}>
{this.state.myPlans.map(plan => (
<OfferProduct
key={plan.id}
plan={plan}
handleOffer={this.handleOffer}
/>
))}
</SliderGlide>
</div>
);
}
}
export default Plans;
OfferProduct.js
const OfferProduct = ({ plan, handleOffer }) => {
return (
<>
<div onClick={() => handleOffer(plan.id)} className="card">
<p>
<h3> Card no: {plan.id} </h3>
<span>price: {plan.price}</span>
</p>
</div>
</>
);
};
export default OfferProduct;
SliderGlide.js
export default class SliderGlide extends Component {
state = { id: null };
componentDidMount = () => {
// Generated random id
this.setState(
{ id: `glide-${Math.ceil(Math.random() * 100)}` },
this.initializeGlider
);
};
initializeGlider = () => {
this.slider = new Glide(`#${this.state.id}`, this.props.options);
this.slider.mount();
};
componentWillReceiveProps = newProps => {
if (this.props.options.startAt !== newProps.options.startAt) {
this.slider.go(`=${newProps.options.startAt}`);
}
};
render = () => (
// controls
<div id={this.state.id} className="slider">
<div className="two-controls-btns" data-glide-el="controls">
<button className="arrow-left" data-glide-dir="<" title="start">
<span className="hidden">Start</span>
</button>
<button className="arrow-right" data-glide-dir=">" title="end">
<span className="hidden">End</span>
</button>
</div>
{/* track */}
<div className="glide__track" data-glide-el="track">
<div className="glide__slides" style={{ display: "flex" }}>
{this.props.children.map((slide, index) => {
return React.cloneElement(slide, {
key: index,
className: `${slide.props.className} glide__slide`
});
})}
</div>
</div>
{/* bottom bullets */}
<div className="bottom_bullets" data-glide-el="controls[nav]">
{this.props.children.map((slide, index) => {
return (
<button
key={index}
className="single-bullet"
data-glide-dir={"=" + index}
title=".g"
/>
);
})}
</div>
</div>
);
}
SliderGlide.defaultProps = {
options: {}
};
styles.css
.App {
font-family: sans-serif;
text-align: center;
}
.home-section {
width: 500px;
margin: auto;
display: flex;
justify-content: center;
align-items: center;
background-color: lightblue;
}
.card {
width: 50px;
height: 75px;
background-color: violet;
padding: 10px;
}
.slider {
width: 300px;
height: 200px;
overflow-x: hidden;
user-select: none;
padding: 20px;
}
.arrow-left,
.arrow-right {
background-color: #4caf50;
border: none;
color: white;
padding: 10px;
text-align: center;
text-decoration: none;
display: inline-block;
font-size: 12px;
margin: 4px 2px;
border-radius: 50%;
}
.two-controls-btns {
width: 100%;
margin: auto;
padding: 0;
display: flex;
flex-flow: row;
justify-content: space-around;
align-items: center;
}
.single-bullet {
background-color: #080f47;
border: none;
padding: 8px;
display: inline-block;
margin: 5px;
border-radius: 50%;
}
.bottom_bullets {
width: 200px;
margin: auto;
padding: 0;
display: flex;
flex-flow: row;
justify-content: center;
align-items: center;
}
.test {
border: 1px solid red;
}