Reactjs 如何在react d3 v4条形图中添加工具提示
我必须在鼠标上方的react d3 v4条形图上添加工具提示。我尝试了下面提到的自定义功能Reactjs 如何在react d3 v4条形图中添加工具提示,reactjs,d3.js,charts,tooltip,react-component,Reactjs,D3.js,Charts,Tooltip,React Component,我必须在鼠标上方的react d3 v4条形图上添加工具提示。我尝试了下面提到的自定义功能 onMouseOverHandler(d){ var tooltip = d3Select("body").append("div") .attr("class", "tooltip") .style("opacity", 0); tooltip.transition().duration(200).style("opacity", .9
onMouseOverHandler(d){
var tooltip = d3Select("body").append("div")
.attr("class", "tooltip")
.style("opacity", 0);
tooltip.transition().duration(200).style("opacity", .9);
tooltip.html(d)
.style("left", d3Select(this).attr("cx") + "px")
.style("top", d3Select(this).attr("cy") + "px");
但它不起作用。有人能帮我做这个吗
谢谢,
Arun S我在你的评论中链接到的示例中添加了一个工具提示 我创建了一个
工具提示
组件。当然,请记住,这不一定是向使用D3的React应用程序添加工具提示的“正确”或唯一方法
我完成了以下步骤:
图表
组件中创建的状态,用于跟踪当前悬停条形图(如果有)的数据条形图
组件中创建onMouseOver
和onMouseOut
事件,以确定哪个条形图刚刚悬停或离开,并将其传递到图表
组件以设置新状态图表
组件传递回我创建的工具提示
组件工具提示
组件如下所示:
export default ({hoveredBar, scales}) => {
const { xScale, yScale } = scales
const styles = {
left: `${xScale(hoveredBar.title) - 30}px`,
top: `${yScale(hoveredBar.value)}px`
}
return (
<div className="Tooltip" style={styles}>
<table>
<thead>
<tr>
<th colSpan="2">{hoveredBar.title}</th>
</tr>
</thead>
<tbody>
<tr>
<td colSpan="1">Bodies</td>
<td colSpan="1">{hoveredBar.value}</td>
</tr>
<tr>
<td colSpan="1">Year</td>
<td colSpan="1">{hoveredBar.year}</td>
</tr>
</tbody>
</table>
</div>
)
}
我在栏
组件中设置onMouseOver
和onMouseOut
事件:
export default class Bars extends Component {
constructor(props) {
super(props)
this.colorScale = scaleLinear()
.domain([0, this.props.maxValue])
.range(['#F3E5F5', '#7B1FA2'])
.interpolate(interpolateLab)
}
render() {
const { scales, margins, data, svgDimensions } = this.props
const { xScale, yScale } = scales
const { height } = svgDimensions
const bars = (
data.map(datum =>
<rect
key={datum.title}
x={xScale(datum.title)}
y={yScale(datum.value)}
height={height - margins.bottom - scales.yScale(datum.value)}
width={xScale.bandwidth()}
fill={this.colorScale(datum.value)}
onMouseOver={() => this.props.onMouseOverCallback(datum)}
onMouseOut={() => this.props.onMouseOutCallback(null)}
/>,
)
)
return (
<g>{bars}</g>
)
}
}
导出默认类栏扩展组件{
建造师(道具){
超级(道具)
this.colorScale=scaleLinear()
.domain([0,this.props.maxValue])
.范围(['#F3E5F5','#7B1FA2'])
.interpolate(interpolateLab)
}
render(){
const{scales,margins,data,svgDimensions}=this.props
常数{xScale,yScale}=scales
常数{height}=svgDimensions
常数条=(
data.map(基准=>
this.props.onMouseColllback(基准面)}
onMouseOut={()=>this.props.onMouseOutCallback(null)}
/>,
)
)
返回(
{bar}
)
}
}
我为您在评论中链接到的示例添加了工具提示
我创建了一个工具提示
组件。当然,请记住,这不一定是向使用D3的React应用程序添加工具提示的“正确”或唯一方法
我完成了以下步骤:
图表
组件中创建的状态,用于跟踪当前悬停条形图(如果有)的数据条形图
组件中创建onMouseOver
和onMouseOut
事件,以确定哪个条形图刚刚悬停或离开,并将其传递到图表
组件以设置新状态图表
组件传递回我创建的工具提示
组件工具提示
组件如下所示:
export default ({hoveredBar, scales}) => {
const { xScale, yScale } = scales
const styles = {
left: `${xScale(hoveredBar.title) - 30}px`,
top: `${yScale(hoveredBar.value)}px`
}
return (
<div className="Tooltip" style={styles}>
<table>
<thead>
<tr>
<th colSpan="2">{hoveredBar.title}</th>
</tr>
</thead>
<tbody>
<tr>
<td colSpan="1">Bodies</td>
<td colSpan="1">{hoveredBar.value}</td>
</tr>
<tr>
<td colSpan="1">Year</td>
<td colSpan="1">{hoveredBar.year}</td>
</tr>
</tbody>
</table>
</div>
)
}
我在栏
组件中设置onMouseOver
和onMouseOut
事件:
export default class Bars extends Component {
constructor(props) {
super(props)
this.colorScale = scaleLinear()
.domain([0, this.props.maxValue])
.range(['#F3E5F5', '#7B1FA2'])
.interpolate(interpolateLab)
}
render() {
const { scales, margins, data, svgDimensions } = this.props
const { xScale, yScale } = scales
const { height } = svgDimensions
const bars = (
data.map(datum =>
<rect
key={datum.title}
x={xScale(datum.title)}
y={yScale(datum.value)}
height={height - margins.bottom - scales.yScale(datum.value)}
width={xScale.bandwidth()}
fill={this.colorScale(datum.value)}
onMouseOver={() => this.props.onMouseOverCallback(datum)}
onMouseOut={() => this.props.onMouseOutCallback(null)}
/>,
)
)
return (
<g>{bars}</g>
)
}
}
导出默认类栏扩展组件{
建造师(道具){
超级(道具)
this.colorScale=scaleLinear()
.domain([0,this.props.maxValue])
.范围(['#F3E5F5','#7B1FA2'])
.interpolate(interpolateLab)
}
render(){
const{scales,margins,data,svgDimensions}=this.props
常数{xScale,yScale}=scales
常数{height}=svgDimensions
常数条=(
data.map(基准=>
this.props.onMouseColllback(基准面)}
onMouseOut={()=>this.props.onMouseOutCallback(null)}
/>,
)
)
返回(
{bar}
)
}
}
在这里,我描述了同一问题的解决方案
结果看起来这里我已经描述了同一问题的解决方案
结果看起来你看过tippy.js了吗?这可能会有帮助,而不是自己写出来。你能把它放在JSFIDLE或PLUNK中吗?如果我们不能重现这个问题,我们就无法帮助您解决它。嗨,Ryan,我只是想在下面提到的示例图表中添加工具提示,但我不知道如何添加它。您查看过tippy.js吗?这可能会有帮助,而不是自己写出来。你能把它放在JSFIDLE或PLUNK中吗?如果我们不能重现这个问题,我们就无法帮助您解决它。嗨,Ryan,我只是想在下面提到的示例图表中添加工具提示,但我不确定如何添加它。