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 [dragging, setDragging] = useState(false); const handleUp = useCallback(() => { setDragging(false); }, []); const handleMove = useCallback( (e) => { if (!dragging) return; const x = e.clientX; setLeft(x + '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 (
left: {left}
); } function RulerContainer(props) { const [rulers, setRulers] = useState([]); const rulerCfg = { width: '2px', height: '100vh', background: '#ccc', }; // 监听事件 useEffect(() => { let fn = (e) => { if (e.shiftKey && e.key === 'R') { setRulers((rulers) => [...rulers, rulerCfg]); } if (e.shiftKey && e.key === 'Q') { setRulers((rulers) => []); } }; document.addEventListener('keydown', fn); }, []); return (
{rulers.map((ruler) => ( ))}
); } export default RulerContainer;