如何使用 React 和 Konva 在画布形状上监听事件?
通过 react-konva
,您可以将 Konva
支持的任何事件附加到画布节点上。
为此,您可以使用 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="试着拖动一个星星" /> {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;