From 6d6b502d7fb0f17f667962d4a70ddf01746c1189 Mon Sep 17 00:00:00 2001 From: "xuying.xu" Date: Wed, 30 Apr 2025 16:40:53 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=A2=9E=E5=8A=A0=E5=B8=83=E5=B1=80?= =?UTF-8?q?=E7=BB=84=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/f2/src/components/index.ts | 2 + packages/f2/src/components/layout/index.tsx | 134 +++++++++++++++ ...3-grid\345\270\203\345\261\200-1-snap.png" | Bin 0 -> 10273 bytes ...75\242\345\270\203\345\261\200-1-snap.png" | Bin 0 -> 1921 bytes ...20\221\345\270\203\345\261\200-1-snap.png" | Bin 0 -> 1008 bytes ...70\252\345\233\276\350\241\250-1-snap.png" | Bin 0 -> 4511 bytes ...70\252\345\233\276\350\241\250-1-snap.png" | Bin 0 -> 7284 bytes .../f2/test/components/layout/index.test.tsx | 162 ++++++++++++++++++ 8 files changed, 298 insertions(+) create mode 100644 packages/f2/src/components/layout/index.tsx create mode 100644 "packages/f2/test/components/layout/__image_snapshots__/index-test-tsx-\345\270\203\345\261\200\347\273\204\344\273\266-\345\270\203\345\261\200\347\261\273\345\236\213-grid\345\270\203\345\261\200-1-snap.png" create mode 100644 "packages/f2/test/components/layout/__image_snapshots__/index-test-tsx-\345\270\203\345\261\200\347\273\204\344\273\266-\345\270\203\345\261\200\347\261\273\345\236\213-\345\234\206\345\275\242\345\270\203\345\261\200-1-snap.png" create mode 100644 "packages/f2/test/components/layout/__image_snapshots__/index-test-tsx-\345\270\203\345\261\200\347\273\204\344\273\266-\345\270\203\345\261\200\347\261\273\345\236\213-\346\250\252\345\220\221\345\270\203\345\261\200-1-snap.png" create mode 100644 "packages/f2/test/components/layout/__image_snapshots__/index-test-tsx-\345\270\203\345\261\200\347\273\204\344\273\266-\345\270\203\345\261\200\347\261\273\345\236\213-\346\250\252\345\220\221\345\270\203\345\261\200\345\214\205\345\220\253\344\270\244\344\270\252\345\233\276\350\241\250-1-snap.png" create mode 100644 "packages/f2/test/components/layout/__image_snapshots__/index-test-tsx-\345\270\203\345\261\200\347\273\204\344\273\266-\345\270\203\345\261\200\347\261\273\345\236\213-\347\272\265\345\220\221\345\270\203\345\261\200\345\214\205\345\220\253\344\270\244\344\270\252\345\233\276\350\241\250-1-snap.png" create mode 100644 packages/f2/test/components/layout/index.test.tsx diff --git a/packages/f2/src/components/index.ts b/packages/f2/src/components/index.ts index 92fb5361a..943375408 100644 --- a/packages/f2/src/components/index.ts +++ b/packages/f2/src/components/index.ts @@ -32,4 +32,6 @@ export { withCandlestick, CandlestickView, } from './candlestick'; + +export { default as Layout, ChartLayoutProps } from './layout'; export { default as Pictorial, PictorialProps } from './pictorial'; diff --git a/packages/f2/src/components/layout/index.tsx b/packages/f2/src/components/layout/index.tsx new file mode 100644 index 000000000..12831583a --- /dev/null +++ b/packages/f2/src/components/layout/index.tsx @@ -0,0 +1,134 @@ +import { Component, jsx } from '@antv/f-engine'; +import { isString } from '@antv/util'; + +export interface ChartLayoutProps { + type?: 'horizontal' | 'vertical' | 'grid' | 'circular'; + children?: any; + style?: any; + columns?: number; // 列数 + gap?: number | [number, number]; // 间距 + itemStyle?: any; // 子组件容器的样式 +} + +export const FunctionComponent = 0; +export const ClassComponent = 1; +export const Shape = 2; + +export default class Layout extends Component { + getWorkTag(type) { + if (isString(type)) { + return Shape; + } + if (type.prototype && type.prototype.isF2Component) { + return ClassComponent; + } + return FunctionComponent; + } + getLayoutStyle() { + const { type, style } = this.props; + const baseStyle = { + display: 'flex', + ...style, + }; + + switch (type) { + case 'horizontal': + return { + ...baseStyle, + flexDirection: 'row', + alignItems: 'center', + }; + case 'vertical': + return { + ...baseStyle, + flexDirection: 'column', + alignItems: 'center', + }; + case 'grid': + return { + ...baseStyle, + flexDirection: 'row', + flexWrap: 'wrap', + justifyContent: 'flex-start', + alignItems: 'flex-start', + }; + case 'circular': + return { + // ...baseStyle, + }; + default: + return baseStyle; + } + } + + calculateChildrenLayout() { + const { type, children, columns = 3, gap = 0, itemStyle } = this.props; + const { width: containerWidth, height: containerHeight } = this.layout; + const childArray = Array.isArray(children) ? children : [children]; + const [verticalGap, horizontalGap] = Array.isArray(gap) ? gap : [gap, gap]; + + return childArray.map((child, index) => { + const childStyle = this.context.px2hd(child.props?.style); + let width = childStyle?.width || containerWidth; + let height = childStyle?.height || containerHeight; + let top = 0; + let left = 0; + + if (type === 'horizontal') { + // 水平布局:子元素平均分配容器宽度 + const totalGapWidth = (childArray.length - 1) * horizontalGap; + const itemWidth = (containerWidth - totalGapWidth) / childArray.length; + width = itemWidth; + left = index * (itemWidth + horizontalGap); + } else if (type === 'vertical') { + // 垂直布局:子元素平均分配容器高度 + const totalGapHeight = (childArray.length - 1) * verticalGap; + const itemHeight = (containerHeight - totalGapHeight) / childArray.length; + height = itemHeight; + top = index * (itemHeight + verticalGap); + } else if (type === 'grid') { + // 双向布局:根据列数计算每个子元素的宽度和位置 + const row = Math.floor(index / columns); + const col = index % columns; + const totalGapWidth = (columns - 1) * horizontalGap; + const itemWidth = (containerWidth - totalGapWidth) / columns; + width = itemWidth; + left = col * (itemWidth + horizontalGap); + top = row * (height + verticalGap); + } else if (type === 'circular') { + // 圆形布局:将子元素均匀分布在圆周上 + const radius = Math.min(containerWidth, containerHeight) / 2; + const angle = (index * 2 * Math.PI) / childArray.length; + left = containerWidth / 2 + radius * Math.cos(angle); + top = containerHeight / 2 + radius * Math.sin(angle); + } + const tag = this.getWorkTag(child.type); + + if (tag === Shape) { + if (type === 'circular') { + return {child}; + } + return child; + } + + return ( + + {child} + + ); + }); + } + + render() { + const layoutStyle = this.getLayoutStyle(); + const childrenWithLayout = this.calculateChildrenLayout(); + + return {childrenWithLayout}; + } +} diff --git "a/packages/f2/test/components/layout/__image_snapshots__/index-test-tsx-\345\270\203\345\261\200\347\273\204\344\273\266-\345\270\203\345\261\200\347\261\273\345\236\213-grid\345\270\203\345\261\200-1-snap.png" "b/packages/f2/test/components/layout/__image_snapshots__/index-test-tsx-\345\270\203\345\261\200\347\273\204\344\273\266-\345\270\203\345\261\200\347\261\273\345\236\213-grid\345\270\203\345\261\200-1-snap.png" new file mode 100644 index 0000000000000000000000000000000000000000..63b578c2022cb7960ee54c2c2bf7cf47f0cbf740 GIT binary patch literal 10273 zcmeI2XH-+o_wOm9fFe~;q)6yO;GrW`F!U-&=pY?IdapqZ5I{hRKxk2l^bVneMv;<0 z=)FiUp;sZ4e|~rU*S+h$xi9Xkd)InioVCuJb7s%1J#+T#&vzz9UssKal9`f-h=@u< z9b`a6L@fB9i~Kg>Nl;jV9}&?LA`Otzt3a!roV&h8V>vgFPM^JgDyS4g0a^XvQ^urO zn$I;k$a-+j#rGOBCqJ2GlOmUwGL}LZ`FBW;I%u|fMMV|T%-G4LXykot?6iOB3)zMq zYtnT}my*MMViMx_a>f*!)U#`!< z5J*z$LuNyEEx8dwL<3$BQ;7l5Fz%9AlRr1dh77rRRUr*s6<+v~ zMkqC`hE+;ISH=EBFjCu))h}LEN^floKyNEsg&irjP&T zOHD}PQ_|4Y7e6jgPh!mjeP4;1^aj$N)x_#`jQK^SU^jHAwLbGmErhzL7HkE_9NuU@ z^#lT0$yC!;59QDJN){hN2^N(`i;X)EH8r+2-enZ4JxhC7XH==Mugt)&-|v>aSy8Q( z*7Vi41aIQ7TG@dbGPilqa{qk1k;lN?9Ng5cBH8f0*{z$68%_^b>-(*mZd|E-Vsv#W zDR$nvzvb=>I^^~tB%Y#iT?E$ConRC{Isbk%(H0kljT1E7+6bq0WTFd)J zMn>yV%3n?W{QRi5(rji z^D?#=S^2j!;YqOT8L#YCUAbQ5&K~{Hn}lVHl8}lkj{B%B>WaZG35$CFos8t-R58Qu z+%8@jikV`zO&HL4dYXR6Dh8kR%qRAm%2LqgL8^(-n5T=oLJhCKKX02AT3!1DC5SE@ zAHSt|tZx|L9v3Lr5dp6XU@58-junclacdo`E!Rp1nx9(e==8(vMVnJ#;p~)=jDnUe zzD|CAC!2u7TeLe~EbDcaQ^_B2mE2zNH&SSd84>$Q)z_|3Z ze?8N|6g-y1sn!7ogB|II)VsahjUe@Icvnp5OH0c+38b4M3R8yL+PW5FOT^l)S(nUz zgS~ZHV+GagQIyr;j&W8SXz!t)TUwd&g0A!5n0U3!pUOV0OruqI^bFE`XKOaL92aPX z0{Fwba!yw2+}+$NCVr->$hLP4n!<)xBn9C~6rCwoSpKjgEWJLBY<~x1 zb9ZrR3BY8Cgv4xc)0VtEhpAubAC^{_H(Je2`3afUf^=RV<493Y4UQ~^_SfIoI|=n-g4$uk*H&KDCW3&R`nI(ensNA*X9xqS zoe0I-wbhiTzdH`%#bl0uiCRm$<_~#MC6R~KHN!_C>_8*E=sm^Xg(Cq#i;m0jt~e$= z-J+4w^wZL1X{S}JjFL$wM_%f(^wH=-S!wCOlf0ot&p_CE(2W-80VdSW7-hTm0^nV= zEZsdmw%T0{+u#Qn9EL7%0LD&EPIMui2T#hakb@Ggxp4Ytlb6kFUimyl(f8m=sqm7= zR$nFq>Jk}Dl{BQ6Ds%m;937qiVf&zC5;^T0WHgq{xaQg!veF|=m(&v}prwVac;*e2 z4mcD-=hft@IRK&|GQQ3(=?+ z|EZ(XA)}pp0$AR{;i?9@Ac-)Axq~Eqkd@O~cm9yGshgXdBfpv)n{^jP8AM&&J$QP0 z`toNKmEnyZ5D0XNR{mN+2zXl}wbtzKXu#ImipEo?0sh$B=7aB}{PZT$VDFWlpcJb~ zeXHPon!92(r3w=@etR5&pCI4kBp#z@}-ZTF^l-o1& z%fVP!8XE^V$+6v-JBAA}Q0fpu=B8}>_m`=I&&kV*MzHA;;`bch#L$|GP`+#qE|5K{ zDH52!9&LWaZ|b(=dtrz*ID&fBhm3!8E2-rWrt+9Q8z@keviJ$u8x^*^=%sd%pF!Ta zI`*M~5*8ODIK9%O7fV9-@{zZg&(@TF|0OU+HJ_R%rT2GY;JjUx-)F zKS7H)bF+;_ju#sZo*8T3418@w`SC#9Saj6=oWKZEil-1kK;AjPo1d2T^;&$hh(v>~ zmi*I%fxB^Vh?TMN*$4W{LQBvn^tp0B9b=1bx7V&{M^`xF&IUvfrFd$skKE^d44 z%FfQ5-%+L~JE)*O!@5_nO20}c$ZF|}`clGBz7}UvPj01SEECX7yr%A`#V4ozSPKzN z9c;5Yo;_N;xjwqTI5s1EecX{)b+HpWK9oQ2Du=uG=wv*BKYxB&36c{)OEm?F(7jrg z3C4-}*dLEKX7(|keeO8uy344i{gyI5)JIMJ8=@6*LuP6+S9E+Wwi@*~%0Q#{zz9Ee zpx=N2C<=~?{5i3!VlN@90&TJOg)81JMDwsqIY;`vvE5OVu0U!W*e*-Ccewm*Z7uR> z->Bn$aV9bJ#&vx7vGpZOj00^-fx;;!({tIhNU?G6*Gu<01(Jzd(j-w$Os*i z4L^4-DWMpdZ|^qVVYfbJ27cm@^3R+}?yjW^#mc+<*!c47c4W0s$oWlJ>dZ`n@OMnO zK$!G`rX8|PBOlqRGt;rZ`P0s70f|dZx0b#7#fZ_v5sZ86x{;T8Nc&%?H^2TNs9BU4 zC)f%u-{1DV_7Xk2pj`;ri^$1g^F*~=7OrEz=)1EQT~c~2dGX$bWs2gmU~|2$kAG9o zw4b%frU~V^&zyF#i&wbLAcH-$B(76u^Ewe_wX&7zKaPDS*j35PTvfxuqA&=^8s6#_ zHrxx*cCBY`9X%&F+LVD-ycmiwxtXYnl&G@V(N6Z&9+mau65%PcP}eo{(gw7OdCad% z`r9SWb_*yrOF&*QWQGfgSKxx?p8*c}#1Q-d7b9;!nVj6V(DTDNq#HYUFGxZ{q9Q}u z%a#wWU3x&Gtr&1v@}c^|Of7h|_dVH&?nVrMOwMr>87-@fWHqFXcYJTYdV>j7n#7D- zrDFOuEhd0U+*=;ql(kHr@k;JmRgb~{!uTk9Ua3=mLyX<6bcx(=bain-_1YWwXq_6pElx-2 zH)~jq&T$vZ;^ax82>=PI5&=U`@7g?|@~fs(GWp@MXFJA-ddj#NvHGr>Wc-gxsSwnN zYfwpx)P}60E6&iGyi7WqG@T4ZX_3NIh@t_%{O67^1@u9iq_Ao{p+WuoukVu!M8sP` zpT00riD3D~Km(>RpSzKHVR9{Y-~Kkaz^DG*kU|c@1=>4e#Lx#A|FhO{nzRKdshI-w z!C=%`^K_6+#lbV`Sn7www7uKPy_lE?Bi6B#qzD*|F&M0DqM&@=cIdy2u17W$eEn(@ zbF=x0gYVX8`j?jG@hWRYDLy|{`77QC5y6{BcSK2{4|*KW+J|Y<_Fy02L?}wfR=lMv zIobn73}i=9I{(C5xRIlszAFLQP?RocytxNC+PdQ%kQGJwb_8$cMUFOZ`vGJ@QM%9I zO?}AGdM(64k5QDK%Xkw%aBHsx;LQ(o2;lV-VXsP-iLJv`t z{&>7m2sv7~mROhxMfsQNkKqZ2AmaP&b`x@ejerQnlj!QpMdrT-9Od5^NIHljszZOo zDsu?Vl7`bnR9}9H6{SF-bpG5SCP!13^3kJE@_+6U?wQK@807!wM>5aRmo=>y%S)yr ziR};RyJ1}4N<}-DYANI^3X8sqlq9nIxm#Ck+1 z=6#(>KeF)SVR{kDNZVZfk8s;x7P9zSv}H zR$!cITKc9$lFBOlCK;sr6#C|IOcQE5O5Gwsb@s8M*FmK_FK+4AJY|{w!SLkTw%rt!9`r-9JPKakBc#dJMbg%_wAH!WaY61@iMxy)-uu>Ddb< zEes`h{Zc_`3XFp*a!y7EyQn)ascSFu$LeZtAr9Lmd4we&g z<2!!nYPS$CX_o8NoyLU@%g;4|2TO({o5wDIObyTuh=DO_T~kY|s>(7PBGV?NvG2K7LJe$L1s&ys^aG(dpln!Qt?;kAH_>sS6}3AE)Pg z_;t2eA(gQPry(vB8_XBN>Jt@Gwqj87d2Uq3_@KsmhW)b8bvI56sgb2n~~`h|j~Y+J|0zs=rp@ zy|>3W=_wybL$p+1yJ!pk5{gt7qRvXsX~wV~1YW8-UK7)PrhA#cEKTp;x`TZ4Rexgw zBpwGt2IdCLu?Ec65VHIR&@mIieN`nTkJ7YxCg_LcK@8Y_rp{Y?uJt8Pl2hg z(LTL(v+@swn;R@}CvvV{fQzhZN=FfBCjn!7 z0pjgVHWO4JabwV$#|&}@{$}J``%er+vuGqh^r%zxNRgoYB*+IJZ?FJ@2Wrdj5*S}m z^oS{MXrta<^!ypXtRI7hZFI_ETM_U8LPjw*U{=!7a?uSC?eofp^iXJN>}e$|XS>dv z-Ub9Wm6UAGi`f0%=FUq86{xOq0#07^mLc8eg8iH(n(cd&)0SpgFHD~ZhWX3KUTXXl z8=0=~{W$g{(4C)HB*)vEBlJ^`R&hzl%XVI@H`6Pt+7h+iiyytDN+vlr$=|x2=t4ve z3-WtZa|5rBgm)E=mGhE3S{JuN#>>ObHg4oPj~0F|?!ThdAgF3J4yGQko(2Nj3J}~6 zgLNe1l8mGiQsBMYf7P95POW1$Ht)Cdj)~#3LaorXwg7KKV^po6YyNr=mTu@_x7YoZ z!{SY)2=B+l^rl@%QM%In!2WH8gd^JeQBPqy&h`aW2Wu#F< zqmWfwptnp;coxjck7d35QiGQqCk0CNW^u~B2r)7mdjt}fVYyFD5St(|#qZ%B+nOer zP<7C*FU$I5OUva$Mp}6lkY?_lEU2KRqho$^Pl^pXhGuLD>91NVxX+`=#HtwT&1WY1 z0r-^Z>mo0cz@8(MT&w`fU1QRxQvr9FvbS$#r3ay4e~Wth%P%ObKRIpu)U~tq%Mw$} z#Hn@DA$(_jJhbdR0qrZ>f#UwJ_&-xov0raiNf!Cx*vmP^^hI zvb4112599EZA8lqkpEsj(8@54`Su>>PLt$C7#HL9rA{>vV)w5)AD~L?XnDxFz8r~^ ztV`u&ORTbW{!LwLd&o=Mo*QEjNa3oFt%P2^`Ix z(t8E+H5O-XFgG_hdL&#dB8WYzG@9tej1d%$0D?C=9oE(f3gl>^R(i+CT^1DzDrj}E z%++N|)YuEdrLNHoVzG3wm)kpP6X4JdLqv~yudCL`z?ksxCyIP$-}6zoueHPJW@qB< zbvM|oDvqRpG@#|_|B>=t*8Vrj&o(%n1m4Ikuli1x72h17jddSNafMzJ^t_Iu_2SCXT=2% zn#JYmqYS_@Yd&Iqt&^uZlWR&b7~nb0Fimr&X`hS0hC0P+42?YOAI259oj&@0NXh3OrH%aG!xVO%hO&ci z+hG1FBh2Mur~qsDvZc#>M>LNWgKVhh(SYS%d)w79z4*#E9nFm#$U)IN||3n1ug0Dw3sdcQ+Fk z6SI1lA#gGGnDI*4M8d#MXVO#mqoD9NBSJ?pCvo$zV*q@6e zHf_Z+CW|r3MURQmQD{nUf!Sp9lvlR!3gf)x*W2@itpvvIIBToiBKw@-^zqy(6ZIqA54Dh90;S~8!NqHizQ09&fVk&ZfVj(Rvn zPNf|qYae4Y{HgO%9{uYp_CYIAnt8huPFDLJjcXwz-@`;I%H})t3Jp?_Z>J7byQQ{$ zCc5Gnfim2%5iAYZV;8g3-Iv76^NHD|_hX#H?GxEKZm!l86-TG(TN=}aFZzWb$1Qo= zbW3H`yH;lyn5RYvW=X#}eJ>%|w^o?8{dYI=xO#ScjWfm^yEoqf>hiF%-;N~^!Go{Y zHvvITT@RVr1}f@) zZjSUE-W*6w?RljuiudGQ(T@u`vbf4&$3sT$>`@XRd}?jD$@XF7m~;lS-hhU7K^@gS zDW_ZCa+61q>cEm)kiP=$)0;?RR0}rDg(D8r>po=u+QV&0a)3H2C0*aVa2x36?|Nr& ze)_`^@~9I`lXmkFuXQ`fL4_j6wq${(r-B}R1ZIba;aMR3*=&! z?fuPjzcwF2`Q$UZL(l(PEbxXbZQ}TVZdN@$9{imwozxTbhaWC2$X!24RXd*8-*AeF zlGq8L@~bZY-xCXdAs*Qi5#5>n&sl)~YvJILO$p>Y`%c%Lk3?b+RU=c-^~37Y{1yfJ zKYe|g5+!2gS0cJ~Ot2I@OG8HT?iG sNB^Cp|Ncz>hNpky=>IP((^p8kGMHf`5{QCWW0dX6`wg3PC literal 0 HcmV?d00001 diff --git "a/packages/f2/test/components/layout/__image_snapshots__/index-test-tsx-\345\270\203\345\261\200\347\273\204\344\273\266-\345\270\203\345\261\200\347\261\273\345\236\213-\345\234\206\345\275\242\345\270\203\345\261\200-1-snap.png" "b/packages/f2/test/components/layout/__image_snapshots__/index-test-tsx-\345\270\203\345\261\200\347\273\204\344\273\266-\345\270\203\345\261\200\347\261\273\345\236\213-\345\234\206\345\275\242\345\270\203\345\261\200-1-snap.png" new file mode 100644 index 0000000000000000000000000000000000000000..aebb84cebca761f6a99473689d65125fc4d027e2 GIT binary patch literal 1921 zcmd^A`#Tc~7@qsiI+*KHVWSg;+-fq)i4DvBGEGDn(<)@tvg972X&z!*E}MkCL=lDrn_b`BYM`TKoJn(VfRV?i5Yb~^-15E=!s)1wR9 z1wsd$)U`bD?jwh=^P$BR(DFj=qjdSeQ|Vzs)&=coh1~-|m%{y6?A|BhHOJrk9L%ZY zHxlc^C;0V!;d!1kSS9EO6d(jV1IxD$m8}*QT}aF06-_UVmsxRkuDF}+%{hrt$~R?3 zuZ@gdTHPEnru(s{9VjZ{##V2dQB&se3Nf-qhnrRGYP%A3U3^0c<9JNRbmilsKiAGp zE~J9@qCT%q59@f;GLaK>3*1h7HJ-aZ_{ZfQ8DX1BCGg{snF(0!S=tjhwn&2Nz@71l zsAXkJ8P7`9i-W+sk)$v=lXn)fQ;g@t^@JhnEMNxqx+vMySew94rd&l7m~8bWrhaP9 z)M_ng;2wcLpWj%?=L2c%#OuIr3mbo2jfR=~@wEB%%D9OHiO*qZ;=+ZavAKmACpUUJ zL^X{*@nWjfyh7q0CJN|GOERfh60RbkkLzIu>H#9C*RDDJH+JJ-g`{kIylv6!krM`N zLn<(W@<@r?dB4iE#?{ht+i(!ZX7W&JoqWVvVY7+9r^}j^YSEywn)6*LYVYL-$bO=$ zvTK{}?^qdKlE0~7dMJSwTS%9hqwM`6eNcrtD00j>L`p&F1I@ZFyH#Y~(NK-$$S4V^ z7^?li2(|Ft+?X3U)P14iY7dY1MJu>ISpRSrt-N=jh#vVAp~%1S9TaSv{Tjy7Bf}I# zp^njj7GE8~PK`vtj~S&vkPr~6eG4EA4zU3E)R!dZgZBjzKZO8vMWU&1FSMntNru`t z+2-y#U^ChA*N%QPNfOeW&XrSJ^;Qi?DTqM39N#Mb3Wu@~kVjp;o{rQdP`e&Ag-hxi zMOa-gp4Xu@LJxm~sX7NjA9L|aPLcZ?=k_cRsHqa0T4%HY3oHUls<(lW+eqw=wD zPP2;f7_)T)dQSa|8T^zbTCuNQb#vyNF0)g3X`sq_PPcvli!E5+QDT> zt>}BCo2Q~>hmlk5165mChPY1xPm&7-#MBDh;wJo4y5;{z!4e;h`N9~5S2JO6Jns7A zQm(q4HiDBi_d4Zbn-gHX34_+cJR~^@(@*Jiut&>S*Z*T3UCP~VhnQH{3EhuUKO)oVY z%i?6p@NiN?4@x%n^7+Mx;w10r{dD`jMt18;sB=)tc=dBMJ#8~rd*fKa8ZjO?AF1XriaS@2@BpPN*|2KVtV*B==iJ6&p1+78qeC< z*M4vKPb``XVsV_P^YS8Pn3>f*F%kL$!kw=j_bVf2&t%={=773oXQ@D~e%~Z9A>dBl ZE3>a)Mi>*S-YR&l05r-TSz&%9_FvCzD5U@Z literal 0 HcmV?d00001 diff --git "a/packages/f2/test/components/layout/__image_snapshots__/index-test-tsx-\345\270\203\345\261\200\347\273\204\344\273\266-\345\270\203\345\261\200\347\261\273\345\236\213-\346\250\252\345\220\221\345\270\203\345\261\200-1-snap.png" "b/packages/f2/test/components/layout/__image_snapshots__/index-test-tsx-\345\270\203\345\261\200\347\273\204\344\273\266-\345\270\203\345\261\200\347\261\273\345\236\213-\346\250\252\345\220\221\345\270\203\345\261\200-1-snap.png" new file mode 100644 index 0000000000000000000000000000000000000000..a90c9292da36a374e834b9bcdebe1000a6d59a2b GIT binary patch literal 1008 zcmeAS@N?(olHy`uVBq!ia0y~yVAKJ!Q#jawqzxnQ0R{%8es1UNXt8nPxaG`cx# qkP2VT!T}5_(NQBt!-9l#v9E3EwA4G+Iyu0c%;4$j=d#Wzp$Pz>{XM$? literal 0 HcmV?d00001 diff --git "a/packages/f2/test/components/layout/__image_snapshots__/index-test-tsx-\345\270\203\345\261\200\347\273\204\344\273\266-\345\270\203\345\261\200\347\261\273\345\236\213-\346\250\252\345\220\221\345\270\203\345\261\200\345\214\205\345\220\253\344\270\244\344\270\252\345\233\276\350\241\250-1-snap.png" "b/packages/f2/test/components/layout/__image_snapshots__/index-test-tsx-\345\270\203\345\261\200\347\273\204\344\273\266-\345\270\203\345\261\200\347\261\273\345\236\213-\346\250\252\345\220\221\345\270\203\345\261\200\345\214\205\345\220\253\344\270\244\344\270\252\345\233\276\350\241\250-1-snap.png" new file mode 100644 index 0000000000000000000000000000000000000000..b310378ef20018cef219c4ae47d18b79a9ba5a0a GIT binary patch literal 4511 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 literal 0 HcmV?d00001 diff --git a/packages/f2/test/components/layout/index.test.tsx b/packages/f2/test/components/layout/index.test.tsx new file mode 100644 index 000000000..b01621134 --- /dev/null +++ b/packages/f2/test/components/layout/index.test.tsx @@ -0,0 +1,162 @@ +import { jsx, Component, Canvas, Chart, Line, Legend, Tooltip, TextGuide } from '../../../src'; +import { Layout } from '../../../src/components'; +import { createContext, delay } from '../../util'; +const data1 = [ + { x: 0, y: 1, name: 'A' }, + { x: 1, y: 2, name: 'B' }, + { x: 2, y: 3, name: 'C' }, + { x: 3, y: 4, name: 'D' }, +]; + +const data2 = [ + { x: 0, y: 4, name: 'E' }, + { x: 1, y: 3, name: 'F' }, + { x: 2, y: 2, name: 'G' }, + { x: 3, y: 1, name: 'H' }, +]; + +const ChartA = (props) => { + const { data, color, style } = props; + return ( + + + + + + + ); +}; + +describe('布局组件', () => { + describe('布局类型', () => { + it('横向布局', async () => { + const context = createContext('横向布局', { + width: '300px', + height: '100px', + }); + const { props } = ( + + + + + + + + ); + const canvas = new Canvas(props); + await canvas.render(); + + await delay(1000); + expect(context).toMatchImageSnapshot(); + }); + + it('圆形布局', async () => { + const context = createContext('圆形布局', { + width: '300px', + height: '100px', + }); + const { props } = ( + + + + + + + + + + + ); + const canvas = new Canvas(props); + await canvas.render(); + + await delay(1000); + expect(context).toMatchImageSnapshot(); + }); + + it('横向布局包含两个图表', async () => { + const context = createContext('横向布局', { + width: '300px', + height: '100px', + }); + const { props } = ( + + + + + + + ); + const canvas = new Canvas(props); + await canvas.render(); + + await delay(1000); + expect(context).toMatchImageSnapshot(); + }); + + it('纵向布局包含两个图表', async () => { + const context = createContext('纵向布局包含两个图表', { + width: '200px', + height: '200px', + }); + + const { props } = ( + + + + + + + ); + const canvas = new Canvas(props); + await canvas.render(); + + await delay(1000); + expect(context).toMatchImageSnapshot(); + }); + + it('Grid布局', async () => { + const context = createContext('Grid布局', { + width: '300px', + height: '300px', + }); + + const { props } = ( + + + {/* 第一行 */} + + + {/* 第二行 */} + + + + + ); + const canvas = new Canvas(props); + await canvas.render(); + + await delay(1000); + expect(context).toMatchImageSnapshot(); + }); + }); +});