Я создаю карту d3, объединив ее с React. В принципе, у меня есть mapchart
компонент, который создает карту на основе этого подхода: http://bl.ocks.org/herrstucki/9238916Как правильно реализовать d3 svg click with React?
Я хочу, чтобы моя карта масштабируемой, нажав определенную государственную/Кантон/район и т.д., как показано здесь https://bl.ocks.org/mbostock/2206590
Таким образом, в основном я для добавления обработчика событий для click
на svg, как показано на второй карте, которая вызывает функцию clicked()
.
Я попытался реализовать функцию clicked
внутри React компонента, так:
return React.DOM.svg({width: this.props.width, height: this.props.height},
React.DOM.g({
width: this.props.width,
height: this.props.height,
},
React.DOM.path({
className: 'states',
d: path(states),
onClick: this.clicked, // ** added click event here **
}),
React.DOM.path({
className: 'state-borders',
d: path(stateBorders),
})
),
);
Однако при осуществлении щелкнул функции я столкнулся с проблемой.
clicked() {
var states = select(ReactDOM.findDOMNode(this)).select('path.states');
var d = states.attr('d'); // ** not what i thought it would be **
var group = select(ReactDOM.findDOMNode(this)).select('g');
var path = geoPath();
var x, y, k;
var centered;
if (d && centered !== d) {
var centroid = path.centroid(d);
console.log(centroid)
x = centroid[0];
y = centroid[1];
k = 4;
centered = d;
} else {
x = this.props.width/2;
y = this.props.height/2;
k = 1;
centered = null;
}
group.selectAll("path")
.classed("active", centered && function(d) { return d === centered; });
group.transition()
.duration(750)
.attr("transform", "translate(" + this.props.width/2 + "," + this.props.height/2 + ")scale(" + k + ")translate(" + -x + "," + -y + ")")
.style("stroke-width", 1.5/k + "px");
}
The path.centroid(d)
не работает, так как стоимость d
не кажется, правильный формат, и я не знаю, как будет выделен щелкнул состояние. В нормальной версии d3 d
правильного состояния и формы данных, по-видимому, неявно передается функции. Как заставить компонент React выполнять то же самое?