无法在 rechart 的自定义工具提示中呈现数据
Trouble rendering data in custom tooltip in rechart
我正在尝试在鼠标悬停在容器顶部时呈现容器的工具提示。
很多灵感来自于此post:
所以我设置我的代码如下:
let [barGraphData, setBarGraphData] = useState({})
let tooltip;
const CustomTooltip = ({ active, payload }) => {
if (!active || !tooltip) return null
for (const bar of payload)
if (bar.dataKey === tooltip)
return <div>{ `Team: ${bar.name}` }<br/>{ `Members: ${bar.value.toFixed(0)}`}</div>
return null
}
我的条形图是这样的:
<ResponsiveContainer width={'100%'} height={'100%'}>
<BarChart width={600} height={300} data={data} margin={{top: 60, right: 20, bottom: 5, left: 0}}>
<XAxis dataKey={'Date_Posted'}
tickFormatter={monthTickFormatter}/>
<XAxis
dataKey={'Date_Posted'}
axisLine={false}
tickLine={false}
interval={0}
tick={renderQuarterTick}
height={1}
scale="band"
xAxisId="quarter"
/>
{teams.map((team) => (
// eslint-disable-next-line react/jsx-key
<Bar dataKey={team} fill={'#38bdf8'}
onMouseOver={(data) =>{
setBarGraphData(data);
tooltip = team;
}}
/>
))}
<CartesianGrid stroke="#ccc" />
<YAxis />
<Tooltip content={CustomTooltip}
cursor={false}
wrapperStyle={
{
border: "2px solid #fda4af",
borderRadius: "5px",
backgroundColor: "white",
boxShadow: "0px 0px 5px #e5e7eb",
paddingLeft: 10,
paddingRight: 10,
}}
// position={{x: 0, y:0}}
position={{ x: barGraphData.x, y: barGraphData.y - 40 }}
/>
</BarChart>
</ResponsiveContainer>
现在我 运行 遇到的问题是我相信这里的代码块:
{teams.map((team) => (
// eslint-disable-next-line react/jsx-key
<Bar dataKey={team} fill={'#38bdf8'}
onMouseOver={(data) =>{
setBarGraphData(data);
tooltip = team;
}}
/>
通过将此处的状态设置为 Bar 的数据,它会停止呈现我的工具提示。所以,当我传入该代码块时,我得到的是:
example of the issue
但是当我传入以下代码时,我得到了呈现的工具提示,但是因为我没有传入数据对象,所以工具提示不会呈现在每个单独的栏上方。
{teams.map((team) => (
// eslint-disable-next-line react/jsx-key
<Bar dataKey={team} fill={'#38bdf8'}
onMouseOver={() =>{
tooltip = team;
}}
/>
image of the tooltip rendered but unable to follow the mouseOver event
我在这里做错了什么?因为对我来说,状态似乎是搞乱工具提示渲染的东西。
“让工具提示”行在每个渲染中将工具提示设置为未定义。将工具提示设置为状态,应该这样做。
我正在尝试在鼠标悬停在容器顶部时呈现容器的工具提示。
很多灵感来自于此post:
所以我设置我的代码如下:
let [barGraphData, setBarGraphData] = useState({})
let tooltip;
const CustomTooltip = ({ active, payload }) => {
if (!active || !tooltip) return null
for (const bar of payload)
if (bar.dataKey === tooltip)
return <div>{ `Team: ${bar.name}` }<br/>{ `Members: ${bar.value.toFixed(0)}`}</div>
return null
}
我的条形图是这样的:
<ResponsiveContainer width={'100%'} height={'100%'}>
<BarChart width={600} height={300} data={data} margin={{top: 60, right: 20, bottom: 5, left: 0}}>
<XAxis dataKey={'Date_Posted'}
tickFormatter={monthTickFormatter}/>
<XAxis
dataKey={'Date_Posted'}
axisLine={false}
tickLine={false}
interval={0}
tick={renderQuarterTick}
height={1}
scale="band"
xAxisId="quarter"
/>
{teams.map((team) => (
// eslint-disable-next-line react/jsx-key
<Bar dataKey={team} fill={'#38bdf8'}
onMouseOver={(data) =>{
setBarGraphData(data);
tooltip = team;
}}
/>
))}
<CartesianGrid stroke="#ccc" />
<YAxis />
<Tooltip content={CustomTooltip}
cursor={false}
wrapperStyle={
{
border: "2px solid #fda4af",
borderRadius: "5px",
backgroundColor: "white",
boxShadow: "0px 0px 5px #e5e7eb",
paddingLeft: 10,
paddingRight: 10,
}}
// position={{x: 0, y:0}}
position={{ x: barGraphData.x, y: barGraphData.y - 40 }}
/>
</BarChart>
</ResponsiveContainer>
现在我 运行 遇到的问题是我相信这里的代码块:
{teams.map((team) => (
// eslint-disable-next-line react/jsx-key
<Bar dataKey={team} fill={'#38bdf8'}
onMouseOver={(data) =>{
setBarGraphData(data);
tooltip = team;
}}
/>
通过将此处的状态设置为 Bar 的数据,它会停止呈现我的工具提示。所以,当我传入该代码块时,我得到的是: example of the issue
但是当我传入以下代码时,我得到了呈现的工具提示,但是因为我没有传入数据对象,所以工具提示不会呈现在每个单独的栏上方。
{teams.map((team) => (
// eslint-disable-next-line react/jsx-key
<Bar dataKey={team} fill={'#38bdf8'}
onMouseOver={() =>{
tooltip = team;
}}
/>
image of the tooltip rendered but unable to follow the mouseOver event
我在这里做错了什么?因为对我来说,状态似乎是搞乱工具提示渲染的东西。
“让工具提示”行在每个渲染中将工具提示设置为未定义。将工具提示设置为状态,应该这样做。