onClick 不适用于 ReactJs 的 svg 或 svg 路径
onClick isn't working with svg or svg path with ReactJs
我到处都在寻找答案。我有一个基本的 svg 元素,里面有一个路径元素。我无能为力,无法触发 onClick 函数。如果将 handleClick 传递给 div,它将触发,但我需要能够在特定路径上触发 onClick 事件。
const handleClick = () => {
alert('clicked')
}
return (
<div className="bg-blue-400">
<svg viewBox={`0 0 ${props.size[0]} ${props.size[1]}`} onClick={() => handleClick()}>
<g>
<path
d={outline}
stroke="black"
fill="aliceblue"
strokeWidth={0.5}
strokeDasharray="10,10"
onClick={() => alert('path was clicked')}
/>
</g>
</svg>
</div>
)
非常感谢任何帮助!
我充实了您的代码并根据在线示例定义了 outline
,它工作正常。
当我点击这个绘制的心形时,会显示 'path was clicked' 警报,当我点击确定关闭它时,'clicked' 警报似乎已经在它后面,所以我猜这是先触发的?
import React from 'react';
const Comp = (props) => {
const handleClick = () => {
alert('clicked')
}
const outline = `M 10,30
A 20,20 0,0,1 50,30
A 20,20 0,0,1 90,30
Q 90,60 50,90
Q 10,60 10,30 z`;
return (
<div className="bg-blue-400">
<svg viewBox={`0 0 ${props.size[0]} ${props.size[1]}`} onClick={() => handleClick()}>
<g>
<path
d={outline}
stroke="black"
fill="aliceblue"
strokeWidth={0.5}
strokeDasharray="10,10"
onClick={() => alert('path was clicked')}
/>
</g>
</svg>
</div>
)}
export const App = () => {
return(<div>
<Comp size={[400, 400]}/>
</div>)
}
export default App;
用
定义了一个css文件
.bg-blue-400 {
background-color: blue;
}
我唯一能想到的是导致您的问题的原因可能是 outline
是如何定义的,或者尺寸道具?
到目前为止,我所做的一切似乎都没有奏效。然后我尝试使用不同的方法,我使用 d3 和 useRef 来显示 svg 并添加指针事件,到目前为止似乎已经奏效了。
const svgRef = useRef(null)
const [height, width] = props.size;
useEffect(() => {
//accesses the reference element
const svg = d3.select(svgRef.current)
//declares the geoJson, projection, and path(pathGenerator)
const geoJson = props.GeoJson
const projection = props.projectionType()
.fitSize(props.size, geoGraticule10())
.translate(props.translate)
const path = d3.geoPath().projection(projection)
//uses d3 to inject the data into the svg element
const features = svg.selectAll(".country")
.data(geoJson ? geoJson.features : [])
.enter().append("path")
//basic styling attributes
.attr("d", path)
.attr("fill", "none")
.attr("stroke", "aliceblue")
.attr("stroke-width", "0.5px")
//allows pointer events anywhere inside the path even when fill=none
.attr("pointer-events", "visibleFill")
.attr("visibility", "visible")
//sets the path element id to the continent name
.attr("id", (d) => {
return `${d.properties.continent}`
})
//selects the current continent and highlights it by increasing the stroke width
.on("mouseover", (d,i) => {
svg.select(`#${i.properties.continent}`).attr("stroke-width", "2px")
})
//deselects
.on("mouseleave", (d,i) => {
svg.select(`#${i.properties.continent}`).attr("stroke-width", "0.5px")
})
//adds the .country attribute to allow for later updates on the svg element
.attr("class", "country")
}, [geoJson]);
return (
<div className="bg-blue-400">
<svg ref={svgRef} viewBox={`0 0 ${props.size[0]} ${props.size[1]}`} />
</div>
)
}
export default TestMap
这正在使用不同的 json 文件,但与原始路径相同
我到处都在寻找答案。我有一个基本的 svg 元素,里面有一个路径元素。我无能为力,无法触发 onClick 函数。如果将 handleClick 传递给 div,它将触发,但我需要能够在特定路径上触发 onClick 事件。
const handleClick = () => {
alert('clicked')
}
return (
<div className="bg-blue-400">
<svg viewBox={`0 0 ${props.size[0]} ${props.size[1]}`} onClick={() => handleClick()}>
<g>
<path
d={outline}
stroke="black"
fill="aliceblue"
strokeWidth={0.5}
strokeDasharray="10,10"
onClick={() => alert('path was clicked')}
/>
</g>
</svg>
</div>
)
非常感谢任何帮助!
我充实了您的代码并根据在线示例定义了 outline
,它工作正常。
当我点击这个绘制的心形时,会显示 'path was clicked' 警报,当我点击确定关闭它时,'clicked' 警报似乎已经在它后面,所以我猜这是先触发的?
import React from 'react';
const Comp = (props) => {
const handleClick = () => {
alert('clicked')
}
const outline = `M 10,30
A 20,20 0,0,1 50,30
A 20,20 0,0,1 90,30
Q 90,60 50,90
Q 10,60 10,30 z`;
return (
<div className="bg-blue-400">
<svg viewBox={`0 0 ${props.size[0]} ${props.size[1]}`} onClick={() => handleClick()}>
<g>
<path
d={outline}
stroke="black"
fill="aliceblue"
strokeWidth={0.5}
strokeDasharray="10,10"
onClick={() => alert('path was clicked')}
/>
</g>
</svg>
</div>
)}
export const App = () => {
return(<div>
<Comp size={[400, 400]}/>
</div>)
}
export default App;
用
定义了一个css文件.bg-blue-400 {
background-color: blue;
}
我唯一能想到的是导致您的问题的原因可能是 outline
是如何定义的,或者尺寸道具?
到目前为止,我所做的一切似乎都没有奏效。然后我尝试使用不同的方法,我使用 d3 和 useRef 来显示 svg 并添加指针事件,到目前为止似乎已经奏效了。
const svgRef = useRef(null)
const [height, width] = props.size;
useEffect(() => {
//accesses the reference element
const svg = d3.select(svgRef.current)
//declares the geoJson, projection, and path(pathGenerator)
const geoJson = props.GeoJson
const projection = props.projectionType()
.fitSize(props.size, geoGraticule10())
.translate(props.translate)
const path = d3.geoPath().projection(projection)
//uses d3 to inject the data into the svg element
const features = svg.selectAll(".country")
.data(geoJson ? geoJson.features : [])
.enter().append("path")
//basic styling attributes
.attr("d", path)
.attr("fill", "none")
.attr("stroke", "aliceblue")
.attr("stroke-width", "0.5px")
//allows pointer events anywhere inside the path even when fill=none
.attr("pointer-events", "visibleFill")
.attr("visibility", "visible")
//sets the path element id to the continent name
.attr("id", (d) => {
return `${d.properties.continent}`
})
//selects the current continent and highlights it by increasing the stroke width
.on("mouseover", (d,i) => {
svg.select(`#${i.properties.continent}`).attr("stroke-width", "2px")
})
//deselects
.on("mouseleave", (d,i) => {
svg.select(`#${i.properties.continent}`).attr("stroke-width", "0.5px")
})
//adds the .country attribute to allow for later updates on the svg element
.attr("class", "country")
}, [geoJson]);
return (
<div className="bg-blue-400">
<svg ref={svgRef} viewBox={`0 0 ${props.size[0]} ${props.size[1]}`} />
</div>
)
}
export default TestMap
这正在使用不同的 json 文件,但与原始路径相同