d3 (새로운 v4)과 함께 반응하지만 d3 확대/축소 동작이 반응 이벤트 처리 방식과 충돌하는 것 같습니다.React & d3 combination으로 mousedown 이벤트 방지
<rect>
svg 요소에 mousedown 이벤트 리스너를 연결하려고합니다. 어떤 이유로 리액션을 통해 리스너를 부착 할 때 반응을 통해 연결된 리스너보다 먼저 d3 리스너가 트리거됩니다. d3은 전파가 더 이상 중단되기 때문에 리스너가 호출되지 않습니다.
그러나 순수한 자바 스크립트를 통해 리스너를 직접 연결하거나 확대/축소 동작을 비활성화하면 작동합니다.
class Rectangle extends React.Component {
componentDidMount() {
// get main d3 selector
this.canvas = d3.select('#react-root svg');
// init the pan & zoom behaviour
this.zoom = d3.zoom()
.on('start',() => {
console.log('zoom started!');
})
.on('zoom',() => {
console.log('zooming!');
});
this.canvas.call(this.zoom);
document.addEventListener('mousedown',() => {
console.log("window mousedown!");
});
document.querySelector('#react-root svg rect').addEventListener('mousedown',() => {
console.log('rect mousedown! (via pure js)');
});
}
render() {
return (
<svg onMouseDown={() => console.log('svg mousedown! (via react)')}>
<rect
rx="10" ry="10"
width="100" height="100"
onMouseDown={() => console.log('rect mousedown! (via react)')}
onTouchStart={() => console.log('touch down!')}
/>
</svg>
);
}
}
ReactDOM.render(<Rectangle />, document.getElementById('react-root'));
어떤 제안? 감사!
제안 해 주셔서 감사합니다.하지만 가능한 경우 이벤트 리스너를 바인딩하는 반응 방식을 계속 사용하고 싶습니다. – kulturfunker