Skip to content

Commit b0fb5ee

Browse files
[charts] Memoize axes and series with default (#17156)
1 parent 558fe1b commit b0fb5ee

File tree

4 files changed

+64
-30
lines changed

4 files changed

+64
-30
lines changed

packages/x-charts-pro/src/Heatmap/Heatmap.tsx

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -142,7 +142,7 @@ const Heatmap = React.forwardRef(function Heatmap(
142142
const id = useId();
143143
const clipPathId = `${id}-clip-path`;
144144

145-
const defaultizedXAxis = React.useMemo(
145+
const xAxisWithDefault = React.useMemo(
146146
() =>
147147
(xAxis && xAxis.length > 0 ? xAxis : [{ id: DEFAULT_X_AXIS_KEY }]).map((axis) => ({
148148
scaleType: 'band' as const,
@@ -153,7 +153,7 @@ const Heatmap = React.forwardRef(function Heatmap(
153153
[series, xAxis],
154154
);
155155

156-
const defaultizedYAxis = React.useMemo(
156+
const yAxisWithDefault = React.useMemo(
157157
() =>
158158
(yAxis && yAxis.length > 0 ? yAxis : [{ id: DEFAULT_Y_AXIS_KEY }]).map((axis) => ({
159159
scaleType: 'band' as const,
@@ -164,7 +164,7 @@ const Heatmap = React.forwardRef(function Heatmap(
164164
[series, yAxis],
165165
);
166166

167-
const defaultizedZAxis = React.useMemo(
167+
const zAxisWithDefault = React.useMemo(
168168
() =>
169169
zAxis ?? [
170170
{
@@ -192,9 +192,9 @@ const Heatmap = React.forwardRef(function Heatmap(
192192
width={width}
193193
height={height}
194194
margin={margin}
195-
xAxis={defaultizedXAxis}
196-
yAxis={defaultizedYAxis}
197-
zAxis={defaultizedZAxis}
195+
xAxis={xAxisWithDefault}
196+
yAxis={yAxisWithDefault}
197+
zAxis={zAxisWithDefault}
198198
colors={colors}
199199
dataset={dataset}
200200
sx={sx}

packages/x-charts/src/BarChart/useBarChartProps.ts

Lines changed: 41 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
'use client';
2+
import * as React from 'react';
23
import useId from '@mui/utils/useId';
34
import type { BarChartProps } from './BarChart';
45
import { DEFAULT_X_AXIS_KEY, DEFAULT_Y_AXIS_KEY } from '../constants';
@@ -11,6 +12,7 @@ import { ChartsAxisProps } from '../ChartsAxis';
1112
import { ChartsAxisHighlightProps } from '../ChartsAxisHighlight';
1213
import { ChartsLegendSlotExtension } from '../ChartsLegend';
1314
import type { ChartsWrapperProps } from '../internals/components/ChartsWrapper';
15+
import type { AxisConfig, ChartsXAxisProps, ChartsYAxisProps } from '../models/axis';
1416
import { BAR_CHART_PLUGINS, BarChartPluginsSignatures } from './BarChart.plugins';
1517

1618
/**
@@ -56,32 +58,53 @@ export const useBarChartProps = (props: BarChartProps) => {
5658
layout === 'horizontal' ||
5759
(layout === undefined && series.some((item) => item.layout === 'horizontal'));
5860

59-
const defaultAxisConfig = {
60-
scaleType: 'band',
61-
data: Array.from(
62-
{ length: Math.max(...series.map((s) => (s.data ?? dataset ?? []).length)) },
63-
(_, index) => index,
64-
),
65-
} as const;
61+
const defaultBandXAxis: AxisConfig<'band', number, ChartsXAxisProps>[] = React.useMemo(
62+
() => [
63+
{
64+
id: DEFAULT_X_AXIS_KEY,
65+
scaleType: 'band',
66+
data: Array.from(
67+
{ length: Math.max(...series.map((s) => (s.data ?? dataset ?? []).length)) },
68+
(_, index) => index,
69+
),
70+
},
71+
],
72+
[dataset, series],
73+
);
6674

75+
const defaultBandYAxis: AxisConfig<'band', number, ChartsYAxisProps>[] = React.useMemo(
76+
() => [
77+
{
78+
id: DEFAULT_Y_AXIS_KEY,
79+
scaleType: 'band',
80+
data: Array.from(
81+
{ length: Math.max(...series.map((s) => (s.data ?? dataset ?? []).length)) },
82+
(_, index) => index,
83+
),
84+
},
85+
],
86+
[dataset, series],
87+
);
88+
89+
const seriesWithDefault = React.useMemo(
90+
() =>
91+
series.map((s) => ({
92+
type: 'bar' as const,
93+
...s,
94+
layout: hasHorizontalSeries ? ('horizontal' as const) : ('vertical' as const),
95+
})),
96+
[hasHorizontalSeries, series],
97+
);
6798
const chartContainerProps: ChartContainerProps<'bar', BarChartPluginsSignatures> = {
6899
...rest,
69-
series: series.map((s) => ({
70-
type: 'bar' as const,
71-
...s,
72-
layout: hasHorizontalSeries ? ('horizontal' as const) : ('vertical' as const),
73-
})),
100+
series: seriesWithDefault,
74101
width,
75102
height,
76103
margin,
77104
colors,
78105
dataset,
79-
xAxis:
80-
xAxis ??
81-
(hasHorizontalSeries ? undefined : [{ id: DEFAULT_X_AXIS_KEY, ...defaultAxisConfig }]),
82-
yAxis:
83-
yAxis ??
84-
(hasHorizontalSeries ? [{ id: DEFAULT_Y_AXIS_KEY, ...defaultAxisConfig }] : undefined),
106+
xAxis: xAxis ?? (hasHorizontalSeries ? undefined : defaultBandXAxis),
107+
yAxis: yAxis ?? (hasHorizontalSeries ? defaultBandYAxis : undefined),
85108
highlightedItem,
86109
onHighlightChange,
87110
disableAxisListener:

packages/x-charts/src/LineChart/useLineChartProps.ts

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
'use client';
2+
import * as React from 'react';
23
import useId from '@mui/utils/useId';
34
import { ChartsAxisProps } from '../ChartsAxis';
45
import { ChartsAxisHighlightProps } from '../ChartsAxisHighlight';
@@ -55,13 +56,18 @@ export const useLineChartProps = (props: LineChartProps) => {
5556
const id = useId();
5657
const clipPathId = `${id}-clip-path`;
5758

59+
const seriesWithDefault = React.useMemo(
60+
() =>
61+
series.map((s) => ({
62+
disableHighlight: !!disableLineItemHighlight,
63+
type: 'line' as const,
64+
...s,
65+
})),
66+
[disableLineItemHighlight, series],
67+
);
5868
const chartContainerProps: ChartContainerProps<'line', LineChartPluginsSignatures> = {
5969
...other,
60-
series: series.map((s) => ({
61-
disableHighlight: !!disableLineItemHighlight,
62-
type: 'line' as const,
63-
...s,
64-
})),
70+
series: seriesWithDefault,
6571
width,
6672
height,
6773
margin,

packages/x-charts/src/ScatterChart/useScatterChartProps.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
'use client';
2+
import * as React from 'react';
23
import { ChartsAxisProps } from '../ChartsAxis';
34
import { ChartsAxisHighlightProps } from '../ChartsAxisHighlight';
45
import { ChartsGridProps } from '../ChartsGrid';
@@ -45,9 +46,13 @@ export const useScatterChartProps = (props: ScatterChartProps) => {
4546
...other
4647
} = props;
4748

49+
const seriesWithDefault = React.useMemo(
50+
() => series.map((s) => ({ type: 'scatter' as const, ...s })),
51+
[series],
52+
);
4853
const chartContainerProps: ChartContainerProps<'scatter', ScatterChartPluginsSignatures> = {
4954
...other,
50-
series: series.map((s) => ({ type: 'scatter' as const, ...s })),
55+
series: seriesWithDefault,
5156
width,
5257
height,
5358
margin,

0 commit comments

Comments
 (0)