У меня есть компонент с таблицей
TablePanel
, данные для которой я перебираю с помощью
map
. В одной из ячейки таблицы есть компонент с графиком
LineChartWithoutLegend
. Для графика использую библиотеку
nivo.
Данные в
wsResponseData
обновляются ежесекундно и получается так, что при переборе этих данных, ячейки таблицы перерисовываются и вместе с ними компонент с графиком, из-за чего происходит эффект мерцания.
Пробовала выносить график вне
map
, такого мерцания нет. Также на странице есть другой линейный график у которого мерцания нет.
Подскажите что можно сделать, чтобы избежать такого поведения.
export const TablePanel = () => {
const wsResponseData = useContext(WsDataContext)
const httpResponseData = useContext(HttpDataContext)
return (
<Table>
<thead>
//...
</thead>
<tbody>
{ httpResponseData.map(httpData => (
wsResponseData[httpData.Names[0]].slice(-1).map((data) => (
<tr key={data.keyId}>
//...
<td>{data.cpu_stats.online_cpus ?
<div style={{height: "46px", width: "140px"}}>
<LineChartWithoutLegend containerName={data.name}/>
</div> :
"null"}
</td>
</tr>
))
))}
</tbody>
</Table>
)
}
export const LineChartWithoutLegend = ({ containerName }: { containerName: string }) => {
const wsResponseData = useContext(WsDataContext)
const chartDataRef = useRef<CoordsType[]>(initialLineChartData)
useEffect(() => {
const currentTime = getCurrentTime()
const lastElemTime = chartDataRef.current[chartDataRef.current.length - 1]?.x
if (currentTime === lastElemTime) return
wsResponseData[containerName]?.slice(-1).map(wsData => {
chartDataRef.current.push({x: currentTime, y: cpuUsage(wsData)})
})
if (chartDataRef.current.length > 30) {
chartDataRef.current = chartDataRef.current?.slice(-30);
}
}, [containerName, wsResponseData]);
return (
<ResponsiveLineCanvas
data={[
{
id: "CPU usage monitoring",
data: chartDataRef.current,
},
]}
// другие настройки для графика
/>
)
}