Переход не работает в react.js для бесконечного слайдера

#javascript #reactjs #css-transitions #use-effect #use-state

Вопрос:

Я пытаюсь создать бесконечный слайдер с динамическим контентом. Я все исправил, но у меня есть одна проблема с переходом. Я думаю, что проблема связана с повторным отображением страницы, на которой было потеряно предыдущее местоположение. Я не знаю, как это исправить. У вас есть какие-нибудь предложения?

Прежде чем я сделал функцию перехода вне эффекта использования и вызвал ее в кнопке next/prev. Я заметил, что когда я нажимал, он всегда отставал на 1 клик, поэтому я ввел код в эффект использования.

Код

 export default function Slider({}) { const dataArray = [  { text: '1' },  { text: '2' },  { text: '3' },  { text: '4' },  { text: '5' },  { text: '6' }, ];  const [transitionArray, setTransitionArray] = useState([]);  //gives all the data a number and puts it in the array const [orderArray, setOrderArray] = useState(() =gt; {  const initialState = [];  dataArray.forEach((x, index) =gt; {  initialState.push(index);  });  return initialState; });  const [positionArray, setPositionArray] = useState(() =gt; {  const initialState = [];  orderArray.forEach((x) =gt; {  x === dataArray.length - 1  ? (x = 1)  : x === dataArray.length - 2  ? (x = 0)  : (x = x   2);  initialState.push(x);  });  return initialState; });  const arrayLenght = dataArray.length;  useLayoutEffect(() =gt; {  console.log('orderArray '   orderArray);  console.log('positionArray '   positionArray);  console.log('transitionArray '   transitionArray); }, [orderArray, positionArray, transitionArray]);  useEffect(() =gt; {  const newPositionArray = [];  orderArray.forEach((x) =gt; {  x === arrayLenght - 1  ? (x = 1)  : x === arrayLenght - 2  ? (x = 0)  : (x = x   2);  newPositionArray.push(x);  });  setPositionArray(newPositionArray); }, [orderArray, arrayLenght]);  useEffect(() =gt; {  const newTransitionArray = [];  positionArray.forEach((x) =gt; {  x === 0 || x === arrayLenght - 1  ? (x = 'unset')  : (x = 'left 0.5s ease-in-out 0.5s');  newTransitionArray.push(x);  });  setTransitionArray(newTransitionArray); }, [positionArray, arrayLenght]);  const prev = () =gt; {  const newArray = orderArray.map((x) =gt;  x === dataArray.length - 1 ? (x = 0) : x   1  );  setOrderArray(newArray); };  const next = () =gt; {  const newArray = orderArray.map((x) =gt;  x === 0 ? (x = dataArray.length - 1) : x - 1  );   setOrderArray(newArray); };  let number = 120;  return (  lt;div className={styles.slider_section}gt;  lt;div className={styles.slider_container}gt;  lt;div className={styles.infinite_slider_nav}gt;  lt;FiArrowLeftCircle  size={45}  strokeWidth={0.6}  onClick={prev}  /gt;  lt;h3gt;Gallerylt;/h3gt;  lt;FiArrowRightCircle  size={45}  strokeWidth={0.6}  onClick={next}  /gt;  lt;/divgt;  lt;div  className={styles.slider_wrapper}  style={{  transform: `translateX(-${number}vw)`,  }}  gt;  {dataArray.map((data, index) =gt; {  return (  lt;div  key={Math.floor(Math.random() * 1000)   1}  className={styles.slider_item}  style={{  left: ` ${positionArray[index] * 70}vw`,  transition: `${transitionArray[index]}`,  }}  gt;  lt;h1gt;{data.text}lt;/h1gt;  lt;/divgt;  );  })}  lt;/divgt;  lt;/divgt;  lt;/divgt; );  

css

 .infinite_slider_wrapper {  position: relative;  display: flex;  justify-content: center;  width: 100vw;  height: 35vw;  gap: 5vw;  .infinite_slider_item {  position: absolute;  min-width: 60vw;  height: 30vw;  padding-top: 30vw;  display: flex;  justify-content: center;  align-items: center;  transition: left 0.5s;  } }