如何使用 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((currentStars) =>
currentStars.map((star) => {
return {
...star,
isDragging: star.id === id,
};
})
);
};
const handleDragEnd = (e) => {
const id = e.target.id();
const position = e.target.position();
setStars((currentStars) =>
currentStars.map((star) => {
return {
...star,
isDragging: false,
...(star.id === id ? position : {}),
};
})
);
};
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;