From 9af01e2bb2c6517c3ca14b551cdfa42424370a6e Mon Sep 17 00:00:00 2001 From: Luna Date: Thu, 19 Oct 2023 12:12:51 -0400 Subject: [PATCH 1/3] Describing Your UI > Your UI as a tree (#6334) Co-authored-by: Luna Wei --- .../diagrams/conditional_render_tree.dark.png | Bin 0 -> 13413 bytes .../docs/diagrams/conditional_render_tree.png | Bin 0 -> 14003 bytes .../diagrams/generic_dependency_tree.dark.png | Bin 0 -> 11328 bytes .../docs/diagrams/generic_dependency_tree.png | Bin 0 -> 11852 bytes .../diagrams/generic_render_tree.dark.png | Bin 0 -> 14768 bytes .../docs/diagrams/generic_render_tree.png | Bin 0 -> 15294 bytes .../diagrams/module_dependency_tree.dark.png | Bin 0 -> 16577 bytes .../docs/diagrams/module_dependency_tree.png | Bin 0 -> 16977 bytes .../images/docs/diagrams/render_tree.dark.png | Bin 0 -> 12030 bytes public/images/docs/diagrams/render_tree.png | Bin 0 -> 12607 bytes src/content/learn/describing-the-ui.md | 24 ++ .../learn/preserving-and-resetting-state.md | 24 +- .../learn/understanding-your-ui-as-a-tree.md | 299 ++++++++++++++++++ src/sidebarLearn.json | 4 + 14 files changed, 331 insertions(+), 20 deletions(-) create mode 100644 public/images/docs/diagrams/conditional_render_tree.dark.png create mode 100644 public/images/docs/diagrams/conditional_render_tree.png create mode 100644 public/images/docs/diagrams/generic_dependency_tree.dark.png create mode 100644 public/images/docs/diagrams/generic_dependency_tree.png create mode 100644 public/images/docs/diagrams/generic_render_tree.dark.png create mode 100644 public/images/docs/diagrams/generic_render_tree.png create mode 100644 public/images/docs/diagrams/module_dependency_tree.dark.png create mode 100644 public/images/docs/diagrams/module_dependency_tree.png create mode 100644 public/images/docs/diagrams/render_tree.dark.png create mode 100644 public/images/docs/diagrams/render_tree.png create mode 100644 src/content/learn/understanding-your-ui-as-a-tree.md diff --git a/public/images/docs/diagrams/conditional_render_tree.dark.png b/public/images/docs/diagrams/conditional_render_tree.dark.png new file mode 100644 index 0000000000000000000000000000000000000000..5189a44c80c32e9d33fd84f4719d4feafbb44c97 GIT binary patch literal 13413 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 E0*Cxr(f|Me literal 0 HcmV?d00001 diff --git a/public/images/docs/diagrams/conditional_render_tree.png b/public/images/docs/diagrams/conditional_render_tree.png new file mode 100644 index 0000000000000000000000000000000000000000..c76e8cb63482b4f9fb753485dbefa98a8f0d6977 GIT binary patch literal 14003 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 G+y4U|3Y-uC literal 0 HcmV?d00001 diff --git a/public/images/docs/diagrams/generic_dependency_tree.dark.png b/public/images/docs/diagrams/generic_dependency_tree.dark.png new file mode 100644 index 0000000000000000000000000000000000000000..64694f58577fee331d4687d8588ce81edc594b13 GIT binary patch literal 11328 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 literal 0 HcmV?d00001 diff --git a/public/images/docs/diagrams/generic_render_tree.png b/public/images/docs/diagrams/generic_render_tree.png new file mode 100644 index 0000000000000000000000000000000000000000..952cf5faa0137f53208c351dc5c086c1d9ffa425 GIT binary patch literal 15294 zcmbWe2RK}9)GjQEC=tO(NRVI*qD$1M!C>^>JBb#(ccP0rBYF*^jNXRmAxaQrbfXi! z_a0~DeZT)d{e0(K_OrIN*1hg~&GYQNJ>!~*P*#*Cd_eI43k!=-1_D;a!or4PVcliI zyN8L;PwM1gPS_S=3SwATm9Yd@CigM^9cNW(ajdcds&$Nm?*P$p#=;^Xy&ZS3Qq!Me z0PD)~>XOn9@>pJQERQTKuRN^c-P@yN7t1Rbt9%#B=dUgO8^HvLtb`(>HKX#>|2l6w+^vF?omRn zQMWGv^KyK0g)z0IdmnV z{@cL*El=t0&CLzQ6?TipkOVZL-ljDW2O?T$*LF|Ov-@XgK9w1lbj|G?(nOXU7kAQp zDsP=xGcM_z+dYiy7YrB5{g%}~!x>*Qw{yf9j~rat@oz@Oc8r&gEh^`> z#&(Vmu51r3?+|-tI3WAVN0%r)Qp(4c*xlnR#um#*7mZ3f@jSDsJ(7t$GYCAh-nhlQ zagQbN%CblHVS9bS_R4wf4yE)=VRwh|xX1Cj$N4v*zRj++&aT_n{M1eY&S9ca4o{XtJ}2i5(o2=ZxdB;##w^IR|$+2V+~alsNt(vjmnKGh-rx9;_L^@cgyFp;sQ8#=Qso6DzXENvhCySWBmgR#NK?z z!s6eR0gI`7ptmvx?WcY`=|%=X9GKp)u+85GWe>FzZZ$s^i#leSl7Ok*V|8M$efjAV zF%zoxv0UQfoZ%EcuQs;u3HpSCZS{01?sJWzjoifUsi`A>x+k5bh{xdyp#ihlX$eQG z|B)otOk<1J(G2zeW)MxJbnLg#u;E;eeS%<`Tzfyfz}ce>Tigcs=IvOb!1+e|J(ge^ zL^(BXbKg@34^9J|wx#lY!C;yNTH!~bVc*&%tR0AjLX)t?^hL2CeF5;@J-J{SvXMu3 zvDO!$BLu{=q1oU$oFuIF?<@~rEY#tN<%!}-%p2oB{w@=k4fe#Rw*JyqmPfQH!DQj3D76x<|`WA#SG{pFUZ$Wxl8{~YSSC*0Aou*j``daKB!bxDHS_v3Gn(C;vL>~I|8E_SP1g(k3x zCfW^`HbeJ0klzBWM4*8*O~*%5N=I{7dbybjEeVEA*I|UN$cP%9VjlbRLZjkQpP#SS zGQ(ZGL6u>L8CeFCM}}4WpKSyT-h-Z3l9cd5)9u{16Jxz*?CPR)aAruLF>|s8`q4!E ztQT2n5IPdkhR4JW!~|c>ZfD~y{2_F0!_47lzV1;<1owQlARkE)%MPQ$TeuQ*w_!(( z*s847;56%Pdl3LZ>g>^xl?0h)6ex%`moT!3aGB!e?3;jF~? zlr>&Q{Vn{CQB~gQo?T$!oDQ7)Qc-Y?d2%VFIH&&DdIH6k~NyljYjeSg(|To0O!Ccz(* znxNx?SB@7K8CDHbxkr%Gq)>>`hiIwc>Oh6%P_v}>5x@B&t(V7s(87$Wb@!5Axh3~K zjW^S(Um3~Fzm%7?IXLGjP^o?K;WJkkjH4Y0C>HfD`E@`d<6z=o8230%*6s7uStpp{ z=c7dOqxOi$sRxCmS;H(6@HlhB7x`3NeNr-T_h60q>5C!(M!>UePD3(aLZj3pj&nH; zeT1dEIF;6u+9nSw)IkrYn8>o~djZIP-V(C{f#Tdby)<5AX@VrRmdv(~+QM%y>pg|Gn)Rrbv+ zK=AW8TrX@5ne{-5287zL-{-6ZfEOS2|B@g25-=AX+7C(ncUge`+T@9cE18Q*2cSZtoog< zusyvgVmwNC)UCAg%W6GcQ=(L9zsEsQ9KRl|o{ z3o;eHRObY0B)@7>l+Y@_I5@Yi8!CJAkh2MQ_I~kh1p{*nNHruDY9jO1(PqT1RDVvD zx3PpCeKx083eRqD$q$Y`h97mC>qKGetQNlowFUcA@**@ae^mmM_T0Hg3&{t8s{AbL zRhWgDJ)=j0C^xb1-$^DNC9~*~r&J^ADEU*rqo7A(MRzx~_N_Z@l5Kgk0+P+>UY8bl zG4k0>`G(pHDD1wDtD5knEZY=?DJl_RLW0O)kH6GQTddvtAmmz{?^~bmxJdz{OSkkt zd?IBqYHl#eR7B~%o}w>5b__$Z;r2r{^P>wEAwAtmPDf8zrxFt(1z$#vzDk?_0TIHC zMwVYTJG)8dygCPaaYaHToAH3hOo+h8bt0A!ee+3+$%%2^P>Qb?vd;S;jq6ed*ak1d z8}&XZ&^YVQUZ>QJlysViu25E>XBWNoC##vUKS6!ebUeL_nyCV$ zYct@tWT5Zn(BdbXtrTspM1{2J-Tl1S-|Mtv%Z2@TSrDMiNg2}xJYqx>Wv^^%74c5) z;sMl+CW?zoMFmt{8Fm$ZRJmtbnL*@dqh}MT4Rb zSgiA-2@m&EDr)3Y<1^|M=oOo)Xof^(Dc;9CMLJ#cg0n(ZO5XJ|s1BJR9|@H_g_aQ! zV&|Wbe0|7_?cn9CWlL=i_gp;&y5CqiCg1&8HhDc*w=Xo<#ra-nb?)-_cULcY`_C%t zcbZ=z6Qdw5iq6#C=o$M1tXQ-5hRq8 zw>2j2Zbfr&t-D1q^uQ}c2ITvmbY0glOBdIZvA2r~c>LbNDc(V82mZVq08M=jFS*A- z2Az<%Ss}H`O;gqL(rQWRy`7;_lBDpjnoPJBjzIhg8x-&I1NI~cc=Q~+7|^kEQ$@j_VP?Z(2+$pPc`)i83hQ9DQN+|CeNAq%Y z?>W@Amf=wK4g=EM`bV;St(5s_?XixQ?IWTyn|=f2z6xm{8LetWL1d%B)}Qi@9nqP& zPur&g4&ae2 z8u|eV?^fAO$qiaJ#~ybbct9T42SDP}%|Q1&uaJdFQzSC?10LA2(hQAQGv2(%k&^;# zM1EziR+gV{&~LJp3snE)e&egAup3^@#$%!8$$mTc&mV__3nn0 z>xF=wqL6|Ia=bL$>0x4O%KRwC6i>vV08>zDVOpPH8SsDWat4d|bR z>i`|CzeZCKl{InhXpO!ToaA8z+V;jwcoN2twB#P^lkw+ChO2LD)@Il`eS)XH5|M)g z2LK?bA2#8S88gFjbNGs|{2ioVF>O8JT2D_Ur&C^5roQ`>piB?ShDiR>eC$zKmLQ1PahCF9r`RN- zmVx!P(A@2(^wKxEb^Z-~?oXoM9-D+^23;S>m1ii<%srW6V1(NFz|j7lsdmF7$IniY zyW8q#LM_9zP}m2b8sFNJa;GCO`m%;6?om^B#tdZ`NcHkYZ53?&$6qQ9l5y-Xil&`% z7Xbj)%~$)5<{I>Nhn1*z8ppq1Y#-0HY5E_{WL%TPU7+Hn26wkwH~gox)>qd2uTw;? zhD~-Woq>5fH(`w4e2*01ltiM_?r-EGK+rW|=%czzWADpq+*3U}|0@@7@5{EOFzcOyoQ zlG6C>XX7z`+-(d10o{%WYyduH+(O0wh5y&-{|3?qK6^b)jd>PuZ{og zrI1?mp2k;3!mhTNJ$;^bToVf=s;G~G3rR&JV=a%S7LAW;zgP2&;sf@<(3t4W@z!pY$ytlfi3U$>?W~9Nb8%mm^=3Ay4Ff$$oZ+lt{Da(Ta}~-*XPtv% zen865-GUFINzx8E;LTT3cj6#e0Q~>Gc?-M)!2drQ2nYlDpPTvnuxJ3&2dV(ay;|_y zE-6}Bc%UOzml(S&JRNgxGyM#S?7H(5S55_}K#6Ni^*9$S@PTSRB&lyXQTqCYbr`zK z*UFm;=Ye9AHQ+ZU((4Fhqj(ty$+fSMPls4o5I%;$RrqwbZQzzn>rEf;MsROPHR}2j ztsX43Kta&?5X+hnv=(F~CmODC?>@i^ZlC>F5><~tSkf`+^C>%s|6J(}>6$wjm%a4& zVn`Z%a&pt?cIuMLCSBKG>p#Rby84rF{>+Cd-lxya&QBZ4opSF!DIImjo)7KpNa4wu zi_e<1fE{v8mU{Act$g$4#*HC_2QBXNgT?vPpH=xIxE74jKryrWBH)j1S@T*N%81W; zRmPB4+2JmLX`}ip<0o22xB6Mjkl$xs&BLasWw7=)okjY6GuiDXMJm{-OLmN(c^CgCVeamQClv2Kyf(ZYG>8*EzN zC%tkdg++( zppk=BooCot=;LP`lA`I2sZ_?Tzb4ob!mq7sRF4p|UlEV_bgyLyqBjw?k1t&ZemQwI zOgI&ti2JBjs&XoG0xS~Cmz~bpkybU%Jq^-_-``NzX^dDNI+BvXIASHUe)mX_$4h-U zve=G1iHn;iMUj9#gYIfWo!=ZE!zzJYQ3S)s2k)8$|a)Z4ZRJ$5b4 z)XhgTmcy1ZNuSf^zGOvCF;Cev*Pk_5+84Mnt-z%ExEq+gKFJSR_QXpOqD{1zsl8Nx zQg2Nk_-qug3@6C`IeVaH#;q)^Ht-~o?d_|(A+q~t(bH(ll;7pMTJAy*B22ewGPR5CY$gv4eqAlx>-k+qo%l7Tq*K`f2_la$rF{&arc?AduFMeKqBej~i zH+p==`uPZ70ydCqYL2)RjyK^$kBqdNA7pBodmBnKua5CO(leiYY2Tue-UQwdQttM+ ze3H_^`B_u7xXxDxOMyohDa@W>mAW}%Y3nA%Uhsm?wE~qBr(I~<@Noa>kp7on*F`t9 zn~+?JLb{ga&fXzC#5QQA{hNVOj04BXE}nZ4s+Vmp+upXu=9+aKaTcdmW$Zm4XvJk) z=9AHk_Q{jsroD%(tVnq`BzfH)V6f&8g;0vFMI9_)W)1bebn~M5ke#Jhz=*yo*X}#PWRZyzmI?Oe!vD|)RbI0Wb8Od_G9m|FKr~wp1*Yt z(PwvGi8D1CT;@ej*Uo;4uR=N7rB~oTyZp!;d$U_<7AV>G@K9&z8p*lulc@xESX0kosQMs3<;q zrtkiRWLLfY3;7R*{|55EV)!c()cYR{QFk|R5<(hGavrlQTHNhcO*b^))iaM2(LAe> z-R^g3vq@pQFguaO6FkkFZEdTZo@@4I3?9{~eqXy5G$cFWSyiC!eEWG^t|{Eu^s`yOIsE&#ZojHWj?kr{KM^b*EqA*WQe86dv-#3Rf4euL z#Q?4KF(=GUsRt7r{W=NzM`oB0SLQz5>RGaQRG7vk<`f0%&R zM+;gCq9$wm5zpzKBl1chBRnSrs}TB6iGmXnD=u5oiiFasw$cap{NsK_8G0%^8<}z$ zdF5Mq4HlKnA*~V5_mz<72=`wf`HkdXR?gU6k>&f>*lvR-L5ln&jlc05nYus3t5WS+ z4&&Q-7uxBa@_y2dv%MHmYqb}&B;}WMh97|YDsh|Z#+;l0Y-ju2cCkA+W4Ok-mE)nJ z8z>?-?HCc6F4d~~Rrk?klnsE<6?^KD^g<_oKU(pt9Aze7?vg@tmGj&i!kb0|Ur_H; z-u5{artNp>SaC$R3-m_-MFWgc*OuOhdE`?Z&-~12DfMDz;$vC8w{aKc&Xb$IOYH!dZX(9&hUb$h;B03|2Kgx--t(rgdLyy zY0(V=VKx0nd`w|$P0CL=uk_Cj_;B`!R5wgT_Pm?=+{?YgA#$ISB2uO9xcl37wRf$a zifGiF3W_!HmV8l^za84U3TY|ZiKR#qa5_riu!HX#n}?T-P+JZ13O3YSgKba4rb;VV z7`LjA7$@NAzdqr77r5a5{N1>E0#xh);?OhK@UZ@L&%%Rvy>Kb1RpIfNkRpd7^ew7qoXw*ZnTM_J`o1j)oAwO zNpDzQa~{hd);cfT-Wx%52_sNNX{#pEtZFr);w{4FAmsapK1JQ&R8B0u**q#_<|5-! zU`(*zl|XHSA4?{4bfJaISGvyO&H>!x;U>mC&_Z^GdQre?!HLE_qE>(F~7S`j-;2}7j$j8$k>AX;DA$` z*1~9&T;(CV%rER@Me+>rh61bVFQDC`}13vhh}!WsQ40o>Z&t5sEs8$)jnDDb`DEe zpJ-EAxlyh6gr8jed^2SAi7r}@o{9YSxpT}_P98+pA53>n_-tumZ{c^w=a!Hj^quGq zq3q$K%!uSJrOj8mt4?suRNCk%o4!Fk&~mt@Z%&yl72<2mJBlEVwz{7)4*GdnzkE32 zyJ7(rX|mDM5wCzBg1dI}zs4EItDeAaCQ%$~&OcF#4Wl;Q@7aAQmBDs8JKRZ|c!VSb4EO6uRttqnE(+I2c4 zD4EeVuD-d%H|11is%Mo$pU!I{qqJ2?O~bGH@p;disG9?MKGnd-l1ikA)Ze@uaA~$E(b|2wD?_Qvy3;rDSbcsl@YNMRFMDYTl@#f%PH@R6BCLg zgn6@{viC1n36)3VU$+7)yk^JO>7~)>pI@yM+;@WOL?@<2X|idHPg_R%=Ia~Lc-a$4 zry5AhvKQyJI-b9LhYhpraCNQAEa#wZL=%cb~fow`x&zRyHa|CD!B>{uU|zYd+Y!#i%4zX?$*AEy>TBA|@Y z%vv=ac|VupFFikzHQk9;%J3#FWrXrMtw6v8((TY+{3xJqK$jy3bJH$BEUBdbM-Ro1 zYKJ<&`P#**C%OMRG~^UnZ00l2aI$%bWxC}8gdZ@Ep>qInE7mxGsPG*?IrsSi6pXt3 zfNaNGmkK|cl#L4i7k>;kKOiQ!D}pQr8>4lX3Li5fEbmZsL$Rb&>04g!(DhrPUjGrR z2`7_p=Zm1O55r%h7z`&v1UwNY&rMiD~_X0fCKBs z6oa+@fR|bcy~#Zl3kpU&ju~?#Ym5PQwyoUga32c5?o*Dso42~5jT6+ zWSDv2TsJ!voufEXln*yUcM;vpv`F5YUY3bq~6A#?S-QIoy5?|>WY563KO#taUXz$;AEJwBOb7j5BR~N3S;&F(& z`!vu2B>NGDMMK1d|BpF{gJEIan*ZC-U;O`bHKs5dg!My0_U>O3AOr_t{Wbqph}BO< zKmREfJIs@VaP=ilTe{Zc!^ii&Nji1QeLsDPLxoR6uHMYu1b&5A<|VmL(uw5&Rd3?H z;_9T)KKYa*{t8PUv}s7euKY0Ye)-EWCLF9(W_9vAZ!6aF78p8dh`+~-GvU14<*HY$ zci{LcLAHXp5RHuZcuy0e7^V`3xRQ2fjwwMl%l?C+z!j-{l_)si=WGv8sT%_~J*u zZL8PUDGl{!^Z6Wiq?ZsP%kyVaR9|Zsv!NhgpQbe>o`Rb-&W$YX@3F00?tbrx$|{buEBY{?;0>`EZe0)S zP_`INZlQmoO{WZz2AIaTYjZyy=evj0SRG-Yuglv@K9xW=liH}x6!oDcix>908i(~2 zw+?J?+MBu)jAuADrYx}^Y(lgin(bR?jpxOYk=to%HM2P3ant*X^AjQ%FMH?|_3&?_#bI+8C{oS4Hn5;&5mJoN<8QIzV<_`*W>(pZcf zAv#iBHj>Y-8==`|C^OyA5SKwoxjPWTb0s-@uJnFeRvSFdZad8{{YvXFhh&%c8A82C zL)Xtfvwt-DgUXU10aFYdUPaMd-2g=LP_Nrdmf^Tb7i*QjMD|P4?G-!qZ!WLpi09QM zNs06g_AItP5P(?tc~<2pJe)Afmij&T?A>@5(p}55?X+KIMq8+L0>_qCoA1WC{KP^p=*SE|-+t6A#Y}ZH0`hhE~{33RPl8G%mg39WVD8;&ruCNtFjEf4z zn*utS2%D>{W@iJtDgN)AOfP=M(@V+NsMOL=YJdi{t!$NM6(%gu)Ylk(to>KxOzwc8S$%$JT)zWQDJ%r^0;Y3jo|WysCTdHkak(SxiP@k(%z zC;SX5pQO~n5KOXOM-uhQ%5LgugE(Phzn5bX`cG~1TH=YrDw4LYzqst^vH0{JQ-qHJRnyqjT0;V`3YfR7LsLdCEt(`S}v> zjW_Q(ST#r++@s6Ct#{fPb=eShQ%Fs>gQz8YXZ|k zp7?q}i&J@PyJ~jWdWh*OF3LK-(`>l~=>1a?p~qz%`pao54Q$ATN95%{u^aoJBX~p< zicL&ysczKfj&~b)bz&J*4NTc+Z&70v< z@Ghb&e23@ zdKW@vNXS%J{}ewO9`}Cc!`!@U1fGK8uQwDj3z0W+p}!{W1+73KtefkdlcSt2|3}@kf8iMaUm1-4zcLv8+paMB|3CaQ=M#U? zG~Qn++CE%*U%d(O zIv~jc_4%1bJgMdAj(L5r_fLxt9cXylM|yaUks4;+v1rk9FTpP6Qusto9H*<3!Zm#* z0gIQrn3#MpBL2fhjtOz2L(Vw&+H8zW0dKxy8A2;cYs8zsh_d<{4cT8Btu9{V3mBRk zwn!_VVXQXy+6{4BF~TQuANLh;zG4NYfGpufqTfO-8v~zhvOr~iCRefqnIT^`6z5+A zVUPfkl8`VJfyoATTI#$QC_I=3&?b>gp++hcjtwOS13mE6%&Y@(p)`O%2sV)zNM2!& z2GBl2jDL$o;J>&918Ff>PM$V83|In$jlt$KcwiHmSl_aN#fc;4Y2~9aSa2W&4@e>u zjCjS<76iGa2n_p+CC0~4fcL)L0k@A}69H-E2{F=vkmS_)TQn_3niwC`QD7J+4_H8D zuGRa*H;q#aZUqG7E53wg9>+fXvLa@oyLn?EF|OHKjSJ0Bg(MA(+*4{zdjveD2+iMS zBAny;UM__TRA7U$BM^0rUw?HaLM|2N$~PDVAfooRw#VH-n8^t3&}YEo&BtaC zBAtAp4z#svp`dQ51i{WEr)GD~Zzu?N15ZvFw`c9LuKG3hb{LZ=n!ZO&U1~-tz!f%S z(c!|-UIxr0n~_@W$#o-LStCFco?$J$zlO&$M;20sDvip={hyWqd_%4AW-e`=508y= zB|hAgAuo5hc4;?EH_as|i)-9GY)fH+Tla1Jf3w>X)t1$bn#68>uf-uK^gFAkcnyWTVk`-an7I*5La z9*Gr%zDP5Fqq3cRM@;nF$nNln2rznvl0+IPOgY0fH-%q9KqACe(wIr;j+{S6Hpi+T zp)>10bbTb-E{&;ef7M6nduSl+!QtDf1crad_Y&lYfp`vIkpWFM_9H;y)ABE&9WU3F z3OdRvk**cFgR_-^r>bRfeR_n0e2ip^UJF~k^AVEcI%U$0Oj_Z6(!(*7H!1?{3Y1lQ;eO)ryxaoa|vgQEOx zYGF@;8v85r?V2i(bHDVK$RTi5WTGCcC5v1nQlH2B0rZ9X2V^JALac0sNh(oY&m~5+ z&r8ePw_D*!3703QOSb;;#{&7ez%T91V8E1xT(W?;ntNc}vDsoS0YP@xxAa~+EqUr4^-SU}_ludjWk7vfdJrg@I$Zl>CT>d$T#omQB_9NVbtD9&B`e@ z=?;+qxjY>Csdui*#{FtW$5=!F3W-e*fj!J?YMjh^4t%5cUXAzL&)$2kN7A!^qu2dm zkDw1WY z$z|yq-FPko8);2U#7X;{gmV##3rSek-Ki9pG~Chfw%Mf*KYI781`#27E=Ffwuc@b{ z-6zvNTGU6z*=v^~heT&oiNhq}RXT=cx{MYp*yklm)LPX%o4fbYAnzS58~29h!KF%L z_(W*kvDLQ0KHa>PSFY;$nfbg!g*bLoH*q0c+Ox-3#)E_Qg3X_leB*u9<6?Xy;t4gz zl`?pSr2+ zIktafRXIDy?7XmAEkLcWA?9WZFJd%L*#h1 zOQNe!;C4J_R^MJaqZnZC#ClvF!H}ZM>S-1gwLnzWR-#S?xenNCF;O>;a;gA^tmDhL zelS2XL#ks>lCYvGsUUFIx#z!9MZUh5Sc)M)6z{C?M$~+NAdt}X{?VE`QxEBn2I;3h z`XdATMZaU$Gp9913x^dg9C(!;Bnw!px!>K9@AgDUQbioOb#QSe1we8mIMY`28fF59qz>I4T zb+pLl20!|>qrdi_F1}qXHEB6`-IB-z*;E1Kw|@A%Vua-c_W_9ctdH99{Ztkct*`N+@2oOkSHncVgLO|bce)KP ze%}lKy>(zHeZ!G~5WMp}B20!}Re1hcvZ3$bGtRZkzc;RXNpnb;K*_mB8 z@6*M5yLEIOZa%Z)u>;$eRQ$ST{Y{i>rf%lpr$CCc@pwq)@_{@UHXsKdTL#F)?P!+y z9N%=Mpm*mp!h3P4NFtbjx6YB5rq90GYLI_u199*w>diK zvLC7$B_e#?y}xfS!sD%9qY`u&3$p#A%BbfE*llNiS37&hx5W z$b=sP1WY9X}1=~N&AD9^#AQB$)0v#upRwUeP zrxHB3<)$dp;nC9uDvn#8N5pqxSLiSNkmCBz&kwMB6rx7KWd#8j;_o z>9fimugUsSia5d?`gv2cp_kkd%#3<+W9}T1S>ser%lngnt$jr6-NyJKlO;6Ej@0=@H}8ZdSocP&jbT>chD3HQ{>yN zWR&}0(+I0##eBT&jS3>NU~X`O29f!8ag#wRdtxj03 zX?5!Iexa1pxR-IOIgwkC$iOI!b$|x;?O?mOZoAv(3!q2}Rx#EU^L6`Y$&{-~Zw|2> zNUX)|Iq&ty%G}y@VU(~&WagB!-&1+ti2SiEdup3J`)nX-5BQ|`p2Dyc$z^ZDus>B) z?dK>H`+82plrYML%}#xGhK5}E*7h~GM(wbENW)sW-l z>CO-JpaFzqt6|=%5P<^`n71>yz>g44o^b5_x1eN-+w{=6*%y7gz<+|om=t&UgpQux zFwKj*`Jo5`+S%g=w_lAy(7p%{4nT;3u*0!|Z6m})i?qhp#Q1mq(scxR;3ZRl#RDKT zfV<$p|H1jEjbJS3KcpBcY#{B~t7E;Y5Z*zSv7W4NVt4N5uS|^W_Sjn za2C^Brwf9AVaG5pao%jh7wF?35f`L?gPxe$CEP;H$I7xqO@3*{nNZ62mm`u!{6&c$ zHgY@-&5s|vLC6J&i3!MX^0emrmG}wKzBBtpEfI9sdA60O_@jsMm_%DS?zW5L@9#B) zGl)AvOr45~`i$<}zmK1sYM~~YTvYJq`1Cgs#G%DQ(33Ag(ZCN2@R-5aI#c0#ukzDZ z2O)7HgmN?J7R-S}osmcKG9U@~nhDhoZ8mnZkgXrFS0nAG<~~YGK1@y(Rl6bLidviQ V@PBWL`KBe7jHDvCOx!r|zW_Gicl`hW literal 0 HcmV?d00001 diff --git a/public/images/docs/diagrams/module_dependency_tree.dark.png b/public/images/docs/diagrams/module_dependency_tree.dark.png new file mode 100644 index 0000000000000000000000000000000000000000..e8a85f7c0e3c6b2810988303d450faddb9e93e0c GIT binary patch literal 16577 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

{text}

+ :

{text}

+} +``` + +```js InspirationGenerator.js +import * as React from 'react'; +import quotes from './quotes'; +import FancyText from './FancyText'; + +export default function InspirationGenerator({children}) { + const [index, setIndex] = React.useState(0); + const quote = quotes[index]; + const next = () => setIndex((index + 1) % quotes.length); + + return ( + <> +

Your inspirational quote is:

+ + + {children} + + ); +} +``` + +```js Copyright.js +export default function Copyright({year}) { + return

©️ {year}

; +} +``` + +```js quotes.js +export default [ + "Don’t let yesterday take up too much of today.” — Will Rogers", + "Ambition is putting a ladder against the sky.", + "A joy that's shared is a joy made double.", + ]; +``` + +```css +.fancy { + font-family: 'Georgia'; +} +.title { + color: #007AA3; + text-decoration: underline; +} +.cursive { + font-style: italic; +} +.small { + font-size: 10px; +} +``` + + + + + +React creates a UI tree made of components rendered, known as a render tree. + + + +From the example app, we can construct the above render tree. + +The tree is composed of nodes, each of which represents a component. `App`, `FancyText`, `Copyright`, to name a few, are all nodes in our tree. + +The root node in a React render tree is the [root component](/learn/importing-and-exporting-components#the-root-component-file) of the app. In this case, the root component is `App` and it is the first component React renders. Each arrow in the tree points from a parent component to a child component. + + + +#### Where are the HTML tags in the render tree? {/*where-are-the-html-elements-in-the-render-tree*/} + +You'll notice in the above render tree, there is no mention of the HTML tags that each component renders. This is because the render tree is only composed of React [components](learn/your-first-component#components-ui-building-blocks). + +React, as a UI framework, is platform agnostic. On react.dev, we showcase examples that render to the web, which uses HTML markup as its UI primitives. But a React app could just as likely render to a mobile or desktop platform, which may use different UI primitives like [UIView](https://developer.apple.com/documentation/uikit/uiview) or [FrameworkElement](https://learn.microsoft.com/en-us/dotnet/api/system.windows.frameworkelement?view=windowsdesktop-7.0). + +These platform UI primitives are not a part of React. React render trees can provide insight to our React app regardless of what platform your app renders to. + + + +A render tree represents a single render pass of a React application. With [conditional rendering](/learn/conditional-rendering), a parent component may render different children depending on the data passed. + +We can update the app to conditionally render either an inspirational quote or color. + + + +```js App.js +import FancyText from './FancyText'; +import InspirationGenerator from './InspirationGenerator'; +import Copyright from './Copyright'; + +export default function App() { + return ( + <> + + + + + + ); +} + +``` + +```js FancyText.js +export default function FancyText({title, text}) { + return title + ?

{text}

+ :

{text}

+} +``` + +```js Color.js +export default function Color({value}) { + return
+} +``` + +```js InspirationGenerator.js +import * as React from 'react'; +import inspirations from './inspirations'; +import FancyText from './FancyText'; +import Color from './Color'; + +export default function InspirationGenerator({children}) { + const [index, setIndex] = React.useState(0); + const inspiration = inspirations[index]; + const next = () => setIndex((index + 1) % inspirations.length); + + return ( + <> +

Your inspirational {inspiration.type} is:

+ {inspiration.type === 'quote' + ? + : } + + + {children} + + ); +} +``` + +```js Copyright.js +export default function Copyright({year}) { + return

©️ {year}

; +} +``` + +```js inspirations.js +export default [ + {type: 'quote', value: "Don’t let yesterday take up too much of today.” — Will Rogers"}, + {type: 'color', value: "#B73636"}, + {type: 'quote', value: "Ambition is putting a ladder against the sky."}, + {type: 'color', value: "#256266"}, + {type: 'quote', value: "A joy that's shared is a joy made double."}, + {type: 'color', value: "#F9F2B4"}, +]; +``` + +```css +.fancy { + font-family: 'Georgia'; +} +.title { + color: #007AA3; + text-decoration: underline; +} +.cursive { + font-style: italic; +} +.small { + font-size: 10px; +} +.colorbox { + height: 100px; + width: 100px; + margin: 8px; +} +``` + + + + +With conditional rendering, across different renders, the render tree may render different components. + + + +In this example, depending on what `inspiration.type` is, we may render `` or ``. The render tree may be different for each render pass. + +Although render trees may differ across render pases, these trees are generally helpful for identifying what the top-level and leaf components are in a React app. Top-level components are the components nearest to the root component and affect the rendering performance of all the components beneath them and often contain the most complexity. Leaf components are near the bottom of the tree and have no child components and are often frequently re-rendered. + +Identifying these categories of components are useful for understanding data flow and performance of your app. + +## The Module Dependency Tree {/*the-module-dependency-tree*/} + +Another relationship in a React app that can be modeled with a tree are an app's module dependencies. As we [break up our components](/learn/importing-and-exporting-components#exporting-and-importing-a-component) and logic into separate files, we create [JS modules](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Modules) where we may export components, functions, or constants. + +Each node in a module dependency tree is a module and each branch represents an `import` statement in that module. + +If we take the previous Inspirations app, we can build a module dependency tree, or dependency tree for short. + + + +The module dependency tree for the Inspirations app. + + + +The root node of the tree is the root module, also known as the entrypoint file. It often is the module that contains the root component. + +Comparing to the render tree of the same app, there are similar structures but some notable differences: + +* The nodes that make-up the tree represent modules, not components. +* Non-component modules, like `inspirations.js`, are also represented in this tree. The render tree only encapsulates components. +* `Copyright.js` appears under `App.js` but in the render tree, `Copyright`, the component, appears as a child of `InspirationGenerator`. This is because `InspirationGenerator` accepts JSX as [children props](/learn/passing-props-to-a-component#passing-jsx-as-children), so it renders `Copyright` as a child component but does not import the module. + +Dependency trees are useful to determine what modules are necessary to run your React app. When building a React app for production, there is typically a build step that will bundle all the necessary JavaScript to ship to the client. The tool responsible for this is called a [bundler](https://developer.mozilla.org/en-US/docs/Learn/Tools_and_testing/Understanding_client-side_tools/Overview#the_modern_tooling_ecosystem), and bundlers will use the dependency tree to determine what modules should be included. + +As your app grows, often the bundle size does too. Large bundle sizes are expensive for a client to download and run and delays the time for your UI to get drawn. Getting a sense of your app's dependency tree may help with debugging these issues. + +[comment]: <> (perhaps we should also deep dive on conditional imports) + + + +* Trees are a common way to represent the relationship between entities. They are often used to model UI. +* Render trees represent the nested relationship between React components across a single render. +* With conditional rendering, the render tree may change across different renders. With different prop values, components may render different children components. +* Render trees help identify what the top-level and leaf components are. Top-level components affect the rendering performance of all components beneath them and leaf components are often re-rendered frequently. Identifying them is useful for understanding and debugging rendering performance. +* Dependency trees represent the module dependencies in a React app. +* Dependency trees are used by build tools to bundle the necessary code to ship an app. +* Dependency trees are useful for debugging large bundle sizes that slow time to paint and expose opportunities for optimizing what code is bundled. + + + +[TODO]: <> (Add challenges) \ No newline at end of file diff --git a/src/sidebarLearn.json b/src/sidebarLearn.json index f462c696e8..02806dc0c9 100644 --- a/src/sidebarLearn.json +++ b/src/sidebarLearn.json @@ -86,6 +86,10 @@ { "title": "Keeping Components Pure", "path": "/learn/keeping-components-pure" + }, + { + "title": "Your UI as a Tree", + "path": "/learn/understanding-your-ui-as-a-tree" } ] }, From 235ba5be6479113e004080fae72919ce63f9e756 Mon Sep 17 00:00:00 2001 From: Yucohny <79147654+Yucohny@users.noreply.github.com> Date: Fri, 20 Oct 2023 10:00:16 +0800 Subject: [PATCH 2/3] fix: resolve conflicts --- src/content/learn/describing-the-ui.md | 15 --------------- 1 file changed, 15 deletions(-) diff --git a/src/content/learn/describing-the-ui.md b/src/content/learn/describing-the-ui.md index 98ba57e880..7b415ef7f4 100644 --- a/src/content/learn/describing-the-ui.md +++ b/src/content/learn/describing-the-ui.md @@ -15,7 +15,6 @@ React 是一个用于构建用户界面(UI)的 JavaScript 库,用户界面 -<<<<<<< HEAD * [如何创建你的第一个组件](/learn/your-first-component) * [在什么时候以及如何创建多文件组件](/learn/importing-and-exporting-components) * [如何使用 JSX 为 JavaScript 添加标签](/learn/writing-markup-with-jsx) @@ -24,17 +23,7 @@ React 是一个用于构建用户界面(UI)的 JavaScript 库,用户界面 * [如何有条件地渲染组件](/learn/conditional-rendering) * [如何在同一时间渲染多个组件](/learn/rendering-lists) * [如何通过保持组件的纯粹性来避免令人困惑的错误](/learn/keeping-components-pure) -======= -* [How to write your first React component](/learn/your-first-component) -* [When and how to create multi-component files](/learn/importing-and-exporting-components) -* [How to add markup to JavaScript with JSX](/learn/writing-markup-with-jsx) -* [How to use curly braces with JSX to access JavaScript functionality from your components](/learn/javascript-in-jsx-with-curly-braces) -* [How to configure components with props](/learn/passing-props-to-a-component) -* [How to conditionally render components](/learn/conditional-rendering) -* [How to render multiple components at a time](/learn/rendering-lists) -* [How to avoid confusing bugs by keeping components pure](/learn/keeping-components-pure) * [Why understanding your UI as trees is useful](/learn/understanding-your-ui-as-a-tree) ->>>>>>> 9af01e2bb2c6517c3ca14b551cdfa42424370a6e @@ -538,9 +527,6 @@ export default function TeaSet() { -<<<<<<< HEAD -## 下节预告 {/*whats-next*/} -======= ## Your UI as a tree {/*your-ui-as-a-tree*/} React uses trees to model the relationships between components and modules. @@ -565,7 +551,6 @@ Read **[Your UI as a Tree](/learn/understanding-your-ui-as-a-tree)** to learn ho ## What's next? {/*whats-next*/} ->>>>>>> 9af01e2bb2c6517c3ca14b551cdfa42424370a6e 请访问 [你的第一个组件](/learn/your-first-component) 这个章节并开始阅读! From cac4e07cb2296aec1a9ac4fb1406770a14bb7622 Mon Sep 17 00:00:00 2001 From: Yucohny <79147654+Yucohny@users.noreply.github.com> Date: Fri, 20 Oct 2023 10:05:02 +0800 Subject: [PATCH 3/3] fix: resolve conflicts --- .../learn/preserving-and-resetting-state.md | 37 +------------------ 1 file changed, 2 insertions(+), 35 deletions(-) diff --git a/src/content/learn/preserving-and-resetting-state.md b/src/content/learn/preserving-and-resetting-state.md index f6f9fc8dc2..4abba2dd14 100644 --- a/src/content/learn/preserving-and-resetting-state.md +++ b/src/content/learn/preserving-and-resetting-state.md @@ -14,34 +14,6 @@ translators: -<<<<<<< HEAD -* React 如何“处理”组件结构 -* React 何时选择保留或重置 state -* 如何强制 React 重置组件的 state -* key 和组件类型如何影响 state 是否被保留 - - - -## UI 树 {/*the-ui-tree*/} - -浏览器使用许多树形结构来为 UI 建立模型。[DOM](https://developer.mozilla.org/docs/Web/API/Document_Object_Model/Introduction) 用于表示 HTML 元素,[CSSOM](https://developer.mozilla.org/docs/Web/API/CSS_Object_Model) 则表示 CSS 元素。甚至还有 [Accessibility tree](https://developer.mozilla.org/docs/Glossary/Accessibility_tree)! - -React 也使用树形结构来对你创造的 UI 进行管理和建模。React 根据你的 JSX 生成 **UI 树**。React DOM 根据 UI 树去更新浏览器的 DOM 元素。(React Native 则将这些 UI 树转译成移动平台上特有的元素。) - - - - - -React 会根据组件创建了一棵 UI 树,React DOM 用它来渲染 DOM - - - - - -## state 与树中的某个位置相关联 {/*state-is-tied-to-a-position-in-the-tree*/} - -当你为一个组件添加 state 时,你可能会觉得 state “活”在组件内部。但实际上,state 被保存在 React 内部。根据组件在 UI 树中的位置,React 将它所持有的每个 state 与正确的组件关联起来。 -======= * When React chooses to preserve or reset the state * How to force React to reset component's state * How keys and types affect whether the state is preserved @@ -51,11 +23,10 @@ React 会根据组件创建了一棵 UI 树,React DOM 用它来渲染 DOM ## State is tied to a position in the render tree {/*state-is-tied-to-a-position-in-the-tree*/} React builds [render trees](learn/understanding-your-ui-as-a-tree#the-render-tree) for the component structure in your UI. ->>>>>>> 9af01e2bb2c6517c3ca14b551cdfa42424370a6e When you give a component state, you might think the state "lives" inside the component. But the state is actually held inside React. React associates each piece of state it's holding with the correct component by where that component sits in the render tree. -下面只定义了一个 `` JSX 标签,但将它渲染在了两个不同的位置: +Here, there is only one `` JSX tag, but it's rendered at two different positions: @@ -207,11 +178,7 @@ Updating state -<<<<<<< HEAD -只有当你在相同的位置渲染相同的组件时,React 才会一直保留着组件的 state。想要验证这一点,可以将两个计数器的值递增,取消勾选 “渲染第二个计数器” 复选框,然后再次勾选它: -======= -React will keep the state around for as long as you render the same component at the same position in the tree. To see this, increment both counters, then remove the second component by unchecking "Render the second counter" checkbox, and then add it back by ticking it again: ->>>>>>> 9af01e2bb2c6517c3ca14b551cdfa42424370a6e +只有当在树中相同的位置渲染相同的组件时,React 才会一直保留着组件的 state。想要验证这一点,可以将两个计数器的值递增,取消勾选 “渲染第二个计数器” 复选框,然后再次勾选它:

daQPb)- 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 bf7y793lHE(4v72?K)e)XRb(op-a`H#EsOza literal 0 HcmV?d00001 diff --git a/public/images/docs/diagrams/module_dependency_tree.png b/public/images/docs/diagrams/module_dependency_tree.png new file mode 100644 index 0000000000000000000000000000000000000000..0dcaaa7aa8bcd347f11216da35fe17a9e335b50e GIT binary patch literal 16977 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 lP0QV``+0HiuL_=dg{4Yrltz`fJ literal 0 HcmV?d00001 diff --git a/public/images/docs/diagrams/render_tree.dark.png b/public/images/docs/diagrams/render_tree.dark.png new file mode 100644 index 0000000000000000000000000000000000000000..117d7ff3e9792938b172c2961ab2de20dc5e46bc GIT binary patch literal 12030 zcmch72T+q;w=Rf)NKpg~O+aa)K%*{;J+H39gJbUf(?!2>i!e3~qQr={|NkBkAsrF1s zhk)QZh=Aalzzrh2=e@hg3SM1*uc)a=Ku{4)jx!_1+k`GUs!s??2beeU2AShCLl*)9 za+<3zAwhB~J>I$WLgSUPs-wo`|Jz4UN(E1#u4}xu{yQo4JJ`k*F))niAFilrSljq5 zr}`3&IRM+bR@O8`e1#^ZW%~t37=WyD3rqb!M)-Y5r&Os$a9 zbGd~jP96cUwk``B*PMdVq}1%BwD0#(H75AZ-gVW{(j~aP=eS@B4`5Rm6!@Bv=^y=~ z4CGL5ok3GZK*0A=O-b>U=k)d*rS6ObOScma_w{c@E5KcT7BX?Kjp- z_b&O;z=+yA(!{|u7N_TZw(6;0E!S}VF`NiV34$YDDYUWK&6$j-Db7}PH2^57D|(8r zmE2S_#Nd2Sy;4Bg8Ewh)bL`zD!BarjyM%NgMchs5ux)13#TKXmZ(N91Z0@JcHi8Z@ zQDGBwz_&`Dfcp_21%yp10}RPXyaMlII>*~z6{3)et&U%Qj!bzP&W;2UhT8HD^z}nK z^{LAv0ti`IjOkN>@)8QyNczOwUBy|K==hs%(DUBE%S97peElnMm7D-gOn`j?BUmNJ zUJHN_D!{%1|FYRY1XtC6**$>2s{b3|0WBMdLz_(^?6u522sW(8I0i^?IslDUhB3zh z3A_iON)G|6oJnpgA$-xCk+|8f6X@#Td za=RtfT4FWK;x zb*Uf2NmsL?gn$lC-&^Pf1VE5-jYgdPhi_oB;LDPM0XaSlGxqI9gpB2BRpUy=)o|G| z%$@%@+3%meQMT1c%PzE+co;Ke1@ra#F8k;{hya~?K5H!M?o%n&Zp5J~S)9@{&~Kau zL@4=BiC%T1B)iFD?Ms4OdrE2aT;BL^jdY;Hq?Cfk6?JublaJo~NfGOx)fM1j;Go^O z_Hb0eo6wM}%!aAL`6uj+OZv4ZFL=$@UPW`beRNa9&#U@O0>i+g$9%eCn6*9hkqV4= zRX69aObx>GB90(lm?}sE*Hva~t5D6!=pMi+ewZqk_G%#wHiJ-WY^w@vHWu$1sT5OC z>By()pFAb75(eoRb$MVEmmIFBL~cdHMAzd=#kD*O_ZkYdJhA0+N~u@FJt85~XhU@} zKaO?ADayah`xJx2HTsunYQxuYQUMUF&|c7=lr5s1cfPF~N*O&96Rd@!7P02Obc9!< z5yHwhjLMc$(D}m@4Fty4K{IN=k@;IuDRsTQul>A|IRE4mUgh1G1MWGlXIwbX(dIRt zpi$durw9RGEoya_onil((#fx3TIs;LORJyig8uPigjEp4VJ^PM;GLH%KWC~V?}*B$ z6|qUm8p2sT(Rov_=YtJ$TnaE(-Ly+*=Wls?v0cZMys z|EGsV8`X_O8vX$TfmPD>J@_dSynWTD|IQ;9K!}Z{X9nUII)xMn#*hl+UL_a!4QUXQ z0LjGyTLT)FcY_W@AS@?Rr)e0!N+(8EU^bZt57-}Hqbi~LNxOtBrO-yf!T;-k&N!)JLuzDB(*?jph80_rGCM~c`M@dZI zi%u;#&R1yHoKMoc(t+?qsKa?}~_Xfs+4Ztj?pNV<+st03m|TPdot0^Z;0i33G{ zwpTbJIgZ$*hd*TY+6jJP=Yn|i$ie3g(z8<}%IDRrOuV+#Yi%i=!Of$VXCLA(v$Za= zjnAJwB~)39C{A9!XHVYAk^rVDWLT`UZ{HHsdM&29#^v_?BI_vU<)NqGo(si3^pe_LAR^T^!ltk?JVf^BTHWblqI?4~u|EB7BHbP7;q7u} zOWCpXS8`AqIuCEzJoT6TVbhnY^S~Q;k{n2{6k+GaS`KbI;gF`FlDeXK^z%3^>gD+R z9{(!HSo1XPU9hg4)hpw3D~n^%E=gxdlhbsmzHKEpH6`%@8*{%5@OMG3Ef?uHTadn8 zg7Sm9dSx|b>zHU<{A;+B9$2`rn;G{#kLnNi;nt58d-v1q%%)9?UA-{sBijxJvww>)McicIygy#)l-ijT3ITzvf4#;)SJ0_zs2 zsqCHKb~31{P0&=YTNw7+Gp(|<==Jfcdl!v)phxS*dIo!sTWet43Iuw|?3rPUl=@`(#H1S71p9PAH^`!jxDEZxFXlLpJ zqFGHFENl&N6ho+(?AAhXN_LFz%L=!njJ{NoA#UmHb*@G%QPLGD-=KL!au3HZIKn@HvlV4B9YZcjb%KB5PJVJf1R%Fq$^Jn4>| z>SUB_u|?AfyL7uiUi0&T1veZg!SKrsk?95?2S_qt? zvG4qzhLqBK`j`*Sra@k2nTS~{JGThb=h|*ry}Ca+eSNwcEW7tT;ftHWg81q#Vuz7q>Y~D{Fid;IYdg}x6o-j zkM3_ap$nfZ)0+)%2XYyPl>2D!u=siY#OnN38qhn}5?(Y5Q;i(YqVY*wV)$MxyiUFg(t zT)%UdkfQ50JhtLqcerrV!X-_~SjjG|?vNl-wrw@FsN^1zb>Uh1MIo#HO$bpN_wB#L z^#uhK*?$mi;pZzh=o_0)&*l}HeXgQ>@{d~)fu3kt z+$YoBIi2L&tq4U=AsUAz)$1;Ut{f^iHUc$fq8ITN{2-s6Eh#Judw&+Q*iCfPGRr?g zF35|mk@hl(mAX%sDT<03K{OmqM6cTsO-kGM1a2m}<9L_2bMGog{X5sPWa#g;#(AMu z2#IO-KXT$*z^hikl{8g5p>9)>G5cHHM-k(V`v!OXlmw`?|4}y}ig@Ej;zw3$jh{6C zsB56x8YtqRf4Kfdc>@yopBV8Z*FkLmi4jlI2KY~mS6u%a;}sdi>wa#Wqv-U~i42AO z9&V3TT{51B_i8faWz)}1%EY~3wbC>p=~PKpUY-t6@=vOdvqb)+<&>}fz?jefu)#W0 zo-LSEmEP{#2!CI16IKe~zVJpb9j`6rOGm!-4tmHO2rTQ5?*3kiT4OxQ{xCs$-35q6 zzaYtncM_gId3rVp_BvVItoo5Gyrvz{)?6I-k<*_6RuBMeh582o0m@F_W{Wn4On)iv zZ}jSFvsgJ;Od`NSCtd+DYvEyw2w(?*&XEj;BZ82vx+aroudA~G^Y-mM)!zB~6{a!r zw?g&1p-DElpo&WF2L6GjO8?wNgdZAwmX3KFXIvwuF_}1S`r$_}<4Gke1k0eJkv>n| z3IzoM&FuaZUDtTf20#%*kdI+GlwT5RMNAuO&A^joljz(Q$VGp(S@{D}Y*(kK|8Sz} z=<9qjSapUJF-U9`k+`J3RtiCK#N31+KLNdHm7Rv)#2Gf&D~`^NymZLZecl(=sh$1q z4J1nrq`Be~P%2;JGNnbtdTFwP7{#=P0~uveV)laC#mT)KaSk6ee`*)MAYWB}Lv zRqUh1W$Iq0Hss=rgti@#T={i*!*;;vS8XvyUs%U$zqE+@U}72$M=cT^pOMORm@e-r zbpM%r^GsA_dmt`dbo+f=RhaoZKizzE&`3Cl8(EKO^YeI;auNL2uJY+Mm`HVv)suII zb$3!P_&lrG9bRqTnzeyskqj9x1vXUivJJyr@V|v~knp!gX;H{phg@JSH2TSX9Lt}5 zu(ik82pyjiV6Gp)Q0br=4}AaAhTJ1Y-&j;OJJ&Z4VmSW%v3 z9G#oXRpe59{iKo%v|7YdrY3s7rkEnRujsf|k9qd(+ihrhM)xan<#Dtlc=VB#0zyEut~a0@3~98`6*Yt`2M1^Hkt# zNCeGq_DF`YkYQo}ilf`cKEqo_&_fK)X)#JCPdYpIbsFeVGe`932Q`RMGW>ZlPniw~ za{2O7MHDLHHu8GQOO!#PN>3BN{J)%37S)MbJsGT2EJ~U6gXl~C%nb#dhA*>#T!$*V zo28b9=6~9!4M%M5akHS{txzo(?K!u*Pt(&;RPY!TIChLu7WN!!<=j|+QO?iKSrJKs z<|=KyXefR%S`GVi^4;(C&V|zM_3gfuK0m*f^|ouuy=8?=y%fE!DjAl~S+s7=z`GO_7 z@EBmMiGXiVT#fk2lao6-y;1lqcpcD63-V)TG*YsRwHW0Qh3L8Shd(Tzy%%v^M65$9 zA{r;x6+0tcMY{+mMVSR8HcE zYnzH?H@dLST`>9Dg}L7ihw*N7D6l!~U`tWsq`i5Cz^kMqcTacB2+T|YcowtMxnwrdTrK!gH6g?U;o zDphp*)#;v2n+b-i8~A*=u|b|8*U4XRJ?+`)M^=^ihGF=q*ebE)i0eOb{~7F*$4I`Wjocch~@xrrsOvY`f4 zm%n>Y=L{1BnFJJEQ4a>UG_l%YVG#wk8;H~yhh0B8@jqvv7|^i{gzOHDRV-*jKJmlF zI>c<|fz>?dweHp-B>a3>`x)sYN(dRx!1_T}O*+Fy-)yR%Ucy8>ly&|=K*KyE=xv&% z9i(vlrj*|CL|9M{sr4!N(MoG1@_y`*%~6zL*YybZzuI( z^q^%DqPN4w1nwdyl}w;(-?&XIrzaqWH55J>5kRk%2uV;p(5mDGY7LA5xvxgpc_Y8_ z)+7R14d&-~x`2b-fbmtyek#lZ`YJC?BG6c)kMsSE#*5{=F+NDl7b|PBG*&*Wk@9Nt zA(ZFR>&*&6X`{Vo_Yj(leA*XXyAd(}C2~#c572!H8~5a57eQAR4^HKkcjHt3wHtJZQCV8s#`;0 zH?-NzUur3(jz2u-3$Q}o8l2ag!Z*|o6$@sWoFIT#klW5e91EpO(N9s}$FOG;6PHHa zQ1kiKS@^g^B>9IXoZ%X zpbK+LjCh$aT&#Qs4}OlDC{hO3=d{}is9oOH`0?853DN#-_VcHf)!L5=^<5_ zqHJ6asO<<9-80F4ljIa0n748-B51mR?CTkaJaoIq{Pb(uT$5==U-k;ig^ZWz?c*4AotFG< z_}=aC@-pkeeFd>85~HbWpkp=L)*#5KA9epz}y&(;ld(7AQ(-$iQGJv&4+!D7R zz`05I?k;19x}(t>Fij}N&b7OVj=b;UOdJiy36}n{k~wQRm_UPD{t%UJn72HK^@ZWK z-nmMvCeA%`+y69dcP=+Oi^A&7KTU=m{kj;=mS|$33Y)}~r6s##7rPx#%sL&i8PDrs zCKn?wof>DB4VT`tb|Ee+ChCm8_*v9B!(c3P`wJ(IEn9^*p~%?Mz4L`MW1xRF?oxzt zRzlt>t%3qPea=vl-LB&`z|tJE#eUdi?1)8Q7dyYV_!XG4w5_(_Sek@ZhV?+t zxUb7S&VvL(3e%T<9do?az&-$-)KkSZ$w2fpu-C9UJfN@+aghB2?Hj>0@>O+Wijhv~ zL7u-50w8{p&xV)YmLT2(tp#1@CiGg7>-W5OyFd38UQ}|)QSsC1!W3W+^Spy%A@RUW z4pur{+4~?`U0FpnxnF=6vC*Fk@s|X6@plzZuWIKj?H&ML{9PBnn*C1hsVwR926hVf ztGt9e`~F~?-t69ZFC7Df%zk^feu&FSlx{Ek$BZHy&G3KOH@7H4c~X#6^ZoUOo`bD$ zhlt(&OF{@o3Agk!;&xVgje!`kMLV}TkqCt`Z*iV_K2BMQQ{GgI0k}p;dM~E)*N|;hna~Y-z|mC3VmJwIJZeytM>LU zV4%>MycF391K5yfbKeId)vqh%^|ck$a{8^d8w!L#C248wp=l+9z};q1N#@aH5iR$< z;CfHq)T5Duv9O@b zGxDI_YP;Cw8>niBWu#4VRjp)_+^f_AIOxp>As=7ww`WQl4=g$pqANAU{i=@i5Ded}F;kAeA$!5p|S5T6~rpVu`Tk zisR0{ISL->Kg+#Tg&E&wdYGw&6`H@1R17>Db#s`I-}!DgqIG1Et;>8(F3C=K)nC$g ze1AL3b3|-3gsZAa-YvLjU81R9uiSCkUc~F+Z*F`S0_uHem3Kr9N5sxskQ`4$d_-(w zw__Yfbkv+;v}+UjE~@pbHT~r_hLR7)E+ARMxZV0X@zc1YQ|6=S4y3)3qpP_{p7!t_`9Rkt{k=JU&fMfQ+#&K;-72D-pj`FJ>Z?r zGx#uJ@3CE7J<3g8?Qm=+%qu%%b$GVZ9k)IHAyY4#fzx>SBX`_EaChBWtX0Tz_sTw( zpU&-7RrBSMgx)w7NybazCR$JQi+S13jC&gMrf^r)L|o>x4aZ*MpW45mB8QlyVbc+_dyWOdw~;d->7;dAj_XurSq+fFSn^VMPQ?Br9` zv!yP~S_7%|&VKmp9&>bdD!<~%C*Ob#`;`3!W26dAe>>pYeOad^MUbOOIANYs1y^d%G}J2%|cWX^^w(EH7gR zAIljZLxH{PTaLa!zc%kP6%S_d!UDTS^2Y<6wY~Np(!RcM&jRrajnV%7t|v1;N9nAp zg|RxAz|Rp8w@;-=Y*5f@*UytA(_9()NpCrlKFZGxi(y6;sD9;taYMtbn6)gap4-uc zjgFtxBcz&QfQPIFy<^y{^tP=Zxvn&msDv3V_`CIb22msBCj2bpbk+0vEkEllZSRG`9msDT{<+Ea)biEkzU}$we zPQW_Z*k+W!gny&k__^KaREB(Ae+qC$>;<-oH0ps_S}%0na>f$K&v7foL-TQ;2@T6m z2xf+gmX!ZZZ+mt7c7yfC7ZWj1t!XCOj(0&iO!O!!eaT3IQH@sC)mslzec~&JG*|UF zP)^-m1Q3k-WhNh9nmil}^}`M*w{}$9wwk6P0r?tcl(EzPK-#S*?hS80(3ex)3;SAr zx*LPZEx(H#E`l?X6xaG#lv3Hmq`haRClMe{VS5PrNjcjY^OVpa!<>}3d@J2`P{35y z8zyl_Pig9QO!hT{ki<>nsgkbH8wii5M0)J*6SR8$0Mcu0pmMUr*%MaJPb3a(pjIZ- z^=3kCg82aMMM}?WctzmQN`oSiA;hZy@kKIEqVy~EPu!LIC+pRkn1HKrCU{@qD+T539xr>$cPL&k~N1VG)8}1;^sR?Cy*Z9TuO13%jB51}O_W>G{K?Wfb$3J;F*IvRPblMKNF*SK z-&c#6g#ty33;kmGH9;*8&0m-5jJg$@X|7d|L@V_kw9T^sz32h$!G*cA&+^*c<$3mb z5DC!g%(@JA59{m)1>!dkDC;0RhXFJo?;vJQf;_|F5WYYx-x*tRVG7UQsIrzg_b-P{ z=L;@SEgy(q-j7Eb;}nN=J}T$Hzlgnx2Z9zNu^~LbWMKBF5ho7TrkUiwwujnv!lL07 zd>LyI5JN8;$+HMTT@xXYN@o{hv$L~vX1SY^q_1pc&0pHn3Ht;fC8|F_>6_yp;tWt%Q`r zj7i3IhL)X9a(VnVqay?Eh=SgDcp7rKU{k{9>Ow2?UO$MY|hT8yQ2zAsk?1w zDL(k|MJ|z!mV%~-I_XGHV3StW9F&CF=O+?!&kL^N)NT;jlQDM zV<*M#Do>9r=GY7lG}~HqN{ylTQ$zXME(z+FV2m{x`z|W!1PpTmbO5dN3(B-y z1>iHc;q{hF$~P*L-hTU76!dI5xGbK{57h!I8srDU#Dv0BgRS9?!oCmm01*Wnl^-T0 za3eRYzfVWnKwrHsnEuQkZp9r!$Yt4oR%FTWCEzjK(HS>zgc!=Sxd|8f3CwvY(lgaH z?ia2ZYftC+i-iVhA{ni64+J=$zX|W_^_qJ#*X!r{Jw@?kZFS7kO_zZz?ZfD#`zG1G zQ{rWqjVY=)&ofd=PsyMTp6N&StU9>^NO`1gXdNi@`E=LiWpE4H>{Q{$2ZI%W6a-!K z?Wb*DlHWZ)s{l~ZDKI*ocrK!b{QLd zB00ex53(;V51`B7x?ehoQa4{wjT(&(0?Tn$bpqo)W978%Zm!ye#)gAF`tu($e;v;0 zj70YSMyV66d#H+5*bH9l<2(EIW1?HvIJUuEHv#nI^ux(o!fB^QnYj_J{qeN$+~bCd zSdcCJgwsf@xPM*(D~5A^W9@0Y9l|K)KJ?g={u3i0@m zJbc6UFv4gYbiuzOC(gOA!KiiPM?io2aMJ|&^F=7h3-$oV5-JT?>A1;p)<@IxzJ6kM zubn29>jl4nhx_a&Yi=hYai$CMGdSm$8 zArkD!Tfvn}G2r-597B>8NQE9Yar*Z&lK`ANHU`^^Upb?Bh9xKal8XEkS#aArro|xd}spN9Qr>QAyG)C<&p-A8SUO^(#qd z&cR9P=H0g((n|b#Y51XvU+rGe?Jfe4mlw$#;o_m7%i+TH`vkqP3g zN0AY#dngOL`|Q#ZsjIU)68+>lRC|E;l~d0iK2#}odPWu2C6uXLw)*jY#=bjzXr{~q z6;VN^K>!!&07lKOwhf8>vky$l@myOP!5VI#D;}Ys&lBMuqkk&S|n#x;=-M9s6 zW}E(!?qRz`^Lxh{!K_gicT`079`$L{&-_D1nv+~Xzuvmt+hz60P9PP$hmywKe1;u- z*vKHbY|R%x%QMX=4(y}WakBfgKU|25rLu6KFA*GX*#8W2-4ErUq~Q2C zosO!TnAq6Kl}=>TtePzY2h9!mqaWt}gFBDU+_yILsv#MBM8XA`nZ|zkggz$dDdSVre0(mnFSB0+i-RT5=ZMS!odSEK zI+(vDFUomlhp9_Pkc?IL08{ODWk}(zKyY9-ZNfObLBlY7kZ$h53HsIWx zd3SgW?3gw<`R*BKj+Z`4J)$r?h>ae41_o)whP+*&J;}`L#5DP=2?xg4>R@b=Q0$|` z)+WjjMn6K)Op=@cTG|&x)(SVD{bT)YDE=?je=U$v?ItOQ;SwA1SU_?|TqOyo;lAR{ z0z%O+Zt(Tzl|rOEnIvP(jm_Xu1_7r^eS>B~$}2~0>NkgP4o>^@(nNpT&E~eB8>A}K zHzYq0h-R*ruRX0*wEFXM2}yn-7f6Cnk7{AuPWI6?T31&^$^yyfx?{V;uKo|_TMr3& z0~lYppq%*^T#wy`eyx8hQwgGp%)W|J!LG1BHDkRbAiHWatC{rC_KJ@qfwe-v)AV;t zZLo8c`we{BE1HvOHQ(ZdHAVvQOk?Ox+_okYkC)F8Rq7RWDw=i8jJ$y1jeRu!AKL_K M%34aLPfUaU2Vi}{mjD0& literal 0 HcmV?d00001 diff --git a/public/images/docs/diagrams/render_tree.png b/public/images/docs/diagrams/render_tree.png new file mode 100644 index 0000000000000000000000000000000000000000..1ea750bb07c32e924981ff36725c337134347a3d GIT binary patch literal 12607 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 @@ -523,6 +524,29 @@ Read **[Keeping Components Pure](/learn/keeping-components-pure)** to learn how +## Your UI as a tree {/*your-ui-as-a-tree*/} + +React uses trees to model the relationships between components and modules. + +A React render tree is a representation of the parent and child relationship between components. + +An example React render tree. + +Components near the top of the tree, near the root component, are considered top-level components. Components with no child components are leaf components. This categorization of components is useful for understanding data flow and rendering performance. + +Modelling the relationship between JavaScript modules is another useful way to understand your app. We refer to it as a module dependency tree. + +An example module dependency tree. + +A dependency tree is often used by build tools to bundle all the relevant JavaScript code for the client to download and render. A large bundle size regresses user experience for React apps. Understanding the module dependency tree is helpful to debug such issues. + + + +Read **[Your UI as a Tree](/learn/understanding-your-ui-as-a-tree)** to learn how to create a render and module dependency trees for a React app and how they're useful mental models for improving user experience and performance. + + + + ## What's next? {/*whats-next*/} Head over to [Your First Component](/learn/your-first-component) to start reading this chapter page by page! diff --git a/src/content/learn/preserving-and-resetting-state.md b/src/content/learn/preserving-and-resetting-state.md index 1c9c341fba..709d9e3d33 100644 --- a/src/content/learn/preserving-and-resetting-state.md +++ b/src/content/learn/preserving-and-resetting-state.md @@ -10,33 +10,17 @@ State is isolated between components. React keeps track of which state belongs t -* How React "sees" component structures * When React chooses to preserve or reset the state * How to force React to reset component's state * How keys and types affect whether the state is preserved -## The UI tree {/*the-ui-tree*/} +## State is tied to a position in the render tree {/*state-is-tied-to-a-position-in-the-tree*/} -Browsers use many tree structures to model UI. The [DOM](https://developer.mozilla.org/docs/Web/API/Document_Object_Model/Introduction) represents HTML elements, the [CSSOM](https://developer.mozilla.org/docs/Web/API/CSS_Object_Model) does the same for CSS. There's even an [Accessibility tree](https://developer.mozilla.org/docs/Glossary/Accessibility_tree)! - -React also uses tree structures to manage and model the UI you make. React makes **UI trees** from your JSX. Then React DOM updates the browser DOM elements to match that UI tree. (React Native translates these trees into elements specific to mobile platforms.) - - - - - -From components, React creates a UI tree which React DOM uses to render the DOM - - - - - -## State is tied to a position in the tree {/*state-is-tied-to-a-position-in-the-tree*/} - -When you give a component state, you might think the state "lives" inside the component. But the state is actually held inside React. React associates each piece of state it's holding with the correct component by where that component sits in the UI tree. +React builds [render trees](learn/understanding-your-ui-as-a-tree#the-render-tree) for the component structure in your UI. +When you give a component state, you might think the state "lives" inside the component. But the state is actually held inside React. React associates each piece of state it's holding with the correct component by where that component sits in the render tree. Here, there is only one `` JSX tag, but it's rendered at two different positions: @@ -190,7 +174,7 @@ Updating state -React will keep the state around for as long as you render the same component at the same position. To see this, increment both counters, then remove the second component by unchecking "Render the second counter" checkbox, and then add it back by ticking it again: +React will keep the state around for as long as you render the same component at the same position in the tree. To see this, increment both counters, then remove the second component by unchecking "Render the second counter" checkbox, and then add it back by ticking it again: diff --git a/src/content/learn/understanding-your-ui-as-a-tree.md b/src/content/learn/understanding-your-ui-as-a-tree.md new file mode 100644 index 0000000000..948f857901 --- /dev/null +++ b/src/content/learn/understanding-your-ui-as-a-tree.md @@ -0,0 +1,299 @@ +--- +title: Understanding your UI as a Tree +--- + + + +Your React app is taking shape with many components being nested within each other. How does React keep track of your app's component structure? + +React, and many other UI libraries, model UI as a tree. Thinking of your app as a tree is useful for understanding the relationship between components to debug future concepts like performance and state management. + + + + + +* How React "sees" component structures +* What a render tree is and what it is useful for +* What a module dependency tree is and what it is useful for + + + +## Your UI as a tree {/*your-ui-as-a-tree*/} + +Trees are a relationship model between items and UI is often represented using tree structures. For example, browsers use tree structures to model HTML ([DOM](https://developer.mozilla.org/docs/Web/API/Document_Object_Model/Introduction)) and CSS ([CSSOM](https://developer.mozilla.org/docs/Web/API/CSS_Object_Model)). Mobile platforms also use trees to represent their view hierarchy. + + + +React creates a UI tree from your components. In this example, the UI tree is then used to render to the DOM. + + +Like browsers and mobile platforms, React also uses tree structures to manage and model the relationship between components in a React app. These trees are useful tools to understand how data flows through a React app and how to optimize rendering and app size. + +## The Render Tree {/*the-render-tree*/} + +A major feature of components is the ability to compose components of other components. As we [nest components](/learn/your-first-component#nesting-and-organizing-components), we have the concept of parent and child components, where each parent component may itself be a child of another component. + +When we render a React app, we can model this relationship in a tree, known as the render tree. + +Here is a React app that renders inspirational quotes. + + + +```js App.js +import FancyText from './FancyText'; +import InspirationGenerator from './InspirationGenerator'; +import Copyright from './Copyright'; + +export default function App() { + return ( + <> + + + + + + ); +} + +``` + +```js FancyText.js +export default function FancyText({title, text}) { + return title + ?