TheSnegok
@TheSnegok

Почему useState работает странно?

Есть слайдер с точками и стрелками, код:
<div className={s.slider}>
            <div className={s.slides} ref={slideRef}>
                {slides.map((item, index: number) => (
                    <Slide key={index} />
                ))}
            </div>
            <div className={s.slidesDots}>
                {dots.map((item: number, index: number) => <div key={index} className={dot === index ? s.DotActive : s.Dot}  onClick={() => changeSlide("dot", item, index)} />)}
            </div>
            <div className={s.arrowLeft} onClick={() => changeSlide("minus")}>
            </div>
            <div className={s.arrowRight} onClick={() => changeSlide("plus")}>
            </div>
        </div>

и функция которая вызывается при нажатиях:
let position: number = 0;
    const slideRef = useRef<HTMLHeadingElement | null>(null);
    const [dot, setDot] = useState<number>(0);

    const changeSlide = (option: string, item?: number, index?: number) => {
        if (slideRef && slideRef.current) {
            switch (option) {
                case "dot":
                    if (item !== undefined && index !== undefined) {
                        slideRef.current.style.left = `${position = item}%`;
                        setDot(index);
                    }
                    break;
                case "minus":
                    if (position === 0) {
                        slideRef.current.style.left = `${position = -400}%`;
                        // setDot(4);
                    } else {
                        slideRef.current.style.left = `${position += 100}%`;
                        // setDot(dot - 1);
                    }
                    break;
                case "plus":
                    if (position === -400) {
                        slideRef.current.style.left = `${position = 0}%`;
                        // setDot(0);
                    } else {
                        slideRef.current.style.left = `${position -= 100}%`;
                        setDot(dot + 1 );
                    }
                    break;
                default:
                    break;
            }
            console.log(position, dot);
        }
    }

useState работает странно, он точки при нажатии на стрелки переключает, а значения в нём прошлые, и ещё когда добавляю setDot в функцию то после первого нажатия на стрелку перестаёт работать пролистывание слайдов.
  • Вопрос задан
  • 75 просмотров
Решения вопроса 1
Alexandroppolus
@Alexandroppolus
кодир
Не надо менять DOM вручную. Тебе не нужен slideRef и вся та содомия, в которой он участвует.
Сделай position как state, меняй благочестиво, а style.left указывай в зависимости от него:
<div className={s.slides} style={{left: position + '%'}}>
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы