reactjs - onMouseMove + useState 在自定义轮播上滞后
问题描述
我是新手,我在使用 onMouseMove 事件渲染 useState 时遇到了一些问题。
我正在构建一个自定义轮播作为培训,并且我有以下代码:
import { ReactNode, useState } from "react";
interface CarouselProps {
children: ReactNode;
}
const Carousel = ({
children,
}: CarouselProps): JSX.Element => {
const [isMouseLocked, setIsMouseLocked] = useState(false);
const [position, setPosition] = useState(0);
const [initialPosition, setInicialPosition] = useState(0);
const [lastPosition, setLastPosition] = useState(0);
function handleMouseDown(event: React.MouseEvent): void {
event.preventDefault();
setIsMouseLocked(true);
setInicialPosition(event.clientX);
}
function handleMouseMove(event: React.MouseEvent): void {
if (isMouseLocked) {
const travelDistance = event.clientX - initialPosition;
setPosition(travelDistance + lastPosition);
}
}
function handleMouseUp(event: React.MouseEvent): void {
event.preventDefault();
setLastPosition(position);
setIsMouseLocked(false);
}
return (
<div
className="carousel"
onMouseDown={handleMouseDown}
onMouseMove={handleMouseMove}
onMouseUp={handleMouseUp}
>
<div
style={{ transform: `translateX(${position * 2}px)` }}
>
{children}
</div>
</div>
);
};
export default Carousel;
交互工作正常,我遇到的问题是因为我使用 useState 和 onMouseMove 来跟踪样式 translateX 上使用的位置,组件渲染很多并导致延迟。我尝试使用 let 而不是 state,但是组件根本不动。有没有办法避免大量渲染或至少消除这种情况下的滞后,并且仍然进行 translateX 更新以便轮播移动?
解决方案
推荐阅读
- vue.js - 如何在 Vuex (Vuetify) 中导入自定义 svg 图标
- python - pandas - 合并日期列不起作用
- java - 为什么我们不能在 Java 8 中通过调用特定类的方法名来使用多重继承?
- r - 我正在尝试绘制一行分位数,但它没有出现
- python - python中是否有相当于matlab的movsum函数?
- c++ - 为什么重载决议无法决定哪个版本的重载函数来初始化 std::function 对象?
- r - 用 r 在一条线上找一个点
- python-3.x - python escpos 网络打印机不支持magicencode
- php - Laravel 6 数据库查询中的结果列名
- javascript - 带有或不带有 onMount 的 SvelteJS 组件