import { useCallback, useEffect, useRef, useState } from 'react'; import { motion } from 'framer-motion'; function Ruler(props) { const ruler = useRef(null); const [left, setLeft] = useState(props.left || '100px'); const [top, setTop] = useState(props.top || '100px'); const [dragging, setDragging] = useState(false); const isVertical = props.type == 'vertical'; const handleUp = useCallback(() => { setDragging(false); }, []); const handleMove = useCallback( (e) => { if (!dragging) return; const v = isVertical ? e.clientX : e.clientY; isVertical ? setLeft(v + 'px') : setTop(v + 'px'); }, [dragging], ); useEffect(() => { document.addEventListener('mouseup', handleUp); document.addEventListener('mousemove', handleMove); return () => { document.removeEventListener('mouseup', handleUp); document.removeEventListener('mousemove', handleMove); }; }, [dragging]); function handleMouseDown() { setDragging(true); } return (
{isVertical ? `left: ${left}` : `top: ${top}`}
); } function RulerContainer(props) { const [rulers, setRulers] = useState([]); // 监听事件 useEffect(() => { let fn = (e) => { if (e.shiftKey && e.key === 'R') { setRulers((rulers) => [ ...rulers, { width: '1px', height: '100vh', background: '#ccc', type: 'vertical', }, ]); } if (e.shiftKey && e.key === 'H') { setRulers((rulers) => [ ...rulers, { width: '100vw', height: '1px', background: '#ccc' }, ]); } if (e.shiftKey && e.key === 'Q') { setRulers((rulers) => []); } }; document.addEventListener('keydown', fn); }, []); return (
{rulers.map((ruler) => ( ))}
); } export default RulerContainer;