Skip to content

Commit c80d596

Browse files
committed
feat: adaptive情况下的多行布局
1 parent 4872adb commit c80d596

File tree

3 files changed

+57
-1
lines changed

3 files changed

+57
-1
lines changed

packages/f2/src/components/legend/withLegend.tsx

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,14 @@ export default (View) => {
139139
};
140140
}
141141

142+
getItemBoxes(node) {
143+
return (node.children || []).map((child) => {
144+
const { layout } = child;
145+
const { width, height } = layout;
146+
147+
return { width, height };
148+
});
149+
}
142150
// 计算 legend 的位置
143151
_init() {
144152
const { props, context } = this;
@@ -160,7 +168,17 @@ export default (View) => {
160168

161169
let lineCount, itemWidth;
162170
if (layoutMode === 'adaptive') {
163-
lineCount = 1; // adaptive模式先不考虑多行情况
171+
const labelBBoxes = this.getItemBoxes(node);
172+
let pos = 0;
173+
lineCount = 1;
174+
for (const { width: itemWidth } of labelBBoxes) {
175+
if (pos + itemWidth > width) {
176+
pos = itemWidth;
177+
lineCount++;
178+
} else {
179+
pos += itemWidth;
180+
}
181+
}
164182
itemWidth = undefined;
165183
} else {
166184
// uniform模式
@@ -171,6 +189,7 @@ export default (View) => {
171189
}
172190

173191
const autoHeight = itemMaxHeight * lineCount;
192+
174193
const style: GroupStyleProps = {
175194
left,
176195
top,
9.79 KB
Loading

packages/f2/test/components/legend/legendAdaptive.test.tsx

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -263,4 +263,41 @@ describe('adaptive', () => {
263263
await delay(1000);
264264
expect(context).toMatchImageSnapshot();
265265
});
266+
267+
it('多行自适应布局', async () => {
268+
const multiLineData = [
269+
{ genre: '债券基金', sold: 275, a: '1' },
270+
{ genre: '申万宏源固守+基金指数', sold: 115, a: '1' },
271+
{ genre: '基金指数', sold: 120, a: '1' },
272+
{ genre: '股票基金', sold: 300, a: '1' },
273+
{ genre: '混合基金', sold: 180, a: '1' },
274+
{ genre: '货币基金', sold: 90, a: '1' },
275+
{ genre: 'QDII基金', sold: 60, a: '1' },
276+
];
277+
278+
const context = createContext('多行自适应布局', {
279+
height: '150px',
280+
width: '300px',
281+
});
282+
283+
const { props } = (
284+
<Canvas context={context} pixelRatio={1}>
285+
<Chart data={multiLineData}>
286+
<Legend
287+
layoutMode="adaptive"
288+
itemStyle={{
289+
stroke: 'red',
290+
}}
291+
/>
292+
<Interval x="genre" y="sold" adjust="stack" color="genre" />
293+
</Chart>
294+
</Canvas>
295+
);
296+
297+
const canvas = new Canvas(props);
298+
await canvas.render();
299+
300+
await delay(1000);
301+
expect(context).toMatchImageSnapshot();
302+
});
266303
});

0 commit comments

Comments
 (0)