使用 Konva 按名称移除 HTML5 Canvas 事件监听器
Konva 事件命名空间用于在命令式代码中标识相关的监听器。将命名空间添加到事件类型后,
例如 click.menu。然后将相同名称传给 off(),以移除该监听器。
**操作说明:**选择圆形以运行两个监听器。分别使用两个按钮移除一个监听器。 然后再次选择圆形。
react-konva 不通过 React 事件 props 公开 Konva 事件命名空间。
React 为每种事件类型提供一个 prop,例如 onClick。在 React 中存储启用状态,
并根据条件向该 prop 传入一个分派函数。
- Vanilla
- React
import Konva from 'konva'; const stage = new Konva.Stage({ container: 'container', width: window.innerWidth, height: window.innerHeight, }); const layer = new Konva.Layer(); stage.add(layer); const circle = new Konva.Circle({ x: stage.width() / 2, y: stage.height() / 2, radius: 70, fill: 'red', stroke: 'black', strokeWidth: 4, }); // add click listeners circle.on('click.event1', function () { alert('first click listener'); }); circle.on('click.event2', function () { alert('second click listener'); }); layer.add(circle); // add buttons to remove listeners const button1 = document.createElement('button'); button1.innerHTML = 'Remove first listener'; button1.style.position = 'absolute'; button1.style.top = '0'; button1.style.left = '0'; button1.onclick = function() { circle.off('click.event1'); }; document.getElementById('container').appendChild(button1); const button2 = document.createElement('button'); button2.innerHTML = 'Remove second listener'; button2.style.position = 'absolute'; button2.style.top = '30px'; button2.style.left = '0'; button2.onclick = function() { circle.off('click.event2'); }; document.getElementById('container').appendChild(button2);
import { useState } from 'react'; import { Stage, Layer, Circle, Text } from 'react-konva'; const App = () => { const [firstEnabled, setFirstEnabled] = useState(true); const [secondEnabled, setSecondEnabled] = useState(true); const [message, setMessage] = useState('Select the circle'); const handleClick = firstEnabled || secondEnabled ? () => { const messages = []; if (firstEnabled) { messages.push('first listener'); } if (secondEnabled) { messages.push('second listener'); } setMessage(messages.join(' + ')); } : undefined; return ( <> <button onClick={() => setFirstEnabled(false)}> Remove first listener </button> <button onClick={() => setSecondEnabled(false)}> Remove second listener </button> <Stage width={window.innerWidth} height={360}> <Layer> <Text x={20} y={20} text={message} fontSize={18} /> <Circle x={window.innerWidth / 2} y={180} radius={70} fill="red" stroke="black" strokeWidth={4} onClick={handleClick} onTap={handleClick} /> </Layer> </Stage> </> ); }; export default App;