如何在渲染地图中查找与元素关联的数据
How to find the data associated with elements in a rendered map
我有一张地图,我正在尝试使其具有交互性,因此当用户单击特定地区时,它会显示有关该地区的一些数据(x/y/z 类别中人口的百分比,人口尺寸等)。数据集包括所有这些数据以及地理数据。但是,地图渲染后,我在事件对象中找不到分区的数据。以下是地图的结构(在 React 组件中):
function Map({ data, selectedDistricts }) {
.
.
.
const districtPathGenerator = d3.geoPath(projection)
function handleClick(e) {
console.log(e) // <-- how to display the data associated with the clicked-on district?
}
return (
<div ref={ref}>
<svg width="500px" height="450px">
<g>
{data.map((district) => {
return (
<path
d={districtPathGenerator(district)}
onClick={(e) => handleClick(e)}
>
</path>
)
})}
</g>
</svg>
</div>
)
}
试一试
function Map({ data, selectedDistricts }) {
.
.
.
const districtPathGenerator = d3.geoPath(projection)
function handleClick(e, district) {
console.log(e, district) // <-- how to display the data associated with the clicked-on district?
}
return (
<div ref={ref}>
<svg width="500px" height="450px">
<g>
{data.map((district) => {
return (
<path
d={districtPathGenerator(district)}
onClick={(e) => handleClick(e, district)}
>
</path>
)
})}
</g>
</svg>
</div>
)
}
您还可以在 g
标记本身上设置一个事件侦听器,并使用 event.target
访问被单击的 path
的具体信息。这称为 event delegation 并产生出色的性能。
const g = document.querySelector('svg g')
g.addEventListener("click", event => {
console.log(event.target.getAttribute("key"))
})
const data = {
a: "M50 0 L10 10",
b: "M100 10 L20 20",
c: "M200 20 L30 30",
}
g.innerHTML = Object.keys(data).map(key => `
<path
key="${key}"
stroke="black"
stroke-width="5"
d="${data[key]}"
>
</path>
`).join("")
<svg viewBox="0 0 200 200">
<g></g>
</svg>
我有一张地图,我正在尝试使其具有交互性,因此当用户单击特定地区时,它会显示有关该地区的一些数据(x/y/z 类别中人口的百分比,人口尺寸等)。数据集包括所有这些数据以及地理数据。但是,地图渲染后,我在事件对象中找不到分区的数据。以下是地图的结构(在 React 组件中):
function Map({ data, selectedDistricts }) {
.
.
.
const districtPathGenerator = d3.geoPath(projection)
function handleClick(e) {
console.log(e) // <-- how to display the data associated with the clicked-on district?
}
return (
<div ref={ref}>
<svg width="500px" height="450px">
<g>
{data.map((district) => {
return (
<path
d={districtPathGenerator(district)}
onClick={(e) => handleClick(e)}
>
</path>
)
})}
</g>
</svg>
</div>
)
}
试一试
function Map({ data, selectedDistricts }) {
.
.
.
const districtPathGenerator = d3.geoPath(projection)
function handleClick(e, district) {
console.log(e, district) // <-- how to display the data associated with the clicked-on district?
}
return (
<div ref={ref}>
<svg width="500px" height="450px">
<g>
{data.map((district) => {
return (
<path
d={districtPathGenerator(district)}
onClick={(e) => handleClick(e, district)}
>
</path>
)
})}
</g>
</svg>
</div>
)
}
您还可以在 g
标记本身上设置一个事件侦听器,并使用 event.target
访问被单击的 path
的具体信息。这称为 event delegation 并产生出色的性能。
const g = document.querySelector('svg g')
g.addEventListener("click", event => {
console.log(event.target.getAttribute("key"))
})
const data = {
a: "M50 0 L10 10",
b: "M100 10 L20 20",
c: "M200 20 L30 30",
}
g.innerHTML = Object.keys(data).map(key => `
<path
key="${key}"
stroke="black"
stroke-width="5"
d="${data[key]}"
>
</path>
`).join("")
<svg viewBox="0 0 200 200">
<g></g>
</svg>