钩子实现组件实时拖动,通过计算鼠标拖拽的位移,使用CSS transform实现。
import useDraggable from '../useDraggable';
const Demo = () => {
......
// 组件坐标状态值
const [position , setPosition] = useState({ x:0 , y:0 });
const [x, y, dragging, handleMouseDown] = useDraggable({
x : position.x,
y : position.y,
onStop : (x,y)=>{
// return false; 若拖动不符合要求,return false 后将复位到初始值
console.log(`拖动后的坐标为 x:${x} y:${y}`);
setPosition({ x , y }); //更新本组件中维护的状态值
},
disabled : false,
scale : 1,
});
......
return (
<div>
<Component style={{transform: `translate(${x}px,${y}px)`}} onMouseDown={handleMouseDown} />
<div>正在拖拽:{dragging?"是":"否"}</div>
</div>
);
};/**
* 参数
*/
interface IUseDraggale {
x: number;
y: number;
onStop([x, y]: [number, number]): boolean | void;
disabled?: boolean;
scale?: number;
}
const [x, y, dragging, handleMouseDown] = useDraggable(props:IUseDraggable);x: number- 初始横坐标,必填;y: number- 初始纵坐标,必填;onStop: ([x,y]:[number,number])=>boolean | void- 拖拽结束后的回调,必填,应在此回调更新传入的初始坐标状态,以实现拖动完成的效果。若返回 false,则拖动无效,复位为初始值。disabled: boolean- 是否禁用,可选,若设置为true,则无法拖动。scale: number- 外部整体画面缩放比例,可选,默认值为 1。例如整个画面被放大了 2 倍,鼠标位移同样距离,实际移动距离应为 距离/2。
x:number- 展示组件位移的纵坐标,用于 CSS 位移:transform: translate(${x}px,${y}px)。y:number- 展示组件位移的横坐标。dragging:boolean- 组件是否正在被拖拽。handleMouseDown: (e: React.MouseEvent) => void- 用于处理组件onMouseDown的方法。