Слайд React Swiper.js не изменится при обновлении состояния с помощью метода onSlideChange
Я установил swiper.js для навигации по различным вопросам с помощью ReactJS. Я пытаюсь изменить состояние {quesNumber} с помощью метода onSlideChange свайпера, который должен установить параметр URL "q" на основе номера текущего вопроса ("q-{quesNumber}"). Мне это удалось, но он застревает на первом слайде и не меняется на следующий. Я получаю эту ошибку на консоли:
Uncaught TypeError: Cannot read property 'removeClass' of undefined
at Swiper.updateSlidesClasses (swiper.esm.js:753)
at Swiper.slideTo (swiper.esm.js:1311)
at Swiper.slideNext (swiper.esm.js:1383)
at Swiper.onNextClick (navigation.js:45)
at HTMLDivElement.handleEvent (dom7.esm.js:517)
- Here is my code:
import React, { useContext } from "react";
import { useHistory } from "react-router-dom";
// Import Swiper React components
import SwiperCore, { Navigation, Pagination, A11y } from "swiper";
import { Swiper, SwiperSlide } from "swiper/react";
import { Context } from "../Context";
// Import Swiper styles
import "swiper/swiper.scss";
import "swiper/components/navigation/navigation.scss";
import "swiper/components/pagination/pagination.scss";
import "swiper/components/scrollbar/scrollbar.scss";
function Carousel() {
let { quesNumber, setQuestNumber } = useContext(Context);
let history = useHistory();
function nextQuestion() {
setQuestNumber(quesNumber + 1);
history.push(`/q-${quesNumber + 1}`);
}
SwiperCore.use([Navigation, Pagination, A11y]);
return (
<Swiper
loop={false}
slidesPerView={"auto"}
navigation
spaceBetween={0}
freeMode={true}
pagination={{ clickable: false }}
// onSwiper={() => (setQuestNumber(quesNumber ++))}
onSlideChange={() => nextQuestion()}
// onClick={() => console.log(nextQuestion())}
>
<SwiperSlide>slide 1</SwiperSlide>
<SwiperSlide>slide 2</SwiperSlide>
<SwiperSlide>slide 3</SwiperSlide>
<SwiperSlide>slide 4</SwiperSlide>
</Swiper>
);
}
export default Carousel;
2 ответа
swiper js не поддерживает изменение состояния или не имеет слушателя изменения состояния. вам нужно повторно инициализировать или повторно отобразить этот компонент :), и вы используете асинхронную функцию, затем ждете результата и показываете их
Не уверен, что это связано, но попробуйте изменить nextQuestion
функция для обработчика обратного вызова:
import React, { useContext, useCallback } from "react";
const nextQuestion = useCallback(() => {
setQuestNumber(quesNumber + 1);
history.push(`/q-${quesNumber + 1}`);
}, [setQuestNumber]);
....
onSlideChange={nextQuestion}
....