如何使用 React 和 Konva 监听 Canvas 图形上的事件?
使用 react-konva,可以将 Konva 支持的任何事件绑定到 Canvas 节点。
为此,可以使用 onEventName 模式。例如,使用 onMouseDown 处理 mousedown,使用 onDragEnd 处理 dragend。
有关完整的事件列表,请参阅 on() 方法文档。
本示例使用 dragstart 和 dragend 事件创建交互式星空:
import React from 'react'; import { Stage, Layer, Star, Text } from 'react-konva'; function generateShapes() { return [...Array(10)].map((_, i) => ({ id: i.toString(), x: Math.random() * window.innerWidth, y: Math.random() * window.innerHeight, rotation: Math.random() * 180, isDragging: false, })); } const App = () => { const [stars, setStars] = React.useState(generateShapes()); const handleDragStart = (e) => { const id = e.target.id(); setStars( stars.map((star) => { return { ...star, isDragging: star.id === id, }; }) ); }; const handleDragEnd = (e) => { setStars( stars.map((star) => { return { ...star, isDragging: false, }; }) ); }; return ( <Stage width={window.innerWidth} height={window.innerHeight}> <Layer> <Text text="Try to drag a star" /> {stars.map((star) => ( <Star key={star.id} id={star.id} x={star.x} y={star.y} numPoints={5} innerRadius={20} outerRadius={40} fill="#89b717" opacity={0.8} draggable rotation={star.rotation} shadowColor="black" shadowBlur={10} shadowOpacity={0.6} shadowOffsetX={star.isDragging ? 10 : 5} shadowOffsetY={star.isDragging ? 10 : 5} scaleX={star.isDragging ? 1.2 : 1} scaleY={star.isDragging ? 1.2 : 1} onDragStart={handleDragStart} onDragEnd={handleDragEnd} /> ))} </Layer> </Stage> ); }; export default App;