Я использую библиотеку реагирования для считывания: https://github.com/voronianski/react-swipe Сделать это просто:
import React, {useEffect, useState} from 'react';
import ReactDOM from 'react-dom';
import ReactSwipe from 'react-swipe'
import styled from 'styled-components'
const StyledBox = styled.div`
height: 50px;
width: 100%;
background-color: orange;
`
const Carousel = () => {
let reactSwipeEl;
const [position, setPosition] = useState(0)
console.log('position', position)
const swipeOptions = {
continuous: false,
transitionEnd() {
setPosition(reactSwipeEl.getPos())
}
}
return (
<div>
<ReactSwipe
className="carousel"
swipeOptions={swipeOptions}
ref={el => (reactSwipeEl = el)}
>
<StyledBox>PANE 1</StyledBox>
<StyledBox>PANE 2</StyledBox>
<StyledBox>PANE 3</StyledBox>
</ReactSwipe>
<Circles>
<Circle isActive={0 === position} />
<Circle isActive={1 === position}/>
</Circles>
</div>
);
};
export default Carousel
Код, который я добавил, связан с useState. Библиотека работает нормально, но каждый раз, когда я провожу пальцем, я использую callback transitionEnd, чтобы обновить состояние позиции. Он обновляется, но поскольку переменная состояния изменяется, обновляется весь компонент Carousel, автоматически устанавливая значение init, равное 0.
Я не понимаю, как можно избежать этой проблемы, которая заключается в обновлении состояние без повторного рендеринга всего компонента. Должен ли я разделить его на два компонента и использовать поставщика? Я пробовал, но когда состояние провайдера меняется, оба компонента также перерисовываются