React Design Patterns and Best Practices Second Edition
React Design Patterns and Best Practices Second Edition
%HVW3UDFWLFHV
6HFRQG(GLWLRQ
&DUORV6DQWDQD5ROGáQ
%,50,1*+$0080%$,
mapt.io
:K\VXEVFULEH"
,!* `(!//`0%)!`(!.*%*#`* `)+.!`0%)!`+ %*#`3%0$`,.0%(`!++'/`* `% !+/
".+)`+2!.`;L777`%* 1/0.5`,.+"!//%+*(/
),.+2!`5+1.`(!.*%*#`3%0$`'%((`(*/`1%(0`!/,!%((5`"+.`5+1
!0``".!!`!++'`+.`2% !+`!2!.5`)+*0$
,0`%/`"1((5`/!.$(!
3DFNWFRP
% `5+1`'*+3`0$0`'0`+""!./`!++'`2!./%+*/`+"`!2!.5`++'`,1(%/$! L`3%0$``*
!1`"%(!/`2%((!O`+1`*`1,#. !`0+`0$!`!++'`2!./%+*`0`www.packt.com`* `/``,.%*0
++'`1/0+)!.L`5+1`.!`!*0%0(! `0+`` %/+1*0`+*`0$!`!++'`+,5K` !0`%*`0+1$`3%0$`1/`0
customercare@packtpub.com`"+.`)+.!` !0%(/K
0`www.packt.comL`5+1`*`(/+`.! ``+((!0%+*`+"`".!!`0!$*%(`.0%(!/L`/%#*`1,`"+.`
.*#!`+"`".!!`*!3/(!00!./L`* `.!!%2!`!4(1/%2!` %/+1*0/`* `+""!./`+*`'0`++'/`*
!++'/K`
5HDFW'HVLJQ3DWWHUQVDQG%HVW3UDFWLFHV
6HFRQG(GLWLRQ
+,5.%#$0`©`978@`'0`1(%/$%*#
2!.5`!""+.0`$/`!!*`) !`%*`0$!`,.!,.0%+*`+"`0$%/`++'`0+`!*/1.!`0$!`1.5`+"`0$!`%*"+.)0%+*`,.!/!*0! K
+3!2!.L`0$!`%*"+.)0%+*`+*0%*! `%*`0$%/`++'`%/`/+( `3%0$+10`3..*05L`!%0$!.`!4,.!//`+.`%),(%! K`!%0$!.`0$!
10$+.L`*+.`'0`1(%/$%*#`+.`%0/` !(!./`* ` %/0.%10+./L`3%((`!`$!( `(%(!`"+.`*5` )#!/`1/! `+.`((!#! `0+
$2!`!!*`1/! ` %.!0(5`+.`%* %.!0(5`5`0$%/`++'K
%./0`,1(%/$! M` *1.5`978>
!+* `! %0%+*M`.$`978@
.+ 10%+*`.!"!.!*!M`89@7:8@
1(%/$! `5`'0`1(%/$%*#`0 K
%2!.5`(!
:<`%2!.5`0.!!0
%.)%*#$)
:`9L` K
`@>?_8_>?@<:_78>_@
www.packtpub.com
&RQWULEXWRUV
$ERXWWKHDXWKRU
.(+/`*0*`+( á*`%/``/!*%+.`3!` !2!(+,!.`3%0$`)+.!`0$*`89`5!./`+"`!4,!.%!*!K
1..!*0(5L`$!`%/`3+.'%*#`/``!*%+.`!0`!2!(+,!.`0`%* + 5` *K` !`%/`0$!`"+1* !.`+"
!2` 10%+*L`+*!`+"`0$!`)+/0`,+,1(.` !2!(+,!.`+))1*%0%!/`%*`0%*`)!.%L`0.%*%*#
,!+,(!`%*`3!`0!$*+(+#%!/`/1$`/`!0L`+ !K&/L` .,$L`* ` 2.%,0`%*`#!*!.(K
$ERXWWKHUHYLHZHU
51.`**`%/``/!*%+.`/+"03.!`+*/1(0*0`3%0$`+2!.`87`5!./`+"`!4,!.%!*!K` !`$/
3+.'! `+*`2.%+1/`$%#$_2(1!`,.+&!0/`3%0$`%*0!.*0%+*(`(%!*0/`/1$`/`0$!`+.( `*'
* `0$!`*%0! `0%+*/L`* `,(5! ``'!5`.+(!`%*`.!0%*#`0$!`.$%0!01.!`+"`0$+/!`,.+&!0/
1/%*#`0$!`(0!/0`0!$*+(+#%!/L`%*(1 %*#`!0L`*#1(.L`+ !K&/L`+*#+L`,.%*#`++0L
%.!/!L`)6+*`!`!.2%!/L`* ` ++#(!`(+1 `(0"+.)K`51.`%/`0$!`+10$+.`+"
!.2!.(!//`!`,,(%0%+*/`3%0$`!0`* `%.!/!`5`'0`1(%/$%*#K` !`$+( /``)/0!.W/
!#.!!`%*`+),10!.`,,(%0%+*/`* `$/`0.%*! `(+0`+"`!*#%*!!.%*#`/01 !*0/`0$.+1#$`0!$
3+.'/$+,/K` *`$%/`".!!`0%)!L`$!`,(5/`0(!`0!**%/`* `.%'!0K
`3*0`0+`0$*'`)5`3%"!L`.K`1.*N`)5`,.!*0/L`.K`0%((`* `./K`%.)(N`)5`(%00(!
$%( L`$5!5N`* `0$!`.!/0`+"`)5`")%(5`"+.`0$!%.`2(1(!`/1,,+.0K`%0$+10`0$!%.`/1,,+.0L
0$!`.!2%!3`+"`0$%/`++'`3+1( `*+0`$2!`!!*`,+//%(!K` `3+1( `(/+`(%'!`0+`0$*'`0$!`'0
0!)`"+.`#%2%*#`)!`0$!`+,,+.01*%05`0+`.!2%!3`0$%/`++'K
3DFNWLVVHDUFKLQJIRUDXWKRUVOLNH\RX
"`5+1W.!`%*0!.!/0! `%*`!+)%*#`*`10$+.`"+.`'0L`,(!/!`2%/%0`authors.packtpub.com
* `,,(5`0+ 5K`!`$2!`3+.'! `3%0$`0$+1/* /`+"` !2!(+,!./`* `0!$`,.+"!//%+*(/L
&1/0`(%'!`5+1L`0+`$!(,`0$!)`/$.!`0$!%.`%*/%#$0`3%0$`0$!`#(+(`0!$`+))1*%05K`+1`*
)'!``#!*!.(`,,(%0%+*L`,,(5`"+.``/,!%"%`$+0`0+,%`0$0`3!`.!`.!.1%0%*#`*`10$+.
"+.L`+.`/1)%0`5+1.`+3*`% !K
7DEOHRI&RQWHQWV
3UHIDFH
6HFWLRQ+HOOR5HDFW
&KDSWHU7DNLQJ<RXU)LUVW6WHSVZLWK5HDFW
'HFODUDWLYHSURJUDPPLQJ
5HDFWHOHPHQWV
8QOHDUQLQJHYHU\WKLQJ
&RPPRQPLVFRQFHSWLRQV
6XPPDU\
&KDSWHU&OHDQ8S<RXU&RGH
-6;
%DEHO
+HOOR:RUOG
'20HOHPHQWVDQG5HDFWFRPSRQHQWV
3URSV
&KLOGUHQ
'LIIHUHQFHVZLWK+70/
$WWULEXWHV
6W\OH
5RRW
6SDFHV
%RROHDQDWWULEXWHV
6SUHDGDWWULEXWHV
-DYD6FULSWWHPSODWLQJ
&RPPRQSDWWHUQV
0XOWLOLQH
0XOWLSURSHUWLHV
&RQGLWLRQDOV
/RRSV
&RQWUROVWDWHPHQWV
6XEUHQGHULQJ
&RGHVW\OH
(GLWRU&RQILJ
&RQILJXULQJ(GLWRU&RQILJ
(6/LQW
,QVWDOODWLRQ
&RQILJXUDWLRQ
*LWKRRNV
5HDFWSOXJLQ
$LUEQE5HDFW-6;VW\OHJXLGH
(!`+"`+*0!*0/
7KHEDVLFVRIIXQFWLRQDOSURJUDPPLQJ
)LUVWFODVVREMHFWV
3XULW\
,PPXWDELOLW\
&XUU\LQJ
&RPSRVLWLRQ
)3DQGXVHULQWHUIDFHV
6XPPDU\
6HFWLRQ+RZ5HDFWZRUNV
&KDSWHU&UHDWLQJ7UXO\5HXVDEOH&RPSRQHQWV
&UHDWLQJFODVVHV
7KHFUHDWH&ODVVIDFWRU\
([WHQGLQJ5HDFW&RPSRQHQW
7KHPDLQGLIIHUHQFHV
3URSV
6WDWH
$XWRELQGLQJ
6WDWHOHVVFRPSRQHQWV
3URSVDQGFRQWH[W
7KHWKLVNH\ZRUG
6WDWH
/LIHF\FOH
5HIVDQGHYHQWKDQGOHUV
2SWLPL]DWLRQ
/D\RXWFRPSRQHQWV
7KHVWDWH
([WHUQDOOLEUDULHV
+RZLWZRUNV
$V\QFKURQRXV
8VLQJWKHVWDWH
'HULYDEOHV
7KHUHQGHUPHWKRG
5HDFWKRRNV
3URSW\SHV
5HDFW'RFJHQ
5HXVDEOHFRPSRQHQWV
)UDJPHQWV
6XPPDU\
&KDSWHU&RPSRVH$OOWKH7KLQJV
&RPPXQLFDWLRQEHWZHHQFRPSRQHQWV
&KLOGUHQ
7KHFRQWDLQHUDQGSUHVHQWDWLRQDOSDWWHUQ
0L[LQV
+LJKHURUGHUFRPSRQHQWV
S`%%`T
(!`+"`+*0!*0/
5HFRPSRVH
&RQWH[W
)XQFWLRQ$V&KLOG
6XPPDU\
&KDSWHU3URSHU'DWD)HWFKLQJ
'DWDIORZ
&KLOGSDUHQWFRPPXQLFDWLRQ FDOOEDFNV
&RPPRQSDUHQW
'DWDIHWFKLQJ
5HDFWUHIHWFK
&RQWH[W$3,
6XPPDU\
&KDSWHU:ULWH&RGHIRUWKH%URZVHU
)RUPV
8QFRQWUROOHGFRPSRQHQWV
&RQWUROOHGFRPSRQHQWV
-621VFKHPD
+DQGOLQJHYHQWV
5HIV
$QLPDWLRQV
5HDFWPRWLRQ
6FDODEOH9HFWRU*UDSKLFV
6XPPDU\
6HFWLRQ3HUIRUPDQFH,PSURYHPHQWVDQG
3URGXFWLRQ
&KDSWHU0DNH<RXU&RPSRQHQWV/RRN%HDXWLIXO
&66LQ-DYD6FULSW
,QOLQHVW\OHV
5DGLXP
&66PRGXOHV
:HESDFN
6HWWLQJXSDSURMHFW
/RFDOO\VFRSHG&66
$WRPLF&66PRGXOHV
5HDFW&66PRGXOHV
6W\OHGFRPSRQHQWV
6XPPDU\
&KDSWHU6HUYHU6LGH5HQGHULQJIRU)XQDQG3URILW
8QLYHUVDODSSOLFDWLRQV
5HDVRQVWRLPSOHPHQW665
S`%%%`T
(!`+"`+*0!*0/
6(2
$FRPPRQFRGHEDVH
%HWWHUSHUIRUPDQFH
'RQ WXQGHUHVWLPDWHWKHFRPSOH[LW\
$EDVLFH[DPSOH
$GDWDIHWFKLQJH[DPSOH
1H[WMV
6XPPDU\
&KDSWHU,PSURYHWKH3HUIRUPDQFHRI<RXU$SSOLFDWLRQV
5HFRQFLOLDWLRQ
.H\V
2SWLPL]DWLRQWHFKQLTXHV
VKRXOG&RPSRQHQW8SGDWH
6WDWHOHVVIXQFWLRQDOFRPSRQHQWV
&RPPRQVROXWLRQV
:K\GLG\RXXSGDWH"
&UHDWLQJIXQFWLRQVLQVLGHWKHUHQGHUPHWKRG
&RQVWDQWVSURSV
5HIDFWRULQJDQGJRRGGHVLJQ
7RROVDQGOLEUDULHV
,PPXWDELOLW\
%DEHOSOXJLQV
6XPPDU\
&KDSWHU$ERXW7HVWLQJDQG'HEXJJLQJ
7KHEHQHILWVRIWHVWLQJ
3DLQOHVV-DYD6FULSWWHVWLQJZLWK-HVW
7HVWLQJHYHQWV
5HDFW'HY7RROV
5HGX['HY7RROV
6XPPDU\
&KDSWHU5HDFW5RXWHU
,QVWDOODWLRQDQGFRQILJXUDWLRQ
&UHDWLQJRXUVHFWLRQV
$GGLQJSDUDPHWHUVWRWKHURXWHV
6XPPDU\
&KDSWHU$QWL3DWWHUQVWREH$YRLGHG
,QLWLDOL]LQJWKHVWDWHXVLQJSURSHUWLHV
0XWDWLQJWKHVWDWH
8VLQJLQGH[HVDVDNH\
6SUHDGLQJSURSHUWLHVRQ'20HOHPHQWV
6XPPDU\
S`%2`T
(!`+"`+*0!*0/
&KDSWHU'HSOR\LQJWR3URGXFWLRQ
&UHDWLQJRXUILUVW'LJLWDO2FHDQ'URSOHW
6LJQLQJXSWR'LJLWDO2FHDQ
&UHDWLQJRXUILUVW'URSOHW
,QVWDOOLQJ1RGHMV
&RQILJXULQJ*LWDQG*LW+XE
7XUQLQJRIIRXUGURSOHW
&RQILJXULQJQJLQ[30DQGDGRPDLQ
,QVWDOOLQJDQGFRQILJXULQJQJLQ[
6HWWLQJXSDUHYHUVHSUR[\VHUYHU
$GGLQJDGRPDLQWRRXUGURSOHW
,PSOHPHQWLQJ&LUFOH&,IRUFRQWLQXRXVLQWHJUDWLRQ
$GGLQJDQ66+NH\WR&LUFOH&,
&RQILJXULQJ&LUFOH&,
&UHDWLQJ(19YDULDEOHVLQ&LUFOH&,
6XPPDU\
&KDSWHU1H[W6WHSV
&RQWULEXWLQJWR5HDFW
'LVWULEXWLQJ\RXUFRGH
3XEOLVKLQJDQQSPSDFNDJH
6XPPDU\
2WKHU%RRNV<RX0D\(QMR\
,QGH[
S`2`T
.!"!
Chapter 4L`+),+/!`((`0$!`$%*#/L`!4,(%*/`$+3`0+`+),+/!`+1.`.!1/(!`+),+*!*0/`*
)'!`0$!)`+))1*%0!`!""!0%2!(5K`$!*L`3!`3%((`#+`0$.+1#$`/+)!`+"`0$!`)+/0`%*0!.!/0%*#
+),+/%0%+*`,00!.*/`%*`!0K`!`3%((`(/+`/!!`$+3`!0`0.%! `0+`/+(2!`0$!`,.+(!)`+"
/$.%*#`"1*0%+*(%0%!/`!03!!*`+),+*!*0/`3%0$`)%4%*/K`!W((`0$!*`(!.*`$+3`0+` !(`3%0$
0$!`+*0!40`3%0$+10`*!! %*#`0+`+1,(!`+1.`+),+*!*0/`0+`%0L`0$*'/`0+` +/K`%*((5L`3!W((
/!!`$+3`3!`*`+),+/!`+),+*!*0/` 5*)%((5`5`"+((+3%*#
0$!`FunctionAsChild`,00!.*K
Chapter 5L`.+,!.`0`!0$%*#L`#+!/`0$.+1#$`/+)!`+"`0$!`)+/0`+))+*`,00!.*/`0+`)'!`
$%( `* `,.!*0`+))1*%0!`1/%*#`(('/K`!W((`0$!*`(!.*`$+3`3!`+1( `1/!`
+))+*`,.!*0`0+`/$.!` 0`.+//`+),+*!*0/`0$0`.!`*+0` %.!0(5`+**!0! K`!`0$!*
/0.0`3%0$``/%),(!`+),+*!*0L`3$%$`3%((`!`(!`0+`(+ ` 0`".+)` %0 1L`* `3!`)'!
%0`.!1/(!`3%0$` +L`* `0$!*`#+`+*`0+`(!.*`$+3`3!`+1( `1/!`.!0_.!"!0$`0+`,,(5` 0
"!0$%*#`,00!.*/`0+`+1.`+),+*!*0/`* `2+% `.!%*2!*0%*#`0$!`3$!!(K`%*((5L`3!`(!.*
$+3`0+`1/!`0$!`*!3`+*0!40` K
S`9`T
.!"!
Chapter 11L`!0`+10!.L`(++'/`0`!.0%*`/0!,/`0$0`3%((`$!(,`1/`0+`%),(!)!*0`!0`+10!.
%*`+1.`,,(%0%+*K`+2%*#`$! L`/`3!`+),(!0!`!$`/!0%+*L`3!`3%((`!`(!`0+`
5*)%`.+10!/`* `1* !./0* `$+3`!40(5`!0`+10!.`3+.'/K`!`3%((`(!.*`$+3
0+`%*/0((`* `+*"%#1.!`!0`+10!.L`(+*#`3%0$` %*#``D3%0$E`+),+*!*0L`!40`,.+,L
* `,.)!0!./`0+`.+10!/K
S`:`T
3UHIDFH
$%/`++'`3%((`0'!`5+1`+*``&+1.*!5`0$.+1#$`0$!`)+/0`2(1(!` !/%#*`,00!.*/`%*`!0L
!)+*/0.0%*#`$+3`0+`,,(5` !/%#*`,00!.*/`* `!/0`,.0%!/`%*`.!(_(%"!`/%010%+*/K`$%/
++'`3%((`$!(,`)'!`5+1.`,,(%0%+*/`)+.!`"(!4%(!L`,!."+.)`!00!.L`* `3%((`)'!`0$!)
!/%!.`0+`)%*0%*L`3$%(!`#%2%*#`5+1.`3+.'"(+3``$1#!`++/0`5`%),.+2%*#`/,!! L`10
.1%((5`3%0$+10`""!0%*#`-1(%05K
!W((`!#%*`5`1* !./0* %*#`0$!`%*0!.*(/`+"`!0L`!"+.!`#. 1((5`)+2%*#`+*`0+`3.%0%*#
(!*`* `)%*0%*(!`+ !K`!W((`1%( `+),+*!*0/`0$0`.!`.!1/(!`.+//`0$!
,,(%0%+*L`/0.101.!`,,(%0%+*/L`* `.!0!`"+.)/`0$0`01((5`3+.'K`
!`3%((`0$!*`/05(!`!0`+),+*!*0/`* `+,0%)%6!`0$!)`0+`)'!`,,(%0%+*/`"/0!.`*
)+.!`.!/,+*/%2!K`%*((5L`3!W((`3.%0!`0!/0/`!""!0%2!(5L`* `5+1W((`(!.*`$+3`0+`+*0.%10!`0+
!0`* `%0/`!+/5/0!)K
5`0$!`!* `+"`0$!`++'L`5+1W((`!`/2! `".+)``(+0`+"`0.%(`* `!..+.`* ` !2!(+,)!*0(
$! $!/L`* `5+1`3%((`!`+*`0$!`.+ `0+`!+)%*#``!0`!4,!.0K
:KRWKLVERRNLVIRU
$!`++'`*`!`1/! `5`*5` !2!(+,!.`3$+`$/``/%`'*+3(! #!`+"`1%( %*#`3!
,,(%0%+*/K`$%/`%/`)%*(5`%)! `0` 2.%,0` !2!(+,!./L`10`*5`+0$!.`05,!`+"` !2/`3%((
!*!"%0`".+)`0$%/`++'K
:KDWWKLVERRNFRYHUV
Chapter 1L`'%*#`+1.`%./0`0!,/`3%0$`!0L`+2!./`/+)!`/%`+*!,0/`0$0`.!`%),+.0*0
"+.`"+((+3%*#`0$!`.!/0`+"`0$!`++'L`* `0$0`.!`.1%(`0+`3+.'%*#`3%0$`!0` %(5K`!`3%((
(!.*`$+3`0+`3.%0!` !(.0%2!`+ !L`* `3%((`#%*``(!.`1* !./0* %*#`+"`0$!` %""!.!*!
!03!!*`0$!`+),+*!*0/`3!`.!0!L`* `0$!`!(!)!*0/`!0`1/!/`0+` %/,(5`0$!%.`%*/0*!/
+*`0$!`/.!!*K`!W((`0$!*`(!.*`0$!`.!/+*/`!$%* `0$!`$+%!`+"`+_(+0%*#`(+#%`*
0!),(0!/`0+#!0$!.L`* `3$5`0$0`1*,+,1(.` !%/%+*`$/`!!*``%#`3%*`"+.`!0K`!`3%((
#+`0$.+1#$`0$!`.!/+*/`3$5`%0`%/`+))+*`0+`"!!(`"0%#1!`%*`0$!` 2.%,0`!+/5/0!)L`10
3!W((`(/+`/!!`$+3`0+`2+% `0$+/!`,.+(!)/`5`"+((+3%*#`*`%0!.0%2!`,,.+$K`%*((5L`3!
3%((`/!!`3$0`0$!`*!3`.!0!_.!0_,,` `%/L`* `3%0$`0$0L`3!W((`!`.! 5`0+`/0.0`3.%0%*#
/+)!`.!(`+ !K
.!"!
7RJHWWKHPRVWRXWRIWKLVERRN
+`)/0!.`!0L`5+1`*!! `0+`$2!``"1* )!*0(`'*+3(! #!`+"` 2.%,0`* `+ !K&/K
$%/`++'`%/`)+/0(5`0.#!0%*#`3!` !2!(+,!./L`* L`0`0$!`0%)!`+"`3.%0%*#L`0$!`"+((+3%*#
//1),0%+*/`3!.!`) !`+"`0$!`.! !.M
'RZQORDGWKHH[DPSOHFRGHILOHV
+1`*` +3*(+ `0$!`!4),(!`+ !`"%(!/`"+.`0$%/`++'`".+)`5+1.`+1*0`0
www.packt.comK` "`5+1`,1.$/! `0$%/`++'`!(/!3$!.!L`5+1`*`2%/%0
www.packt.com/support`* `.!#%/0!.`0+`$2!`0$!`"%(!/`!)%(! ` %.!0(5`0+`5+1K
8K +#`%*`+.`.!#%/0!.`0`www.packt.comK
9K !(!0`0$!``0K
:K (%'`+*`+ !`+3*(+ /`J`..0K
;K *0!.`0$!`*)!`+"`0$!`++'`%*`0$!`!.$`+4`* `"+((+3`0$!`+*/.!!*
%*/0.10%+*/K
%*\>_%,`"+.`%* +3/
%,!#\%%,\*.`"+.`
>_%,\!%,`"+.`%*14
S`;`T
.!"!
'RZQORDGWKHFRORULPDJHV
!`(/+`,.+2% !```"%(!`0$0`$/`+(+.`%)#!/`+"`0$!`/.!!*/$+0/\ %#.)/`1/! `%*`0$%/
++'K`+1`*` +3*(+ `%0`$!.!M`https:/b/bwww.bpacktpub.bcom/bsites/bdefault/bfiles/
downloads/b9781789530179_bColorImages.bpdfK
&RQYHQWLRQVXVHG
$!.!`.!``*1)!.`+"`0!40`+*2!*0%+*/`1/! `0$.+1#$+10`0$%/`++'K
`(+'`+"`+ !`%/`/!0`/`"+((+3/M
const Button = React.createClass({
getInitialState() {
return {
text: 'Click me!'
};
},
render() {
return <button>{this.state.text}</button>;
}
});
S`<`T
.!"!
*5`+))* _(%*!`%*,10`+.`+10,10`%/`3.%00!*`/`"+((+3/M
QSPLQVWDOOJFUHDWHUHDFWDSS
.*%*#/`+.`%),+.0*0`*+0!/`,,!.`(%'!`0$%/K
%,/`* `0.%'/`,,!.`(%'!`0$%/K
*HWLQWRXFK
!! '`".+)`+1.`.! !./`%/`(35/`3!(+)!K
..0M`(0$+1#$`3!`$2!`0'!*`!2!.5`.!`0+`!*/1.!`0$!`1.5`+"`+1.`+*0!*0L`)%/0'!/
+`$,,!*K` "`5+1`$2!`"+1* ``)%/0'!`%*`0$%/`++'L`3!`3+1( `!`#.0!"1(`%"`5+1`3+1(
.!,+.0`0$%/`0+`1/K`(!/!`2%/%0`www.packt.com/submit-errataL`/!(!0%*#`5+1.`++'L`(%'%*#
+*`0$!`..0`1)%//%+*`+.)`(%*'L`* `!*0!.%*#`0$!` !0%(/K
%.5M` "`5+1`+)!`.+//`*5`%((!#(`+,%!/`+"`+1.`3+.'/`%*`*5`"+.)`+*`0$!`%*0!.*!0L`3!
3+1( `!`#.0!"1(`%"`5+1`3+1( `,.+2% !`1/`3%0$`0$!`(+0%+*` .!//`+.`3!/%0!`*)!K
(!/!`+*00`1/`0`copyright@packt.com`3%0$``(%*'`0+`0$!`)0!.%(K
S`=`T
.!"!
5HYLHZV
(!/!`(!2!``.!2%!3K`*!`5+1`$2!`.! `* `1/! `0$%/`++'L`3$5`*+0`(!2!``.!2%!3`+*
0$!`/%0!`0$0`5+1`,1.$/! `%0`".+)O`+0!*0%(`.! !./`*`0$!*`/!!`* `1/!`5+1.`1*%/!
+,%*%+*`0+`)'!`,1.$/!` !%/%+*/L`3!`0`'0`*`1* !./0* `3$0`5+1`0$%*'`+10`+1.
,.+ 10/L`* `+1.`10$+./`*`/!!`5+1.`"!! '`+*`0$!%.`++'K`$*'`5+1P
+.`)+.!`%*"+.)0%+*`+10`'0L`,(!/!`2%/%0`packt.comK
S`>`T
6HFWLRQ+HOOR5HDFW
*`0$%/`/!0%+*L`3!`3%((`(!.*``+10`0$!`/%/`+"`!0`* `)+ !.*` 2.%,0`+*!,0/K`!
3%((`0$!*`)+2!`+*`0+`1* !./0* %*#`+*!,0/`%*(1 %*#` L`/,.! `00.%10!/L` 2.%,0
0!),(0%*#L`* `+))+*`,00!.*/`* `+ !`/05(!/K`%*((5L`3!`3%((`0'!``(++'`0`0$!`/%/
+"`"1*0%+*(`,.+#.))%*#K
$!`"+((+3%*#`$,0!./`3%((`!`+2!.! `%*`0$%/`/!0%+*M
Chapter 1L`'%*#`+1.`%./0`0!,/`3%0$`!0
Chapter 2L`(!*`,`+1.`+ !
7DNLQJ<RXU)LUVW6WHSVZLWK
5HDFW
!((+L`.! !./P
$%/`++'`//1)!/`0$0`5+1`(.! 5`'*+3`3$0`!0`%/`* `3$0`,.+(!)/`%0`*`/+(2!`"+.
5+1K`+1`)5`$2!`3.%00!*``/)((\)! %1)`,,(%0%+*`3%0$`!0L`* `5+1`3*0`0+
%),.+2!`5+1.`/'%((/`* `*/3!.`((`+"`5+1.`+,!*`-1!/0%+*/K`+1`/$+1( `'*+3`0$0`!0`%/
)%*0%*! `5` !2!(+,!./`0`!++'`* `$1* .! /`+"`+*0.%10+./`3%0$%*`0$!` 2.%,0
+))1*%05K`!0`%/`+*!`+"`0$!`)+/0`,+,1(.`(%..%!/`"+.`.!0%*#`1/!.`%*0!."!/L`* `%0`%/
3!((_'*+3*`0+`!`"/0L`0$*'/`0+`%0/`/).0`35`+"`0+1$%*#`0$!`+1)!*0`&!0
+ !(`QRK` 0`+)!/`3%0$` L``*!3`/5*04`0+`3.%0!`).'1,`%*` 2.%,0L`3$%$
.!-1%.!/`5+1`0+`$*#!`5+1.`)%* `.!#. %*#`0$!`/!,.0%+*`+"`+*!.*/K` 0`$/`)*5`++(
"!01.!/L`/1$`/`/!.2!._/% !`.!* !.%*#L`3$%$`#%2!/`5+1`0$!`,+3!.`0+`3.%0!`1*%2!./(
,,(%0%+*/K
+`"+((+3`0$%/`++'L`5+1`3%((`*!! `0+`'*+3`$+3`0+`1/!`0$!`0!.)%*(`0+`%*/0((`*
.1*`npm`,'#!/`%*`5+1.`+ !K&/`!*2%.+*)!*0K`((`0$!`!4),(!/`.!`3.%00!*`%*`)+ !.*
2.%,0L`3$%$`5+1`/$+1( `!`(!`0+`.! `* `1* !./0* K
*`0$%/`"%./0`$,0!.L`3!`3%((`#+`0$.+1#$`/+)!`/%`+*!,0/`0$0`.!`!//!*0%(`0+`)/0!.`%*
+. !.`0+`1/!`!0`!""!0%2!(5L`10`.!`/0.%#$0"+.3. `!*+1#$`"+.`!#%**!./`0+`"%#1.!`+10M
$!` %""!.!*!`!03!!*`%),!.0%2!`* ` !(.0%2!`,.+#.))%*#
!0`+),+*!*0/`* `0$!%.`%*/0*!/L`* `$+3`!0`1/!/`!(!)!*0/`0+`+*0.+(
0$!` `"(+3
+3`!0`$*#!/`0$!`35`3!`1%( `3!`,,(%0%+*/L`!*"+.%*#`` %""!.!*0
*!3`+*!,0`+"`/!,.0%+*`+"`+*!.*/L`* `0$!`.!/+*/`!$%* `%0/`1*,+,1(.
!/%#*`$+%!
$5`,!+,(!`"!!(`0$!` 2.%,0`"0%#1!L`* `3$0`5+1`*` +`0+`2+% `0$!`)+/0
+))+*`!..+./` !2!(+,!./`)'!`3$!*`,,.+$%*#`0$!`!0`!+/5/0!)
'%*#`+1.`%./0`0!,/`3%0$`!0 $,0!.`8
'HFODUDWLYHSURJUDPPLQJ
! %*#`0$!`!0` +1)!*00%+*`+.`(+#`,+/0/`+10`!0L`5+1`$2!`1* +10! (5`+)!
.+//`0$!`0!.)` !(.0%2!K`*!`+"`0$!`.!/+*/`3$5`!0`%/`/+`,+3!."1(`%/`!1/!`%0
!*"+.!/`` !(.0%2!`,.+#.))%*#`,. %#)K
+*/!-1!*0(5L`0+`)/0!.`!0L`%0`%/`!//!*0%(`0+`1* !./0* `3$0` !(.0%2!`,.+#.))%*#
)!*/`* `3$0`0$!`)%*` %""!.!*!/`!03!!*`%),!.0%2!`* ` !(.0%2!`,.+#.))%*#
.!K`$!`!/%!/0`35`0+`,,.+$`0$!`,.+(!)`%/`0+`0$%*'`+10`%),!.0%2!`,.+#.))%*#`/
`35`+"` !/.%%*#`$+3`0$%*#/`3+.'L`* ` !(.0%2!`,.+#.))%*#`/``35`+"` !/.%%*#
3$0`5+1`3*0`0+`$%!2!K
`.!(_(%"!`,.((!(`%*`0$!`%),!.0%2!`3+.( `3+1( `!`!*0!.%*#``.`"+.``!!.L`* `#%2%*#
0$!`"+((+3%*#`%*/0.10%+*/`0+`0$!`.0!* !.M
8K '!``#(//`".+)`0$!`/$!("K
9K 10`0$!`#(//`%*`".+*0`+"`0$!` ."0K
:K 1((` +3*`0$!`$* (!`1*0%(`0$!`#(//`%/`"1((K
;K //`)!`0$!`#(//K
*`0$!` !(.0%2!`3+.( L`5+1`3+1( `&1/0`/5M`!!.L`,(!/!K
$!` !(.0%2!`,,.+$`+"`/'%*#`"+.``!!.`//1)!/`0$0`0$!`.0!* !.`'*+3/`$+3`0+
/!.2!`+*!L`* `0$0`%/`*`%),+.0*0`/,!0`+"`0$!`35` !(.0%2!`,.+#.))%*#`3+.'/K
!0W/`)+2!`%*0+`` 2.%,0`!4),(!L`3.%0%*#``/%),(!`"1*0%+*`0$0L`#%2!*`*`..5`+"
1,,!./!`/0.%*#/L`.!01.*/`*`..5`3%0$`0$!`/)!`/0.%*#/`%*`(+3!./!M
WR/RZHU&DVH(['FOO', 'BAR']) > IRR EDU @
*`%),!.0%2!`"1*0%+*`0+`/+(2!`0$!`,.+(!)`3+1( `!`%),(!)!*0! `/`"+((+3/M
FRQVW toLowerCase = input => {
FRQVW output = [];
IRU (let i = 0; i < input.length; i++) {
output.SXVK(input[i].WR/RZHU&DVH());
}
UHWXUQ output;
};
%./0`+"`((L`*`!),05`..5`0+`+*0%*`0$!`.!/1(0`#!0/`.!0! K`$!*L`0$!`"1*0%+*`(++,/
0$.+1#$`((`0$!`!(!)!*0/`+"`0$!`%*,10`..5`* `,1/$!/`0$!`(+3!./!`2(1!/`%*0+`0$!`!),05
..5K`%*((5L`0$!`+10,10`..5`#!0/`.!01.*! K
S`87`T
'%*#`+1.`%./0`0!,/`3%0$`!0 $,0!.`8
` !(.0%2!`/+(10%+*`3+1( `!`/`"+((+3/M
FRQVW toLowerCase = input => input.PDS(value => value.WR/RZHU&DVH());
$!`%0!)/`+"`0$!`%*,10`..5`.!`,//! `0+``map`"1*0%+*`0$0`.!01.*/``*!3`..5
+*0%*%*#`0$!`(+3!./!`2(1!/K`$!.!`.!`/+)!`/%#*%"%*0` %""!.!*!/`0+`*+0!M`0$!`"+.)!.
!4),(!`%/`(!//`!(!#*0`* `%0`.!-1%.!/`)+.!`!""+.0`0+`!`1* !./0++ K`$!`(00!.`%/`0!./!.`*
!/%!.`0+`.! L`3$%$`)'!/``$1#!` %""!.!*!`%*`%#`+ !`/!/L`3$!.!`)%*0%*%(%05`%/
.1%(K
*+0$!.`/,!0`3+.0$`)!*0%+*%*#`%/`0$0L`%*`0$!` !(.0%2!`!4),(!L`0$!.!`%/`*+`*!! `0+`1/!
2.%(!/`*+.`0+`'!!,`0$!%.`2(1!/`1, 0! ` 1.%*#`0$!`!4!10%+*K`!(.0%2!`,.+#.))%*#
0!* /`0+`2+% `.!0%*#`* `)100%*#``/00!K
/``"%*(`!4),(!L`(!0W/`/!!`3$0`%0`)!*/`"+.`!0`0+`!` !(.0%2!K
$!`,.+(!)`3!`3%((`0.5`0+`/+(2!`%/``+))+*`0/'`%*`3!` !2!(+,)!*0M`/$+3%*#``),
3%0$``).'!.K
$!` 2.%,0`%),(!)!*00%+*`Q1/%*#`0$!` ++#(!`,/` R`%/`/`"+((+3/M
FRQVW map = QHZ google.maps.0DS(document.JHW(OHPHQW%\,G('map'), {
]RRP: 4,
FHQWHU: myLatLng
});
FRQVW marker = QHZ google.maps.0DUNHU({
SRVLWLRQ: myLatLng,
WLWOH: 'Hello World!'
});
marker.VHW0DS(map);
0`%/`%),!.0%2!`!1/!`((`0$!`%*/0.10%+*/`*!! ! `0+`.!0!`0$!`),L`* `.!0!`0$!`).'!.
* `00$`%0`0+`0$!`),L`.!` !/.%! `%*/% !`0$!`+ !`+*!`"0!.`0$!`+0$!.K
`!0`+),+*!*0`0+`/$+3``),`+*``,#!`3+1( `(++'`(%'!`0$%/`%*/0! M
*PDSV ]RRP={4} FHQWHU={myLatLng}!
0DUNHU SRVLWLRQ={myLatLng} WLWOH="Hello world!" !
*PDSV!
*` !(.0%2!`,.+#.))%*#L` !2!(+,!./`+*(5` !/.%!`3$0`0$!5`3*0`0+`$%!2!L`*
0$!.!W/`*+`*!! `0+`(%/0`((`0$!`/0!,/`0+`)'!`%0`3+.'K
$!`"0`0$0`!0`+""!./`` !(.0%2!`,,.+$`)'!/`%0`!/5`0+`1/!L`* `+*/!-1!*0(5L`0$!
.!/1(0%*#`+ !`%/`/%),(!L`3$%$`+"0!*`(! /`0+`"!3!.`1#/`* `)+.!`)%*0%*%(%05K
S`88`T
'%*#`+1.`%./0`0!,/`3%0$`!0 $,0!.`8
`!(!)!*0/`* `+),+*!*0/`*`!`*!/0! `3%0$`!$`+0$!.`/`"+((+3/L`0+`.!,.!/!*0`0$!
.!* !.`0.!!M
{
W\SH: Title,
SURSV: {
FRORU: 'red',
FKLOGUHQ: {
W\SH: 'h1',
SURSV: {
FKLOGUHQ: 'Hello, H1!'
}
}
}
}
$!*`0$!`05,!`+"`0$!`!(!)!*0`%/``"1*0%+*L`!0`((/`%0L`,//%*#`0$!`,.+,/`0+`#!0`'`0$!
1* !.(5%*#`!(!)!*0/K` 0`'!!,/`+*`,!."+.)%*#`0$!`/)!`+,!.0%+*`.!1./%2!(5`+*
0$!`.!/1(0`1*0%(`%0`#!0/``0.!!`+"``*+ !/`0$0`!0`*`.!* !.`+*`0$!`/.!!*K`$%/`,.+!//
%/`((! `.!+*%(%0%+*L`* `%0`%/`1/! `5`+0$`!0``* `!0`0%2!`0+`.!0!`0$!
1/!.`%*0!."!/`+"`0$!%.`.!/,!0%2!`,(0"+.)/K
8QOHDUQLQJHYHU\WKLQJ
/%*#`!0`"+.`0$!`"%./0`0%)!`1/1((5`.!-1%.!/`*`+,!*`)%* `!1/!`%0`%/``*!3`35`+"
!/%#*%*#`3!`* `)+%(!`,,(%0%+*/K`!0`0.%!/`0+`%**+20!`0$!`35`3!`1%( `1/!.
%*0!."!/`"+((+3%*#``,0$`0$0`.!'/`)+/0`+"`0$!`3!((_'*+3*`!/0`,.0%!/K
*`0$!`(/0`03+` ! !/L`3!`(!.*! `0$0`0$!`/!,.0%+*`+"`+*!.*/`%/`%),+.0*0L`* `3!
1/! `0+`0$%*'`+10`%0`.!#. %*#`/!,.0%*#`0$!`(+#%`".+)`0$!`0!),(0!/K`1.`#+(`$/
(35/`!!*`0+`3.%0!`0$!` 2.%,0`* `0$!` `%*` %""!.!*0`"%(!/K
.%+1/`0!),(0%*#`/+(10%+*/`$2!`!!*`.!0! `0+`$!(,` !2!(+,!./`$%!2!`0$%/K
$!`,.+(!)`%/`0$0L`)+/0`+"`0$!`0%)!L`0$0`'%* `+"`/!,.0%+*`%/`&1/0`*`%((1/%+*`* `0$!`0.10$
%/`0$0`0$!` 2.%,0`* `0$!` `.!`0%#$0(5`+1,(! L`*+`)00!.`3$!.!`0$!5`(%2!K
!0W/`/!!`*`!4),(!`+"``0!),(0!M
^^LWHPV``
^^ILUVW``
<li><strong>^^QDPH``</strong></li>
^^ILUVW``
^^OLQN``
S`8:`T
'%*#`+1.`%./0`0!,/`3%0$`!0 $,0!.`8
<li><a href="^^XUO``">^^QDPH``</a></li>
^^OLQN``
^^LWHPV``
$!`,.!! %*#`/*%,,!0`%/`0'!*`".+)`0$!`1/0$!`3!/%0!L`+*!`+"`0$!`)+/0`,+,1(.
0!),(0%*#`/5/0!)/K
$!`"%./0`.+3`0!((/`1/0$!`0+`(++,`0$.+1#$``+((!0%+*`+"`%0!)/K` */% !`0$!`(++,L`0$!.!`%/
/+)!`+* %0%+*(`(+#%`0+`$!'`3$!0$!.`0$!`#first`* `0$!`#link`,.+,!.0%!/`!4%/0L`* L
!,!* %*#`+*`0$!%.`2(1!/L`` %""!.!*0`,%!!`+"` `%/`.!* !.! K`.%(!/`.!`3.,,!
%*0+`1.(5`.!/K
"`5+1.`,,(%0%+*`$/`+*(5`0+` %/,(5`/+)!`2.%(!/L``0!),(0%*#`(%..5`+1( `.!,.!/!*0
`#++ `/+(10%+*L`10`3$!*`%0`+)!/`0+`/0.0%*#`0+`3+.'`3%0$`+),(!4` 0`/0.101.!/L`0$%*#/
$*#!K`!),(0%*#`/5/0!)/`* `0$!%.`+)%*_,!%"%`*#1#!`QR`+""!.``/1/!0`+"
"!01.!/L`* `0$!5`0.5`0+`,.+2% !`0$!`"1*0%+*(%0%!/`+"``.!(`,.+#.))%*#`(*#1#!
3%0$+10`.!$%*#`0$!`/)!`(!2!(`+"`+),(!0!*!//K
/`/$+3*`%*`0$!`!4),(!L`0!),(0!/`$%#$(5` !,!* `+*`0$!`)+ !(/`0$!5`.!!%2!`".+)`0$!
(+#%`(5!.`0+` %/,(5`0$!`%*"+.)0%+*K
*`0$!`+0$!.`$* L` 2.%,0`%*0!.0/`3%0$`0$!``!(!)!*0/`.!* !.! `5`0$!`0!),(0!/
0+`1, 0!`0$!` L`!2!*`%"`0$!5`.!`(+ ! `".+)`/!,.0!`"%(!/K`$!`/)!`,.+(!)`,,(%!/`0+
/05(!/`–`0$!5`.!` !"%*! `%*`` %""!.!*0`"%(!L`10`0$!5`.!`.!"!.!*! `%*`0$!`0!),(0!/L`* `0$!
`/!(!0+./`"+((+3`0$!`/0.101.!`+"`0$!`).'1,L`/+`%0`%/`()+/0`%),+//%(!`0+`$*#!`+*!
3%0$+10`.!'%*#`0$!`+0$!.L`3$%$`%/`0$!` !"%*%0%+*`+"`+1,(%*#K`$0`%/`3$5`0$!`(//%
/!,.0%+*`+"`+*!.*/`!* ! `1,`!%*#`)+.!``/!,.0%+*`+"`0!$*+(+#%!/L`3$%$`%/L`+"
+1./!L`*+0`` `0$%*#L`10`%0` +!/*W0`/+(2!`*5`.!(`,.+(!)/K
!0`0.%!/`0+`)+2!``/0!,`"+.3. `5`,100%*#`0$!`0!),(0!/`3$!.!`0$!5`!(+*#`–`*!40`0+`0$!
(+#%K`$!`.!/+*`%0` +!/`0$0`%/`!1/!`!0`/1##!/0/`5+1`+.#*%6!`5+1.`,,(%0%+*/`5
+),+/%*#`/)((`.%'/`((! `+),+*!*0/K`$!`".)!3+.'`/$+1( `*+0`0!((`5+1`$+3`0+
/!,.0!`0$!`+*!.*/L`!1/!`!2!.5`,,(%0%+*`$/`%0/`+3*L`* `+*(5`0$!` !2!(+,!./
/$+1( ` !% !`$+3`0+`(%)%0`0$!`+1* .%!/`+"`0$!%.`,,(%0%+*/K
$!`+),+*!*0_/! `,,.+$` ./0%((5`$*#!/`0$!`35`3!`3.%0!`3!`,,(%0%+*/L
3$%$`%/`3$5`0$!`(//%`+*!,0`+"`/!,.0%+*`+"`+*!.*/`%/`#. 1((5`!%*#`0'!*`+2!.`5
`)1$`)+.!`)+ !.*`/0.101.!K`$!`,. %#)`!*"+.! `5`!0`%/`*+0`*!3L`* `%0`3/`*+0
%*2!*0! `5`%0/`.!0+./L`10`!0`$/`+*0.%10! `0+`)'%*#`0$!`+*!,0`)%*/0.!)`* L
)+/0`%),+.0*0(5L`,+,1(.%6! `%0`%*`/1$``35`0$0`%/`!/%!.`0+`1* !./0* `"+.` !2!(+,!./
3%0$` %""!.!*0`(!2!(/`+"`!4,!.0%/!K
S`8;`T
'%*#`+1.`%./0`0!,/`3%0$`!0 $,0!.`8
$!`render`)!0$+ `+"``!0`+),+*!*0`(++'/`(%'!`0$%/M
UHQGHU() {
UHWXUQ (
EXWWRQ VW\OH={{ FRORU: 'red' }} RQ&OLFN={this.KDQGOH&OLFN}!
Click me!
EXWWRQ!
);
}
!`((`#.!!`0$0`%0`/!!)/``%0`3!%. `%*`0$!`!#%**%*#L`10`%0`%/`&1/0`!1/!`3!`.!`*+0`1/!
0+`0$0`'%* `+"`/5*04K`/`/++*`/`3!`(!.*`%0`* `3!`.!(%6!`$+3`,+3!."1(`%0`%/L`3!
1* !./0* `%0/`,+0!*0%(K`/%*#` 2.%,0`"+.`+0$`(+#%`* `0!),(0%*#`*+0`+*(5`$!(,/`1/
/!,.0!`+1.`+*!.*/`%*``!00!.`35L`10`%0`(/+`#%2!/`1/`)+.!`,+3!.`* `)+.!
!4,.!//%2%05L`3$%$`%/`3$0`3!`*!! `0+`1%( `+),(!4`1/!.`%*0!."!/K
$0`%/`3$5L`!2!*`%"`0$!`% !`+"`)%4%*#` 2.%,0`* ` `/+1* /`3!%. `%*`0$!
!#%**%*#L`%0`%/`2%0(`0+`#%2!`!0`"%2!`)%*10!/K`$!`!/0`35`0+`#!0`/0.0! `3%0$``*!3
0!$*+(+#5`%/`0+`0.5`%0`%*``/)((`/% !`,.+&!0`* `/!!`$+3`%0`#+!/K` *`#!*!.(L`0$!`.%#$0
,,.+$`%/`(35/`0+`!`.! 5`0+`1*(!.*`!2!.50$%*#`* `$*#!`5+1.`)%* /!0`%"`0$!`(+*#_
0!.)`!*!"%0/`.!`3+.0$`%0K
$!.!`%/`*+0$!.`+*!,0`0$0`%/`,.!005`+*0.+2!./%(`* `$. `0+`!,0L`* `0$0`0$!
!*#%*!!./`!$%* `!0`.!`0.5%*#`0+`,1/$`0+`0$!`+))1*%05M`)+2%*#`0$!`/05(%*#`(+#%
%*/% !`0$!`+),+*!*0L`0++K`$!`!* `#+(`%/`0+`!*,/1(0!`!2!.5`/%*#(!`0!$*+(+#5`1/! `0+
.!0!`+1.`+),+*!*0/`* `/!,.0!`0$!`+*!.*/`+. %*#`0+`0$!%.` +)%*`*
"1*0%+*(%0%!/K
!.!`%/`*`!4),(!`+"``/05(!`+&!0`0'!*`".+)`0$!`!0` +1)!*00%+*M
FRQVW divStyle = {
FRORU: 'white',
EDFNJURXQG,PDJH: `url(${imgUrl})`,
:HENLW7UDQVLWLRQ: 'all', QRWHWKHFDSLWDO : KHUH
PV7UDQVLWLRQ: 'all' PV LVWKHRQO\ORZHUFDVHYHQGRUSUHIL[
};
ReactDOM.UHQGHU(GLYVW\OH={divStyle}!Hello World!GLY!, mountNode);
$%/`/!0`+"`/+(10%+*/L`3$!.!` !2!(+,!./`1/!` 2.%,0`0+`3.%0!`0$!%.`/05(!/L`%/`'*+3*
/`#CSSinJSL`* `3!`3%((`0('`+10`%0`!40!*/%2!(5`%*`Chapter 7L`'!`+1.`+),+*!*0/
++'`!10%"1(K
S`8<`T
'%*#`+1.`%./0`0!,/`3%0$`!0 $,0!.`8
&RPPRQPLVFRQFHSWLRQV
$!.!`%/``,.!2%(%*#`+,%*%+*`0$0`!0`%/``2/0`/!0`+"`0!$*+(+#%!/`* `0++(/L`* `%"`5+1
3*0`0+`1/!`%0L`5+1`.!`"+.! `0+` !(`3%0$`,'#!`)*#!./L`0.*/,%(!./L`)+ 1(!`1* (!./L
* `*`%*"%*%0!`(%/0`+"` %""!.!*0`(%..%!/K`$%/`% !`%/`/+`3% !/,.! `* `/$.! `)+*#
,!+,(!`0$0`%0`$/`!!*`(!.(5` !"%*! L`* `$/`!!*`#%2!*`0$!`*)!` 2.%,0`"0%#1!K
0`%/`*+0`$. `0+`1* !./0* `0$!`.!/+*/`!$%* `0$%/K`((`0$!`.!,+/%0+.%!/`* `(%..%!/`%*`0$!
!0`!+/5/0!)`.!`) !`1/%*#`/$%*5`*!3`0!$*+(+#%!/L`0$!`(0!/0`2!./%+*`+"` 2.%,0L
* `0$!`)+/0` 2*! `0!$*%-1!/`* `,. %#)/K
+.!+2!.L`0$!.!`%/``)//%2!`*1)!.`+"`!0`+%(!.,(0!/`+*` %0 1L`!$`3%0$`0!*/`+"
!,!* !*%!/`0+`+""!.`/+(10%+*/`"+.`*5`,.+(!)/K` 0`%/`/0.%#$0"+.3. `0+`0$%*'`0$0`((`0$!/!
0++(/`.!`.!-1%.! `0+`/0.0`1/%*#`!0L`10`0$%/`%/`".`".+)`0$!`0.10$K`!/,%0!`0$%/`+))+*
35`+"`0$%*'%*#L`!0`%/``,.!005`0%*5`(%..5L`* `%0`*`!`1/! `%*/% !`*5`,#!`Q+.`!2!*
%*/% !`` % (!R`%*`0$!`/)!`35`!2!.5+*!`1/! `0+`1/!`&1!.5`+.`'+*!L`&1/0`5
%*(1 %*#`0$!`/.%,0`+*`0$!`,#!`!"+.!`0$!`(+/%*#`body`!(!)!*0K
$!.!`.!`03+`/.%,0/L`!1/!`!0`%/`/,(%0`%*0+`03+`,'#!/M
reactM` ),(!)!*0/`0$!`+.!`"!01.!/`+"`0$!`(%..5
react-domM`+*0%*/`((`0$!`.+3/!._.!(0! `"!01.!/
$!`.!/+*`!$%* `0$%/`%/`!1/!`0$!`+.!`,'#!`%/`1/! `0+`/1,,+.0` %""!.!*0`0.#!0/L`/1$
/`!0``%*`.+3/!./L`* `!0`0%2!`+*`)+%(!` !2%!/K`1**%*#
`!0`,,(%0%+*`%*/% !``/%*#(!` `,#!` +!/`*+0`.!-1%.!`*5`,'#!`)*#!.`+.
+),(!4`+,!.0%+*K`+1`*`&1/0` +3*(+ `0$!` %/0.%10%+*`1* (!`* `$+/0`%0`5+1./!("`Q+.
1/!`https:/b/bunpkg.bcom/bRL`* `5+1`.!`.! 5`0+`#!0`/0.0! `3%0$`!0`* `%0/`"!01.!/`%*`
"!3`)%*10!/K
!.!`.!`0$!`/`0+`!`%*(1 ! `%*`0$!` `0+`/0.0`1/%*#`!0M
https:/b/bunpkg.bcom/breact@16.b7.b0/bumd/breact.bproduction.bmin.bjs
https:/b/bunpkg.bcom/breact-bdom@16.b7.b0/bumd/breact-bdom.bproduction.bmin.bjs
"`3!` `0$!`+.!`!0`(%..5`+*(5L`3!`**+0`1/!` `!1/!`%0`%/`*+0``/0* .
(*#1#!`/1,,+.0! `5`0$!`.+3/!.N`10L`0$!`3$+(!`,+%*0`%/`0+`/0.0`3%0$`0$!`.!`)%*%)1)
/!0`+"`"!01.!/`* ` `)+.!`"1*0%+*(%0%!/`/`/++*`/`0$!5`.!`*!! ! K`+.``/%),(!` L`3!
+1( `&1/0`1/!`createElement`* L`+*(5`3$!*`3!`/0.0`1%( %*#`/+)!0$%*#`)+.!`+),(!4L
3!`*`%*(1 !``0.*/,%(!.`0+`!*(!` `* `+*2!.0`%0`%*0+` 2.%,0K`/`/++*`/`0$!`,,
#.+3/``%0`)+.!L`3!`)5`*!! ``.+10!.`0+`$* (!` %""!.!*0`,#!/`* `2%!3/L`* `3!`*
%*(1 !`0$0`/`3!((K
S`8=`T
'%*#`+1.`%./0`0!,/`3%0$`!0 $,0!.`8
0`/+)!`,+%*0L`3!`)5`3*0`0+`(+ ` 0`".+)`/+)!` `!* ,+%*0/L`* L`%"`0$!`,,(%0%+*
'!!,/`#.+3%*#L`3!`3%((`.!$`0$!`,+%*0`3$!.!`3!`*!! `/+)!`!40!.*(` !,!* !*%!/`0+
/0.0`+),(!4`+,!.0%+*/K`*(5`0`0$0`2!.5`)+)!*0`/$+1( `3!`%*0.+ 1!``,'#!
)*#!.K`$!*L`0$!`0%)!`3%((`+)!`0+`/,(%0`+1.`,,(%0%+*`%*0+`/!,.0!`)+ 1(!/`*
+.#*%6!`+1.`"%(!/`%*`0$!`.%#$0`35K`0`0$0`,+%*0L`3!`/$+1( `/0.0`0$%*'%*#`+10`1/%*#`
)+ 1(!`1* (!.K
+((+3%*#`0$%/`/%),(!`,,.+$L`0$!.!W/`*+`"0%#1!K`0.0%*#`3%0$``+%(!.,(0!`0$0`$/`+*!
$1* .! ` !,!* !*%!/`* `0!*/`+"`npm`,'#!/`+"`3$%$`3!`'*+3`*+0$%*#`%/`0$!`!/0`35
0+`#!0`(+/0K` 0`%/`%),+.0*0`0+`*+0!`0$0`!2!.5`,.+#.))%*#_.!(0! `&+
Q* `".+*0!* `!*#%*!!.%*#`%*`,.0%1(.R`.!-1%.!/`+*0%*1+1/`(!.*%*#K` 0`%/`0$!`*01.!`+"`0$!
3!`0+`!2+(2!`0``.!'*!'`,!`* `$*#!`+. %*#`0+`0$!`*!! /`+"`+0$`1/!./`*
!2!(+,!./K`$%/`%/`0$!`35`+1.`!*2%.+*)!*0`$/`3+.'! `/%*!`0$!`!#%**%*#L`* `%/`3$0
)'!/`%0`2!.5`!4%0%*#K
/`3!`#%*`!4,!.%!*!`3+.'%*#`+*`0$!`3!L`3!`(!.*`0$0`3!`**+0`)/0!.`!2!.50$%*#`*
3!`/$+1( `"%* `0$!`.%#$0`35`0+`'!!,`+1./!(2!/`1, 0! `0+`2+% `0$!`"0%#1!K`!`!+)!
(!`0+`"+((+3`((`0$!`*!3`0.!* /`3%0$+10`&1),%*#`%*0+`0$!`*!3`(%..%!/`"+.`0$!`/'!
+"`%0`1*(!//`3!`$2!`0%)!`"+.``/% !`,.+&!0K
0`%/`/0+*%/$%*#`$+3L`%*`0$!` 2.%,0`3+.( L`/`/++*`/``/,!%"%0%+*`%/`**+1*! `+.
."0! L`/+)!+*!`%*`0$!`+))1*%05`%),(!)!*0/`%0`/``0.*/,%(!.`,(1#%*`+.``,+(5"%((L`(!00%*#
!2!.5+*!`!(/!`,(5`3%0$`%0`3$%(!`0$!`.+3/!.`2!* +./`#.!!`* `/0.0`/1,,+.0%*#`%0K
$%/`%/`/+)!0$%*#`0$0`)'!/` 2.%,0`* `0$!`.+3/!.``+),(!0!(5` %""!.!*0
!*2%.+*)!*0`+),.! `0+`*5`+0$!.`(*#1#!`+.`,(0"+.)K`$!` +3*/% !`+"`%0`%/`0$0`0$%*#/
$*#!`2!.5`-1%'(5L`10`%0`%/`&1/0``)00!.`+"`"%* %*#`0$!`.%#$0`(*!`!03!!*`!00%*#`+*
*!3`0!$*+(+#%!/`2!./1/`/05%*#`/"!K
*`*5`/!L`!++'` !2!(+,!./`.!``(+0`+10`0$!`!2!(+,!.`4,!.%!*!`QRL`* `0$!5
(%/0!*`.!"1((5`0+`0$!`+))1*%05K`+L`!2!*`%"`%0`%/`*+0`0.1!`0$0`0+`1/!`!0`3!`.!`.!-1%.!
0+`(!.*`$1* .! /`+"` %""!.!*0`0++(/L`0$!5`.!(%6! `0$0`,!+,(!`3!.!`"!!(%*#`0$!`"0%#1!`*
0$!5`.!(!/! `` `0++(`0$0`)'!/`%0`%*.! %(5`!/5`0+`/""+( `* `.1*``.!(`!0
,,(%0%+*K
$!`+*(5`.!-1%.!)!*0`%/`0+`1/!``node.js/npm`!*2%.+*)!*0`* `%*/0((`0$!` `0++(
#(+((5`/`"+((+3/M
QSPLQVWDOOJFUHDWHUHDFWDSS
S`8>`T
'%*#`+1.`%./0`0!,/`3%0$`!0 $,0!.`8
$!*`0$!`!4!10(!`%/`%*/0((! L`3!`*`1/!`%0`0+`.!0!`+1.`,,(%0%+*`,//%*#``"+( !.
*)!M
FUHDWHUHDFWDSS KHOORZRUOG
%*((5L`3!`)+2!`%*0+`0$!`"+( !.`+"`+1.`,,(%0%+*`3%0$`cd hello-worldL`* `3!`&1/0`.1*
0$!`+))* M
QSPVWDUW
#%((5L`+1.`,,(%0%+*`%/`.1**%*#`3%0$``/%*#(!` !,!* !*5L`10`3%0$`((`0$!`"!01.!/
*!! ! `0+`1%( ``+),(!0!`!0`,,(%0%+*`1/%*#`0$!`)+/0` 2*! `0!$*%-1!/K`$!
"+((+3%*#`/.!!*/$+0`/$+3/`0$!` !"1(0`,#!`+"`*`,,(%0%+*`.!0! `3%0$`create-
react-appM
$%/`%/`0$!`*!3`2!./%+*`+"`create-react-app`Q29RL`3$%$`%*(1 !/`0$!
*!3`!(`>K
S`8?`T
'%*#`+1.`%./0`0!,/`3%0$`!0 $,0!.`8
6XPPDU\
*`0$%/`"%./0`$,0!.L`3!`$2!`(!.*! `/+)!`/%`+*!,0/`0$0`.!`2!.5`%),+.0*0`"+.
"+((+3%*#`0$!`.!/0`+"`0$!`++'L`* `0$0`.!`.1%(`0+`3+.'%*#`3%0$`!0` %(5K
!`*+3`'*+3`$+3`0+`3.%0!` !(.0%2!`+ !L`* `3!`$2!``(!.`1* !./0* %*#`+"`0$!
%""!.!*!`!03!!*`0$!`+),+*!*0/`3!`.!0!`* `0$!`!(!)!*0/`!0`1/!/`0+` %/,(5`0$!%.
%*/0*!/`+*`0$!`/.!!*K
!`(!.*! `0$!`.!/+*/`!$%* `0$!`$+%!`+"`(+0%*#`(+#%`* `0!),(0!/`0+#!0$!.L`* `3$5
0$0`1*,+,1(.` !%/%+*`$/`!!*``%#`3%*`"+.`!0K
!`3!*0`0$.+1#$`0$!`.!/+*/`3$5`%0`%/`+))+*`0+`"!!(`"0%#1!`%*`0$!` 2.%,0`!+/5/0!)L
10`3!`$2!`(/+`/!!*`$+3`0+`2+% `0$+/!`,.+(!)/`5`"+((+3%*#`*`%0!.0%2!`,,.+$K
%*((5L`3!`$2!`/!!*`3$0`0$!`*!3`create-react-app` `%/L`* `3!`.!`*+3`.! 5`0+
/0.0`3.%0%*#`/+)!`.!(`+ !K
S`8@`T
&OHDQ8S<RXU&RGH
$%/`$,0!.`//1)!/`0$0`5+1`(.! 5`$2!`!4,!.%!*!`3%0$` `* `5+1`3*0`0+`%),.+2!
5+1.`/'%((/`0+`1/!`%0`!""!0%2!(5K`+`1/!` `3%0$+10`*5`,.+(!)/`+.`1*!4,!0! `!$2%+./L
%0`%/`!//!*0%(`0+`1* !./0* `$+3`%0`3+.'/`1* !.`0$!`$++ L`* `0$!`.!/+*/`3$5`%0`%/``1/!"1(
0++(`"+.`1%( %*#` /K
1.`#+(`%/`0+`3.%0!`(!*`* `)%*0%*(!` `+ !L`* `0+`$%!2!`0$0`3!`$2!`0+`'*+3
3$!.!`%0`+)!/`".+)L`$+3`%0`#!0/`0.*/(0! `0+` 2.%,0L`* `3$%$`"!01.!/`%0`,.+2% !/K
*`0$!`"%./0`/!0%+*L`3!`3%((` +``(%00(!`/0!,`'L`10`,(!/!`!.`3%0$`)!`!1/!`%0`%/`.1%(
0+`)/0!.`0$!`/%/`0+`,,(5`0$!`!/0`,.0%!/K
*`0$%/`$,0!.L`3!`3%((`+2!.`0$!`"+((+3%*#`0+,%/M
$0`%/` L`* `3$5`/$+1( `3!`1/!`%0O
$0`%/`!(`* `$+3`*`3!`1/!`%0`0+`3.%0!`)+ !.*` 2.%,0`+ !O
$!`)%*`"!01.!/`+"` `* `0$!` %""!.!*!/`!03!!*` `* `
!/0`,.0%!/`0+`3.%0!` `%*`*`!(!#*0`* `)%*0%*(!`35
+3`(%*0%*#L`* `%*0`%*`,.0%1(.L`*`)'!`+1.` 2.%,0`+ !`+*/%/0!*0
.+//`,,(%0%+*/`* `0!)/
$!`/%/`+"`"1*0%+*(`,.+#.))%*#`* `3$5`"+((+3%*#``"1*0%+*(`,. %#)
3%((`)'!`1/`3.%0!`!00!.`!0`+),+*!*0/
-6;
*`0$!`,.!2%+1/`$,0!.L`3!`/3`$+3`!0`$*#!/`0$!`+*!,0`+"`/!,.0%+*`+"`+*!.*/L
)+2%*#`0$!`+1* .%!/`%*/% !`+),+*!*0/K`!`(/+`(!.*! `$+3`!0`1/!/`0$!`!(!)!*0/
.!01.*! `5`0$!`+),+*!*0/`0+` %/,(5`0$!` `+*`0$!`/.!!*K
!0W/`*+3`(++'`0`$+3`3!`*` !(.!`+1.`!(!)!*0/`%*/% !`+1.`+),+*!*0/K
(!*`,`+1.`+ ! $,0!.`9
!0`,.+2% !/`03+`35/`0+` !"%*!`+1.`!(!)!*0/K`$!`"%./0`+*!`%/`5`1/%*#` 2.%,0
"1*0%+*/L`* `0$!`/!+* `+*!`%/`5`1/%*#` L`*`+,0%+*(`_(%'!`/5*04K` !.!`%/`0$!
!4),(!/`/!0%+*`+"`0$!`+""%%(`!0K&/`3!/%0!`Qhttps:/b/breactjs.borg/b#examplesRM
+`!#%*`3%0$L` `%/`+*!`+"`0$!`)%*`.!/+*/`3$5`,!+,(!`"%(`0+`,,.+$`!0L`!1/!
(++'%*#`0`0$!`!4),(!/`+*`0$!`$+)!`,#!`* `/!!%*#` 2.%,0`)%4! `3%0$` `"+.`0$!
"%./0`0%)!`/!!)/`/0.*#!`0+`)+/0`+"`1/K
/`/++*`/`3!`#!0`1/! `0+`%0L`3!`.!(%6!`0$0`%0`%/`2!.5`+*2!*%!*0L`,.!%/!(5`!1/!`%0`%/
/%)%(.`0+` `* `(++'/`2!.5`")%(%.`0+`*5+*!`3$+`$/`(.! 5`.!0! ` /`+*`0$!
3!K`$!`+,!*%*#`* `(+/%*#`0#/`)'!`%0`!/%!.`0+`.!,.!/!*0`*!/0! `0.!!/`+"`!(!)!*0/L
/+)!0$%*#`0$0`3+1( `$2!`!!*`1*.! (!`* `$. `0+`)%*0%*`1/%*#`,(%*` 2.%,0K
%DEHO
+`1/!` `Q* `/+)!`"!01.!/`+"`=R`%*`+1.`+ !L`3!`$2!`0+`%*/0((`0$!`*!3`!(`>K
%./0`+"`((L`%0`%/`%),+.0*0`0+`(!.(5`1* !./0* `0$!`,.+(!)/`%0`*`/+(2!`"+.`1/`* `3$5
3!`*!! `0+` ``/0!,`0+`+1.`,.+!//K`$!`.!/+*`%/`0$0`3!`3*0`0+`1/!`"!01.!/`+"`0$!
(*#1#!`0$0`$2!`*+0`5!0`!!*` ! `%*`0$!`.+3/!.L`+1.`0.#!0`!*2%.+*)!*0K`$+/!
2*! `"!01.!/`)'!`+1.`+ !`(!*!.`"+.` !2!(+,!./L`10`0$!`.+3/!.`**+0
1* !./0* `* `!4!10!`%0K
$!`/+(10%+*`%/`0+`3.%0!`+1.`/.%,0/`%*` `* `=L`* L`3$!*`3!`.!`.! 5`0+`/$%,L`3!`
+),%(!`0$!`/+1.!/`%*0+`<L`0$!`/0* . `/,!%"%0%+*`%),(!)!*0! `%*`)&+.`.+3/!./
0+ 5K
S`98`T
(!*`,`+1.`+ ! $,0!.`9
!(`%/``,+,1(.` 2.%,0`+),%(!.`3% !(5` +,0! `3%0$%*
0$!`!0`+))1*%05K
!(`*`+),%(!`=`+ !`%*0+`<` 2.%,0L`/`3!((`/`+),%(!` `%*0+` 2.%,0
"1*0%+*/K`$!`,.+!//`%/`((! `0.*/,%(0%+*L`!1/!`%0`+),%(!/`0$!`/+1.!`%*0+``*!3
/+1.!`.0$!.`0$*`%*0+`*`!4!10(!K
*`+( !.`2!./%+*/`+"`!(`=KL`5+1`%*/0((! `0$!`babel-cli`,'#!`* `5+1`#+0`babel-
node`* `babel-core`*+3`!2!.50$%*#`%/`/!,.0! M
@babel/coreL`@babel/cliL`@babel/nodeL`* `/+`+*K
+`%*/0((`%0L`3!`*!! `0+`%*/0((`@babel/core`* `@babel/node`/`"+((+3/M
QSPLQVWDOOJ#EDEHOFRUH#EDEHOQRGH
"`5+1` +`*+0`3*0`0+`%*/0((`%0`#(+((5`Q !2!(+,!./`1/1((5`0!* `0+`2+% `0$%/RL`5+1`*
%*/0((`!(`(+((5`0+``,.+&!0`* `.1*`%0`0$.+1#$`*`npm`/.%,0L`10`"+.`0$%/`$,0!.L`
#(+(`%*/0*!`%/`"%*!K
$!*`0$!`%*/0((0%+*`%/`+),(!0!L`3!`*`.1*`0$!`"+((+3%*#`+))* `0+`+),%(!`*5
2.%,0`"%(!M
EDEHOVRXUFHMVRRXWSXWMV
*!`+"`0$!`.!/+*/`!(`%/`/+`,+3!."1(`%/`!1/!`%0`%/`$%#$(5`+*"%#1.(!K`!(`%/`&1/0`
0++(`0+`0.*/,%(!``/+1.!`"%(!`%*0+`*`+10,10`"%(!L`10`0+`,,(5`/+)!`0.*/"+.)0%+*/L`3!
*!! `0+`+*"%#1.!`%0K
1'%(5L`0$!.!`.!`/+)!`2!.5`1/!"1(`,.!/!0/`+"`+*"%#1.0%+*/`0$0`3!`*`!/%(5`%*/0((`*
1/!M
QSPLQVWDOOJ#EDEHOSUHVHWHQY#EDEHOSUHVHWUHDFW
*!`0$!`%*/0((0%+*`%/`+),(!0!L`3!`.!0!``+*"%#1.0%+*`"%(!`((! `.babelrc`%*`0$!`.++0
"+( !.L`* `,10`0$!`"+((+3%*#`(%*!/`%*0+`%0`0+`0!((`!(`0+`1/!`0$+/!`,.!/!0/M
{
"SUHVHWV": [
"@babel/preset-env",
"@babel/preset-react"
]
}
S`99`T
(!*`,`+1.`+ ! $,0!.`9
.+)`0$%/`,+%*0`+*L`3!`*`3.%0!`=`* ` `%*`+1.`/+1.!`"%(!/`* `!4!10!`0$!`+10,10`"%(!/
%*`0$!`.+3/!.K
+HOOR:RUOG
+3`0$0`+1.`!*2%.+*)!*0`$/`!!*`/!0`1,`0+`/1,,+.0` L`3!`*` %2!`%*0+`0$!`)+/0`/%
!4),(!M`#!*!.0%*#``div`!(!)!*0K
$%/`%/`$+3`5+1`3+1( `.!0!``div`!(!)!*0`3%0$`!0W/`createElement`"1*0%+*M
React.FUHDWH(OHPHQW('div')
* `0$%/`%/`0$!` `"+.`.!0%*#``div`!(!)!*0M
GLY!
0`(++'/`/%)%(.`0+`.!#1(.` K
$!`%#` %""!.!*!`%/`0$0`3!`.!`3.%0%*#`0$!`).'1,`%*/% !``.js`"%(!L`10`%0`%/`%),+.0*0`0+
*+0!`0$0` `%/`+*(5`/5*00%`/1#.L`* `%0`#!0/`0.*/,%(! `%*0+` 2.%,0`!"+.!`!%*#
!4!10! `%*`0$!`.+3/!.K`
*`"0L`+1.`<div />`!(!)!*0`%/`0.*/(0! `%*0+`React.createElement('div')`3$!*`3!
.1*`!(L`3$%$`%/`/+)!0$%*#`3!`/$+1( `(35/`'!!,`%*`)%* `3$!*`3!`3.%0!`+1.
0!),(0!/K
'20HOHPHQWVDQG5HDFWFRPSRQHQWV
%0$` L`3!`*`.!0!`+0$` `!(!)!*0/`* `!0`+),+*!*0/N`0$!`+*(5` %""!.!*!`%/
3$!0$!.`+.`*+0`0$!5`/0.0`3%0$``,%0(`(!00!.K
+.`!4),(!L`0+`.!* !.`*` `100+*L`3!`1/!`<button />L`3$%(!`0+`.!* !.
0$!`Button`+),+*!*0`3!`1/!`<Button />K
$!`"%./0`100+*`%/`0.*/,%(! `%*0+`0$!`"+((+3%*#M
React.FUHDWH(OHPHQW('button');
$!`/!+* `+*!`%/`0.*/,%(! `%*0+`0$!`"+((+3%*#M
React.FUHDWH(OHPHQW(Button);
S`9:`T
(!*`,`+1.`+ ! $,0!.`9
$!` %""!.!*!`$!.!`%/`0$0`%*`0$!`"%./0`((`3!`.!`,//%*#`0$!`05,!`+"`0$!``!(!)!*0`/`
/0.%*#L`3$%(!`%*`0$!`/!+* `((`3!`.!`,//%*#`0$!`+),+*!*0`%0/!("L`3$%$`)!*/`0$0`%0
/$+1( `!4%/0`%*`0$!`/+,!`0+`3+.'K
3URSV
`%/`2!.5`+*2!*%!*0`3$!*`5+1.``!(!)!*0/`+.`!0`+),+*!*0/`$2!`,.+,/K`/%*#
`%/`,.!005`!/5`0+`/!0`00.%10!/`+*`!(!)!*0/M
LPJ VUF="https://www.dev.education/images/logo.png" DOW="DEV
Education" !
&KLOGUHQ
`((+3/`5+1`0+` !"%*!`$%( .!*`0+` !/.%!`0$!`0.!!`+"`!(!)!*0/`* `+),+/!`+),(!4
/K
`/%`!4),(!`%/``(%*'`3%0$`0!40`%*/% !`%0L`/`"+((+3/M
DKUHI="https://dev.education"!Click me!D!
S`9;`T
(!*`,`+1.`+ ! $,0!.`9
$!` 2.%,0`!-1%2(!*0`%/`/`"+((+3/M
React.FUHDWH(OHPHQW(
"div",
QXOO,
React.FUHDWH(OHPHQW(
"a",
{ KUHI: "https://www.dev.education" },
"Click me!"
)
);
+` +`0$%/L`3!`$2!`0+`!*(+/!`0$!`!4,.!//%+*`3%0$%*`1.(5`.!/M
GLY!
Hello, {YDULDEOH}.
I'm a { ! console.ORJ('Function')}.
GLY!
$!`/)!`,,(%!/`0+`*+*_/0.%*#`00.%10!/L`/`"+((+3/M
D KUHI={this.FUHDWH/LQN()}!Click me!D!
'LIIHUHQFHVZLWK+70/
+`".L`3!`$2!`(++'! `0`0$!`/%)%(.%0%!/`!03!!*` `* ` K`!0W/`*+3`(++'`0`0$!
(%00(!` %""!.!*!/`!03!!*`0$!)`* `0$!`.!/+*/`0$!5`!4%/0K
S`9<`T
(!*`,`+1.`+ ! $,0!.`9
0XOWLOLQH
!0W/`/0.0`3%0$``2!.5`/%),(!`+*!K`/`/00! `,.!2%+1/(5L`+*!`+"`0$!`)%*`.!/+*/`3!`/$+1(
,.!"!.` `+2!.`!0W/`createElement`"1*0%+*`%/`!1/!`+"`%0/`_(%'!`/5*04L`*
!1/!`(*! `+,!*%*#`* `(+/%*#`0#/`.!`,!."!0`0+`.!,.!/!*0``0.!!`+"`*+ !/K
$%/`%/`,.!"!.(!`0+`0$!`"+((+3%*#M
GLY!+HDGHU!GLY!0DLQ content={...} !GLY!GLY!
(35/`.!)!)!.`0+`3.,`5+1.`!(!)!*0/`%*/% !`,.!*0$!/!/`3$!*`5+1`3.%0!`0$!)`%*
)1(0%,(!`(%*!/K` `(35/`#!0/`.!,(! `5`"1*0%+*/L`* `"1*0%+*/`3.%00!*`+*``*!3`(%*!
*`#%2!`5+1`*`1*!4,!0! `.!/1(0`!1/!`+"`10+)0%`/!)%+(+*`%*/!.0%+*K`1,,+/!L`"+.
!4),(!L`0$0`5+1`.!`.!01.*%*#` `".+)`5+1.`.!* !.`)!0$+ L`3$%$`%/`$+3`5+1`.!0!` /
%*`!0K
$!`"+((+3%*#`!4),(!`3+.'/`"%*!`!1/!`0$!`div`!(!)!*0`%/`+*`0$!`/)!`(%*!`/`0$!
.!01.*M
UHWXUQ <div />;
$!`"+((+3%*#L`$+3!2!.L`%/`*+0`.%#$0M
UHWXUQ
<div />;
S`:8`T
(!*`,`+1.`+ ! $,0!.`9
$!`.!/+*`"+.`0$%/`%/`!1/!`5+1`3+1( `0$!*`$2!`0$!`"+((+3%*#M
UHWXUQ
React.FUHDWH(OHPHQW("div", QXOO);
$%/`%/`3$5`5+1`$2!`0+`3.,`0$!`/00!)!*0`%*`,.!*0$!/!/L`/`"+((+3/M
UHWXUQ (
<div />
);
0XOWLSURSHUWLHV
`+))+*`,.+(!)`%*`3.%0%*#` `+)!/`3$!*`*`!(!)!*0`$/`)1(0%,(!/`00.%10!/K`*!
/+(10%+*`%/`0+`3.%0!`((`0$!`00.%10!/`+*`0$!`/)!`(%*!L`10`0$%/`3+1( `(! `0+`2!.5`(+*#`(%*!/
0$0`3!` +`*+0`3*0`%*`+1.`+ !`Q/!!`0$!`"+((+3%*#`/!0%+*`"+.`$+3`0+`!*"+.!`+ %*#`/05(!
#1% !/RK
`+))+*`/+(10%+*`%/`0+`3.%0!`!$`00.%10!`+*``*!3`(%*!L`3%0$`+*!`(!2!(`+"`%* !*00%+*L
* `0$!*`(%#*`0$!`(+/%*#`.'!0`3%0$`0$!`+,!*%*#`0#M
EXWWRQ
IRR="bar"
YHU\/RQJ3URSHUW\1DPH="baz"
RQ6RPHWKLQJ={this.KDQGOH6RPHWKLQJ}
!
&RQGLWLRQDOV
$%*#/`#!0`)+.!`%*0!.!/0%*#`3$!*`3!`/0.0`3+.'%*#`3%0$`+* %0%+*(/L`"+.`!4),(!L`%"`3!
3*0`0+`.!* !.`/+)!`+),+*!*0/`+*(5`3$!*`!.0%*`+* %0%+*/`.!`)0$! K`$!`"0`0$0
3!`*`1/!` 2.%,0`%*`+1.`+* %0%+*/`%/``%#`,(1/L`10`0$!.!`.!`)*5` %""!.!*0`35/`0+
!4,.!//`+* %0%+*/`%*` L`* `%0`%/`%),+.0*0`0+`1* !./0* `0$!`!*!"%0/`* `,.+(!)/`+"
!$`+*!`+"`0$!/!`0+`3.%0!`+ !`0$0`%/`+0$`.! (!`* `)%*0%*(!K
1,,+/!`3!`3*0`0+`/$+3``(+#+10`100+*`+*(5`%"`0$!`1/!.`%/`1..!*0(5`(+##! `%*0+`+1.
,,(%0%+*K
S`:9`T
(!*`,`+1.`+ ! $,0!.`9
`/%),(!`/*%,,!0`0+`/0.0`3%0$`%/`/`"+((+3/M
OHW button;
LI (isLoggedIn) {
button = /RJRXW%XWWRQ!;
}
UHWXUQ GLY!{button}GLY!;
$%/`3+.'/L`10`%0`%/`*+0`2!.5`.! (!L`!/,!%((5`%"`0$!.!`.!`)1(0%,(!`+),+*!*0/`*
)1(0%,(!`+* %0%+*/K
*` L`3!`*`1/!`*`%*(%*!`+* %0%+*M
GLY!
{LV/RJJHG,Q && /RJLQ%XWWRQ!}
GLY!
LI (isLoggedIn) {
button = /RJRXW%XWWRQ!;
} HOVH {
button = /RJLQ%XWWRQ!;
}
UHWXUQ GLY!{button}GLY!;
S`::`T
(!*`,`+1.`+ ! $,0!.`9
"`5+1` +`*+0`(%'!`1/%*#`"1*0%+*/L`5+1`*`1/!`*`+&!0W/`#!00!./L`3$%$`)'!/`0$!`+ !
)+.!`!(!#*0K
S`:;`T
(!*`,`+1.`+ ! $,0!.`9
UHWXUQ (
GLY!
{this.canShowSecretData() && 6HFUHW'DWD!}
GLY!
);
$!`/)!`,,(%!/`0+`+),10! `,.+,!.0%!/K`1,,+/!`5+1`$2!`03+`/%*#(!`,.+,!.0%!/`"+.
1..!*5`* `2(1!K` */0! `+"`.!0%*#`0$!`,.%!`/0.%*#`%*/% !`5+1.`render`)!0$+ L`5+1
*`.!0!``(//`"1*0%+*M
JHW3ULFH() {
UHWXUQ C${this.props.FXUUHQF\}${this.props.YDOXH}C;
}
UHWXUQ GLY!{this.JHW3ULFH()}GLY!;
(0!.*0%2!(5L`5+1`*`#+``/0!,`"1.0$!.`* L`/`3!`$2!`&1/0`/!!*L`1/!`#!00!./M
JHWprice() {
UHWXUQ C${this.props.FXUUHQF\}${this.props.YDOXH}C;
}
UHWXUQ GLY!{this.SULFH()}GLY!;
$!`"%./0`/+(10%+*`%/`render-ifL`3$%$`3!`*`%*/0((`3%0$`0$!`"+((+3%*#M
QSPLQVWDOOVDYHUHQGHULI
!`*`0$!*`!/%(5`1/!`%0`%*`+1.`,.+&!0/L`/`"+((+3/M
FRQVW { dataIsReady, isAdmin, userHasPermissions } = this.SURSV;
S`:<`T
(!*`,`+1.`+ ! $,0!.`9
+`1/!`0$!`(%..5L`3!`*!! `0+`%*/0((`%0`/`"+((+3/M
QSPLQVWDOOVDYHUHDFWRQO\LI
*!`%0`%/`%*/0((! L`3!`*`1/!`%0`%*`+1.`,,/`%*`0$!`"+((+3%*#`35M
LPSRUW onlyIf IURP 'react-only-if';
UHWXUQ (
GLY!
6HFUHW'DWD2QO\,I
GDWD,V5HDG\={...}
LV$GPLQ={...}
XVHU+DV3HUPLVVLRQV={...}
!
GLY!
);
/`5+1`*`/!!`$!.!L`0$!.!`%/`*+`(+#%`0`((`%*/% !`0$!`+),+*!*0`%0/!("K
S`:=`T
(!*`,`+1.`+ ! $,0!.`9
/RRSV
`2!.5`+))+*`+,!.0%+*`%*` ` !2!(+,)!*0`%/`0+` %/,(5`(%/0/`+"`%0!)/K`$!*`%0`+)!/`0+`
/$+3%*#`(%/0/L`1/%*#` 2.%,0`/``0!),(0!`(*#1#!`%/``2!.5`#++ `% !K
&RQWUROVWDWHPHQWV
+* %0%+*(/`* `(++,/`.!`2!.5`+))+*`+,!.0%+*/`%*` `0!),(0!/L`* `5+1`)5`"!!(
3.+*#`1/%*#`0$!` 2.%,0`0!.*.5`+.`0$!`),`"1*0%+*`0+`,!."+.)`0$!)K` `$/`!!*`1%(0
%*`/1$``35`0$0`%0`+*(5`/0.0/`0$!`.!0%+*`+"`0$!`!(!)!*0/L`(!2%*#`0$!`(+#%`,.0/`0+
.!(` 2.%,0L`3$%$`%/`#.!0`!4!,0`0$0L`/+)!0%)!/L`0$!`+ !`!+)!/`(!//`(!.K
*`#!*!.(L`3!`%)`0+`.!)+2!`((`0$!`(+#%`".+)`+1.`+),+*!*0/L`* `!/,!%((5`".+)`+1.
.!* !.`)!0$+ /L`10`/+)!0%)!/`3!`$2!`0+`/$+3`* `$% !`!(!)!*0/`+. %*#`0+`0$!`/00!
+"`0$!`,,(%0%+*L`* `2!.5`+"0!*`3!`$2!`0+`(++,`0$.+1#$`+((!0%+*/`* `..5/K
S`:>`T
(!*`,`+1.`+ ! $,0!.`9
$%/`"+((+3/`0$!`/)!`,$%(+/+,$5`/` L`* `%0` +!/`*+0` `*5`.!(`"1*0%+*(%05`0+`0$!
(*#1#!N`%0`%/`&1/0`/5*00%`/1#.`0$0`#!0/`+),%(! `%*0+` 2.%,0K
!0W/`/!!`$+3`%0`3+.'/K
%./0`+"`((L`3!`$2!`0+`%*/0((`%0M
QSPLQVWDOOVDYHMV[FRQWUROVWDWHPHQWV
*!`%0`%/`%*/0((! L`3!`$2!`0+` `%0`0+`0$!`(%/0`+"`+1.`!(`,(1#%*/`%*`+1.`.babelrc`"%(!M
"SOXJLQV": ["jsx-control-statements"]
.+)`*+3`+*`3!`*`1/!`0$!`/5*04`,.+2% ! `5`0$!`,(1#%*`* `!(`3%((`0.*/,%(!`%0
0+#!0$!.`3%0$`0$!`+))+*` `/5*04K
`+* %0%+*(`/00!)!*0`3.%00!*`1/%*#`0$!`,(1#%*`(++'/`(%'!`0$!`"+((+3%*#`/*%,,!0M
,I condition={this.FDQ6KRZ6HFUHW'DWD}>
6HFUHW'DWD!
,I!
$%/`#!0/`0.*/,%(! `%*0+``0!.*.5`!4,.!//%+*`/`"+((+3/M
{FDQ6KRZ6HFUHW'DWD 6HFUHW'DWD! : QXOO}
$!`If`+),+*!*0`%/`#.!0L`10`%"L`"+.`/+)!`.!/+*L`5+1`$2!`*!/0! `+* %0%+*/`%*`5+1.
.!* !.`)!0$+ L`%0`*`!/%(5`!+)!`)!//5`* `$. `0+`"+((+3K` !.!`%/`3$!.!
0$!`Choose`+),+*!*0`+)!/`%*`$* 5M
&KRRVH!
:KHQ condition={...}!
VSDQ!ifVSDQ!
:KHQ!
:KHQ condition={...}!
VSDQ!else ifVSDQ!
:KHQ!
2WKHUZLVH!
VSDQ!elseVSDQ!
2WKHUZLVH!
&KRRVH!
(!/!`*+0!`0$0`0$!`,.!! %*#`+ !`#!0/`0.*/,%(! `%*0+`)1(0%,(!`0!.*.%!/K
S`:?`T
(!*`,`+1.`+ ! $,0!.`9
%*((5L`0$!.!`%/``+),+*!*0`Q(35/`.!)!)!.`0$0`3!`.!`*+0`0('%*#`+10`.!(
+),+*!*0/`10`&1/0`/5*00%`/1#.R`0+`)*#!`0$!`(++,/`0$0`.!`(/+`2!.5`+*2!*%!*0M
XO!
)RU HDFK="user" RI={this.props.users}!
OL!{user.name}OL!
)RU!
XO!
$!`,.!! %*#`+ !`#!0/`0.*/,%(! `%*0+``),`"1*0%+*`–`*+`)#%`0$!.!K
"`5+1`.!`1/! `0+`1/%*#`(%*0!./L`5+1`)%#$0`3+* !.`3$5`0$!`(%*0!.`%/`*+0`+),(%*%*#`+10
0$0`+ !K`$!`user`2.%(!` +!/`*+0`!4%/0`!"+.!`0$!`0.*/,%(0%+*L`*+.`%/`%0`3.,,! `%*0+`
"1*0%+*K`+`2+% `0$+/!`(%*0%*#`!..+./L`0$!.!`%/`*+0$!.`,(1#%*`0+`%*/0((M`eslint-plugin-
jsx-control-statementsK
"`5+1` % `*+0`1* !./0* `0$!`,.!2%+1/`/!*0!*!L` +*W0`3+..5N`3!`3%((`0('`+10`(%*0%*#`%*
0$!`"+((+3%*#`/!0%+*K
6XEUHQGHULQJ
0`%/`3+.0$`/0.!//%*#`0$0`3!`(35/`3*0`0+`'!!,`+1.`+),+*!*0/`2!.5`/)((`* `+1.
.!* !.`)!0$+ /`2!.5`(!*`* `/%),(!K
+3!2!.L`0$0`%/`*+0`*`!/5`#+(L`!/,!%((5`3$!*`5+1`.!`.!0%*#`*`,,(%0%+*
%0!.0%2!(5L`* `%*`0$!`"%./0`%0!.0%+*`5+1`.!`*+0`/1.!`!40(5`$+3`0+`/,(%0`0$!`+),+*!*0/
%*0+`/)((!.`+*!/K`+L`3$0`/$+1( `3!`!` +%*#`3$!*`0$!`render`)!0$+ `!+)!/`0++`%#
0+`)%*0%*O`*!`/+(10%+*`%/`0+`/,(%0`%0`%*0+`/)((!.`"1*0%+*/`%*``35`0$0`(!0/`1/`'!!,`((
0$!`(+#%`%*`0$!`/)!`+),+*!*0K
!0W/`(++'`0`*`!4),(!M
UHQGHU8VHU0HQX() {
-6;IRUXVHUPHQX
}
UHQGHU$GPLQ0HQX() {
-6;IRUDGPLQPHQX
}
UHQGHU() {
UHWXUQ (
GLY!
K!Welcome back!K!
{this.XVHU([LVWV && this.UHQGHU8VHU0HQX()}
{this.XVHU,V$GPLQ && this.UHQGHU$GPLQ0HQX()}
GLY!
S`:@`T
(!*`,`+1.`+ ! $,0!.`9
);
}
$%/`%/`*+0`(35/`+*/% !.! `!/0`,.0%!`!1/!`%0`/!!)/`)+.!`+2%+1/`0+`/,(%0`0$!
+),+*!*0`%*0+`/)((!.`+*!/K` +3!2!.L`/+)!0%)!/`%0`$!(,/`0+`'!!,`0$!
.!* !.`)!0$+ `(!*!.K`+.`!4),(!L`%*`0$!`! 14`.!(_3+.( `!4),(!/L``/1_.!* !.
)!0$+ `%/`1/! `0+`.!* !.`0$!`(+ `)+.!`100+*K
+3`0$0`3!`.!` `,+3!.`1/!./L`%0`%/`0%)!`0+`)+2!`+*`* `/!!`$+3`0+`"+((+3``/05(!`#1% !
3%0$%*`+1.`+ !`0+`)'!`%0`+*/%/0!*0K
&RGHVW\OH
*`0$%/`/!0%+*L`5+1`3%((`(!.*`$+3`0+`%),(!)!*0` %0+.+*"%#`* `%*0`0+`%),.+2!`5+1.
+ !`-1(%05`5`2(% 0%*#`5+1.`+ !`/05(!K
(GLWRU&RQILJ
%0+.+*"%#`$!(,/` !2!(+,!./`0+`)%*0%*`+*/%/0!*0`+ %*#`/05(!/`!03!!*` %""!.!*0` /K
&RQILJXULQJ(GLWRU&RQILJ
%0+.+*"%#`%/`/1,,+.0! `5``(+0`+"`! %0+./K`+1`*`$!'`3$!0$!.`5+1.`! %0+.`%/`
/1,,+.0! `+.`*+0`+*`0$!`+""%%(`3!/%0!L`https:/b/bwww.beditorconfig.borgK
+1`*!! `0+`.!0!``"%(!`((! `.editorconfig`%*`5+1.`.++0` %.!0+.5`–`0$!`+*"%#1.0%+*`
1/!`%/`0$%/`+*!M
URRW = true
> @
LQGHQWBVW\OH = space
LQGHQWBVL]H = 2
HQGBRIBOLQH = lf
FKDUVHW = utf-8
WULPBWUDLOLQJBZKLWHVSDFH = true
LQVHUWBILQDOBQHZOLQH = true
> KWPO@
LQGHQWBVL]H = 4
> FVV@
S`;7`T
(!*`,`+1.`+ ! $,0!.`9
LQGHQWBVL]H = 4
> PG@
WULPBWUDLOLQJBZKLWHVSDFH = false
+1`*`""!0`((`0$!`"%(!/`3%0$`[]L`* `/,!%"%`"%(!/`3%0$`[.extension]K
(6/LQW
!`(35/`0.5`0+`3.%0!`0$!`!/0`+ !`,+//%(!L`10`/+)!0%)!/`!..+./`$,,!*L`* `/,!* %*#
`"!3`$+1./`0$%*#``1#` 1!`0+``05,+`%/`2!.5`".1/0.0%*#K`1'%(5L`/+)!`0++(/`*`$!(,`1/
$!'`0$!`+..!0*!//`+"`+1.`+ !`/`/++*`/`3!`05,!`%0K`$!/!`0++(/`.!`*+0`(!`0+`0!((`1/`%"
+1.`+ !`%/`#+%*#`0+` +`3$0`%0W/`/1,,+/! `0+` +L`10`0$!5`*`$!(,`1/`0+`2+% `/5*00%(
!..+./K
%*0`%/`*`+,!*`/+1.!`,.+&!0`.!(!/! `%*`978:`0$0`!)!`,+,1(.`0$*'/`0+`0$!`"0`0$0
%0`%/`$%#$(5`+*"%#1.(!`* `!40!*/%(!K
,QVWDOODWLRQ
%./0`+"`((L`3!`$2!`0+`%*/0((`%*0`/`"+((+3/M
QSPLQVWDOOJOREDOHVOLQW
S`;8`T
(!*`,`+1.`+ ! $,0!.`9
*!`0$!`!4!10(!`%/`%*/0((! L`3!`*`.1*`%0`3%0$`0$!`"+((+3%*#`+))* M
HVOLQWVRXUFHMV
$!`+10,10`3%((`0!((`1/`%"`0$!.!`.!`!..+./`3%0$%*`0$!`"%(!K
&RQILJXUDWLRQ
!0W/`/0.0`+*"%#1.%*#`%0K
+` `/+)!`.1(!/L`3!`1/!`0$!`rules`'!5K
+.`!4),(!L`(!0W/`.!0!``.eslintrc`"%(!`* ` %/(!`0$!`/!)%+(+*M
{
"UXOHV": {
"VHPL": [2, "QHYHU"]
}
}
%*0`.1(!/`$2!`0$.!!`(!2!(/`0$0` !0!.)%*!`0$!`/!2!.%05`+"`0$!`,.+(!)M
+""`Q+.`7RM`$!`.1(!`%/` %/(!
3.*`Q+.`8RM`$!`.1(!`%/``3.*%*#
!..+.`Q+.`9RM`$!`.1(!`0$.+3/`*`!..+.
!`.!`1/%*#`0$!`2`2(1!`!1/!`3!`3*0`%*0`0+`0$.+3`*`!..+.`!2!.5`0%)!`+1.`+ !
+!/`*+0`"+((+3`0$!`.1(!K`$!`/!+* `,.)!0!.`0!((/`%*0`0$0`3!`3*0`0$!`/!)%+(+*`0+`
*!2!.`!`1/! `Q0$!`+,,+/%0!`%/`(35/RK`%*0`* `%0/`,(1#%*/`.!`2!.5`3!((` +1)!*0! L
* `"+.`*5`/%*#(!`.1(!`5+1`*`"%* `0$!` !/.%,0%+*`+"`0$!`.1(!`* `/+)!`!4),(!/`+"`3$!*
%0`,//!/`* `3$!*`%0`"%(/K
+3L`.!0!`*`index.js`"%(!`3%0$`0$!`"+((+3%*#`+*0!*0M
YDU foo = 'bar';
S`;9`T
(!*`,`+1.`+ ! $,0!.`9
+0!`0$0`3!`.!`1/%*#`var`$!.!`!1/!`%*0` +!/`*+0`'*+3`5!0`0$0
3!`3*0`0+`3.%0!`+ !`%*`=`Q978<RK
"`3!`.1*`eslint index.js`3!`#!0`0$!`"+((+3%*#M
Extra semicolon (semi)
$%/`%/`#.!0N`3!`/!0`1,`0$!`(%*0!.L`* `%0`%/`$!(,%*#`1/`"+((+3`+1.`"%./0`.1(!K
!`*`!*(!`* ` %/(!`!2!.5`/%*#(!`.1(!`)*1((5L`+.`3!`*`!*(!`0$!`.!+))!* !
+*"%#1.0%+*`%*`+*!`#+`5`,100%*#`0$!`"+((+3%*#`+ !`%*0+`+1.`.eslintrc`"%(!M
{
"H[WHQGV": "eslint:recommended"
}
$!`no-unused-vars`.1(!`%/`,.!005`1/!"1(`"+.`'!!,%*#`+1.`+ !`(!*K
$%/`%/`0$!`!..+.`%*`-1!/0%+*M
Parsing error: The keyword 'const' is reserved
+L`0+`!*(!`=`Q978<RL`3!`$2!`0+` `0$!`parserOptions`+*"%#1.0%+*`+,0%+*M
{
"H[WHQGV": "eslint:recommended",
"SDUVHU2SWLRQV": {
"HFPD9HUVLRQ": 6
}
}
S`;:`T
(!*`,`+1.`+ ! $,0!.`9
%*((5L`0+`!*(!` L`3!`1/!`0$!`"+((+3%*#M
{
"H[WHQGV": "eslint:recommended",
"SDUVHU2SWLRQV": {
"HFPD9HUVLRQ": 6,
"HFPD)HDWXUHV": {
"MV[": true
}
}
}
0`0$%/`,+%*0L`%"`5+1`$2!`3.%00!*`*5`!0`,,(%0%+*/`!"+.!`* `$2!`*!2!.`1/! `
(%*0!.L``#++ `!4!.%/!`0+`(!.*`0$!`.1(!/`* `#!0`1/! `0+`%0`%/`0+`.1*`%*0`#%*/0`0$!`/+1.!
* `"%4`((`0$!`%//1!/K
*LWKRRNV
+`2+% `$2%*#`1*(%*0! `+ !`%*`+1.`.!,+/%0+.5L`3$0`3!`*` +`%/` `%*0`0`+*!`,+%*0
+"`+1.`,.+!//`1/%*#` %0`$++'/K`+.`!4),(!L`3!`*`1/!` 1/'5`0+`.1*`+1.`(%*0!.`%*`` %0
$++'`((! `,.!_+))%0L`* `%0`%/`(/+`1/!"1(`0+`.1*`+1.`1*%0`0!/0/`+*`0$!`$++'`,.!_,1/$K
+`%*/0((`$1/'5L`5+1`*!! `0+`.1*M
QSPLQVWDOOVDYHGHYKXVN\
S`;;`T
(!*`,`+1.`+ ! $,0!.`9
5HDFWSOXJLQ
/`)!*0%+*! `,.!2%+1/(5L`+*!`+"`0$!`)%*`.!/+*/`%*0`%/`,+,1(.`%/`!1/!`%0`%/
!40!*/%(!`3%0$`,(1#%*/N`0$!`)+/0`%),+.0*0`+*!`"+.`1/`%/`eslint-plugin-reactK
%*0`*`,./!` `3%0$+10`*5`,(1#%*/`Q&1/0`5`!*(%*#`0$!`"(#RL`10`3!`3*0`0+` +
)+.!K`+.`!4),(!L`3!`)5`3*0`0+`!*"+.!`+*!`+"`0$!`!/0`,.0%!/`3!`$2!`/!!*`%*`0$!
,.!2%+1/`/!0%+*`* `'!!,`+1.`0!),(0!/`+*/%/0!*0`.+//` !2!(+,!./`* `0!)/K
+`1/!`0$!`,(1#%*L`3!`"%./0`$2!`0+`%*/0((`%0M
QSPLQVWDOOJOREDOHVOLQWSOXJLQUHDFW
S`;<`T
(!*`,`+1.`+ ! $,0!.`9
+3L`%"`3!`3.%0!`/+)!0$%*#`3.+*#L`"+.`!4),(!L`3!`0.5`0+`1/!`0$!`/)!`,.+,`03%!`%*`
!0`+),+*!*0L`3!`.!`#+%*#`0+`#!0`*`!..+.M
<Foo bar bar />
$!.!`.!``(+0`+"`.1(!/`2%((!`0+`!`1/! `%*`+1.`,.+&!0K`!0W/`#+`0$.+1#$`/+)!`+"`0$!)
* `/!!`$+3`0$!5`*`$!(,`1/`0+`"+((+3`0$!`!/0`,.0%!/K
+L`$!.!`%/`*`!4),(!`+"`$+3`%*0`*`!`1/!"1(`0+`$!(,`!2!.5+*!`%*`0$!`0!)`"+((+3`
/05(!`#1% !`3%0$+10`$2%*#`0+`)!)+.%6!`%0K
%./0`+"`((L`3!`$2!`0+`0%20!`0$!`.1(!M
"rules": {
"react/jsx-indent": [2, 2]
}
$!`"%./0`2`)!*/`0$0`3!`3*0`%*0`0+`.%/!`*`!..+.`%*`/!`0$!`.1(!`%/`*+0`"+((+3!
3%0$%*`0$!`+ !L`* `0$!`/!+* `2`)!*/`0$0`3!`3*0`!2!.5` `!(!)!*0`0+`!`%* !*0!
3%0$`03+`/,!/K`%*0` +!/`*+0`)'!`*5` !%/%+*/`"+.`5+1L`/+`%0`%/`1,`0+`5+1`0+` !% !
3$%$`.1(!/`0+`!*(!K`+1`*`!2!*`$++/!`0+`"+.!``*+*_%* !*00%+*`1/%*#`7`/``/!+*
,.)!0!.K
S`;=`T
(!*`,`+1.`+ ! $,0!.`9
.%0!`/+)!0$%*#`(%'!`0$!`"+((+3%*#M
GLY!
GLY!
GLY!
%*0`+),(%*/L`/`"+((+3/M
([SHFWHGLQGHQWDWLRQRIVSDFHFKDUDFWHUVEXWIRXQG
UHDFWMV[LQGHQW
/`3!`$2!`/!!*`%*`0$!`,.!2%+1/`/!0%+*L`3$!*`0$!`00.%10!/`.!`0++`)*5`+.`0++`(+*#L`%0`%/
`#++ `,.0%!`0+`3.%0!`0$!)`+*``*!3`(%*!K
$!`!0`,(1#%*`"+.`%*0`*+0`+*(5`#%2!/`1/`/+)!`.1(!/`0+`3.%0!`!00!.` L`10`(/+`/+)!
.1(!/`0+`3.%0!`!00!.`!0`+),+*!*0/K
+.`!4),(!L`3!`*`!*(!``.1(!`0+`!*"+.!`0$!`/+.0%*#`+"`0$!`,.+,`05,!/`%*0+`(,$!0%(
+. !.L``.1(!`0+`#%2!`1/`*`!..+.`3$!*`3!`.!`1/%*#``,.+,`0$0`$/`*+0`!!*` !(.! L``.1(!
0+`"+.!`1/`0+`,.!"!.`/00!(!//`"1*0%+*(`+),+*!*0/`+2!.`(//!/`Q3!`3%((`/!!`0$!` %""!.!*!
%*` !0%(`%*`Chapter 3L`.!0!`.1(5`!1/(!`+),+*!*0/RL`* `/+`+*K
$LUEQE5HDFW-6;VW\OHJXLGH
$!`%.*`!0\ `/05(!`#1% !`%/`0$!`)+/0`,+,1(.`/05(!`#1% !`"+.`+ %*#`%*`!0K`
S`;>`T
(!*`,`+1.`+ ! $,0!.`9
+1`*`$!'`((`0$!`%*0`.1(!/`+*`0$!`+""%%(`3!/%0!
Qhttps://eslint.org/docs/rulesR`* `((`0$!`/,!%(`!0`%*0`.1(!/`0
https://github.com/yannickcr/eslint-plugin-react/tree/master/docs/rulesK
comma-dangleM`""
arrow-parensM`""
max-lenM`897
no-param-reassignM`""
function-paren-newlineM`""
react/require-default-propsM`""
+`.1*`5+1.`(%*0!.L`5+1`$2!`0+` ``(%*0`/.%,0`%*0+`5+1.`package.json`"%(!M
{
"VFULSWV": {
"OLQW": "eslint H[W .jsx,.js src"
}
}
+3`5+1`*`(%*0`5+1.`"%(!/`1/%*#`0$!`%.*`!0\ `/05(!`#1% !K
S`;?`T
(!*`,`+1.`+ ! $,0!.`9
7KHEDVLFVRIIXQFWLRQDOSURJUDPPLQJ
,.0`".+)`"+((+3%*#`0$!`!/0`,.0%!/`3$!*`3!`3.%0!` `* `1/!``(%*0!.`0+`!*"+.!
+*/%/0!*5`* `"%* `!..+./`!.(%!.L`0$!.!`%/`+*!`)+.!`0$%*#`3!`*` +`0+`(!*`1,`+1.`+ !M
"+((+3``"1*0%+*(`,.+#.))%*#`QR`/05(!K
)LUVWFODVVREMHFWV
*` 2.%,0L`"1*0%+*/`.!`"%./0_(//`+&!0/L`3$%$`)!*/`0$0`0$!5`*`!`//%#*! `0+
2.%(!/`* `,//! `/`,.)!0!./`0+`+0$!.`"1*0%+*/K
!0W/`(++'`0``/%),(!`!4),(!`3$!.!`0$!.!`%/``"1*0%+*`"+.` %*#`03+`*1)!./`0$0`#!0/
!*$*! `3%0$``"1*0%+*`0$0`"%./0`(+#/`((`0$!`,.)!0!./`* `0$!*`!4!10!/`0$!`+.%#%*(
+*!M
FRQVW add = (x, y) => x + y;
S`;@`T
(!*`,`+1.`+ ! $,0!.`9
3XULW\
*`%),+.0*0`/,!0`+"``%/`0+`3.%0!`,1.!`"1*0%+*/K`+1`3%((`!*+1*0!.`0$%/`+*!,0`2!.5
+"0!*`%*`0$!`!0`!+/5/0!)L`!/,!%((5`%"`5+1`(++'`%*0+`(%..%!/`/1$`/`! 14K
$0` +!/`%0`)!*`"+.``"1*0%+*`0+`!`,1.!O
+.`!4),(!L``"1*0%+*`0$0`$*#!/`0$!`/00!`+"`*`,,(%0%+*L`+.`)+ %"%!/`2.%(!/
!"%*! `%*`0$!`1,,!.`/+,!L`+.``"1*0%+*`0$0`0+1$!/`!40!.*(`!*0%0%!/L`/1$`/`0$!`L`%/
+*/% !.! `%),1.!K` ),1.!`"1*0%+*/`.!`$. !.`0+` !1#L`* `)+/0`+"`0$!`0%)!`%0`%/`*+0
,+//%(!`0+`,,(5`0$!)`)1(0%,(!`0%)!/`* `!4,!0`0+`#!0`0$!`/)!`.!/1(0K
+.`!4),(!L`0$!`"+((+3%*#`"1*0%+*`%/`,1.!M
FRQVW add = (x, y) => x + y;
0`*`!`.1*`)1(0%,(!`0%)!/L`(35/`#!00%*#`0$!`/)!`.!/1(0L`!1/!`*+0$%*#`%/`/0+.!
*53$!.!`* `*+0$%*#`#!0/`)+ %"%! K
$!`"+((+3%*#`"1*0%+*`%/`*+0`,1.!M
OHW x = 0;
FRQVW add = y => (x = x + y);
1**%*#`add(1)`03%!L`3!`#!0`03+` %""!.!*0`.!/1(0/K`$!`"%./0`0%)!`3!`#!0`1L`10`0$!`/!+*
0%)!`3!`#!0`2L`!2!*`%"`3!`((`0$!`/)!`"1*0%+*`3%0$`0$!`/)!`,.)!0!.K`$!`.!/+*`3!
#!0`0$0`!$2%+.`%/`0$0`0$!`#(+(`/00!`#!0/`)+ %"%! `"0!.`!2!.5`!4!10%+*K
,PPXWDELOLW\
!`$2!`/!!*`$+3`0+`3.%0!`,1.!`"1*0%+*/`0$0` +*W0`)100!`0$!`/00!L`10`3$0`%"`3!`*!!
0+`$*#!`0$!`2(1!`+"``2.%(!O` *`L``"1*0%+*L`%*/0! `+"`$*#%*#`0$!`2(1!`+"`
2.%(!L`.!0!/``*!3`2.%(!`3%0$``*!3`2(1!`* `.!01.*/`%0K`$%/`35`+"`3+.'%*#`3%0$
0`%/`((! `%))10%(%05K
*`%))10(!`2(1!`%/``2(1!`0$0`**+0`!`$*#! K
S`<7`T
(!*`,`+1.`+ ! $,0!.`9
!0W/`(++'`0`*`!4),(!M
FRQVW add3 = arr => arr.SXVK(3);
FRQVW myArr = [1, 2];
DGG(myArr); >@
DGG(myArr); >@
!`*`$*#!`0$!`,.!! %*#`"1*0%+*`0+`)'!`%0`%))10(!`1/%*#`concatL`3$%$`.!01.*/`
*!3`..5`3%0$+10`)+ %"5%*#`0$!`#%2!*`+*!M
FRQVW add3 = arr => arr.FRQFDW(3);
FRQVW myArr = [1, 2];
FRQVW result1 = DGG(myArr); >@
FRQVW result2 = DGG(myArr); >@
"0!.`3!`$2!`.1*`0$!`"1*0%+*`03%!L`myArr`/0%((`$/`%0/`+.%#%*(`2(1!K
&XUU\LQJ
`+))+*`0!$*%-1!`%*``%/`1..5%*#K`1..5%*#`%/`0$!`,.+!//`+"`+*2!.0%*#``"1*0%+*
0$0`0'!/`)1(0%,(!`.#1)!*0/`%*0+``"1*0%+*`0$0`0'!/`+*!`.#1)!*0`0``0%)!L
.!01.*%*#`*+0$!.`"1*0%+*K`!0W/`(++'`0`*`!4),(!`0+`(.%"5`0$!`+*!,0K
!0W/`/0.0`3%0$`0$!`add`"1*0%+*`3!`$2!`/!!*`!"+.!`* `0.*/"+.)`%0`%*0+``1..%!
"1*0%+*K
*/0! `+"`3.%0%*#`0$!`"+((+3%*#`+ !M
FRQVW add = (x, y) => x + y;
!` !"%*!`0$!`"1*0%+*`/`"+((+3/M
FRQVW add = x => y => x + y;
* `3!`1/!`%0`%*`0$!`"+((+3%*#`35M
FRQVW add1 = DGG(1);
DGG(2);
DGG(3);
$%/`%/``,.!005`+*2!*%!*0`35`+"`3.%0%*#`"1*0%+*/`!1/!L`/%*!`0$!`"%./0`2(1!`%/`/0+.!
"0!.`0$!`,,(%0%+*`+"`0$!`"%./0`,.)!0!.L`3!`*`.!1/!`0$!`/!+* `"1*0%+*`)1(0%,(!`0%)!/K
S`<8`T
(!*`,`+1.`+ ! $,0!.`9
&RPSRVLWLRQ
%*((5L`*`%),+.0*0`+*!,0`%*``0$0`*`!`,,(%! `0+`!0`%/`+),+/%0%+*K`1*0%+*/
Q* `+),+*!*0/R`*`!`+)%*! `0+`,.+ 1!`*!3`"1*0%+*/`3%0$`)+.!` 2*! `"!01.!/
* `,.+,!.0%!/K
+*/% !.`0$!`"+((+3%*#`"1*0%+*/M
FRQVW add = (x, y) => x + y;
FRQVW square = x => x * x;
)3DQGXVHULQWHUIDFHV
$!`(/0`/0!,`0+`0'!`%/`0+`(!.*`$+3`3!`*`1/!``0+`1%( ` /L`3$%$`%/`3$0`3!`1/!`!0
"+.K
S`<9`T
(!*`,`+1.`+ ! $,0!.`9
6XPPDU\
*`0$%/`$,0!.L`3!`(!.*! ``#.!0` !(`+10`$+3` `3+.'/`* `$+3`0+`1/!`%0`%*`0$!`.%#$0
35`%*`+1.`+),+*!*0/K`!`/0.0! `".+)`0$!`/%/`+"`0$!`/5*04`0+`.!0!``/+(%
'*+3(! #!`/!`0$0`3%((`!*(!`1/`0+`)/0!.` `* `%0/`"!01.!/K
S`<:`T
6HFWLRQ+RZ5HDFWZRUNV
*`0$%/`/!0%+*L`3!`!#%*`5`(!.*%*#``$+3`0+`.!0!`.!1/(!`+),+*!*0/`%*`+. !.`0+`'!!,
0$!`+ !`/!`(!*`* `)%*0%*(!K`!`3%((`(!.*`$+3`0+`+.#*%6!`+1.`+),+*!*0/`*
)'!`0$!)`+))1*%0!`3%0$`!$`+0$!.`5`,,(5%*#`+*/+(% 0!`,00!.*/K`!`3%((`(/+
(++'`0`$+3`0+`'!!,`0$!`+ !`(!*`* `K`!`3%((`0$!*`#+`0$.+1#$`0$!` %""!.!*0
0!$*%-1!/`* `,,.+$!/`3!`*`1/!`0+`"!0$` 0`%*`0$!`!0`35K`* `"%*((5L`3!`3%((
0'!``(++'`0`"+.)/`* `!2!*0/K
*`0$%/`/!0%+*L`3!`3%((`+2!.`0$!`"+((+3%*#`$,0!./M
Chapter 3L`.!0!`.1(5`!1/(!`+),+*!*0/
Chapter 4L`+),+/!`((`0$!`$%*#/
Chapter 5L`.+,!.`0`!0$%*#
Chapter 6L`.%0!`+ !`"+.`0$!`.+3/!.
&UHDWLQJ7UXO\5HXVDEOH
&RPSRQHQWV
+`.!0!`0.1(5`.!1/(!`+),+*!*0/L`3!`$2!`0+`1* !./0* `0$!` %""!.!*0`,+//%%(%0%!/`0$0
!0`#%2!/`1/`"+.` !"%*%*#`+),+*!*0/L`* `3$!*`%0`%/`!00!.`0+`$++/!`+*!`+.`*+0$!.K`
*!3`05,!`+"`+),+*!*0`$/`!!*`%*0.+ 1! `%*`!0`0$0`(!0/`1/` !(.!``+),+*!*0`/
`/00!(!//`"1*0%+*K` 0`%/`.1%(`0+`1* !./0* `0$%/`+),+*!*0`* `(!.*`3$!*`* `3$5`%0
/$+1( `!`1/! K
*`0$%/`$,0!.L`3!`3%((`+2!.`0$!`"+((+3%*#`0+,%/M
&UHDWLQJFODVVHV
!`/3`%*`0$!`"%./0`$,0!.`$+3`!0`1/!/`!(!)!*0/`0+` %/,(5`0$!`+),+*!*0/`+*`0$!
/.!!*K
7KHFUHDWH&ODVVIDFWRU\
++'%*#`0`0$!`!0` +1)!*00%+*`Q0`0$!`0%)!`+"`3.%0%*#RL`0$!`"%./0`!4),(!`3!`"%* `
/$+3/`1/`$+3`0+` !"%*!`+),+*!*0/`1/%*#`React.createClassK
!0W/`/0.0`3%0$``2!.5`/%),(!`/*%,,!0M
FRQVW Button = React.FUHDWH&ODVV({
UHQGHU() {
UHWXUQ <button />;
}
});
!`*`$*#!`0$!`/*%,,!0`0+`1/!`,(%*` 2.%,0`/`"+((+3/M
FRQVW Button = React.FUHDWH&ODVV({
UHQGHU() {
UHWXUQ React.FUHDWH(OHPHQW('button');
}
});
S`<=`T
.!0%*#`.1(5`!1/(!`+),+*!*0/ $,0!.`:
([WHQGLQJ5HDFW&RPSRQHQW
$!`/!+* `35`0+` !"%*!``!0`+),+*!*0`%/`5`1/%*#`0$!`978<`(//!/K
$!`class`'!53+. `%/`3% !(5`/1,,+.0! `%*`)+ !.*`.+3/!./L`10`3!`*`/"!(5`0.*/,%(!`%0
3%0$`!(L`3$%$L`/1,,+/! (5L`3!`(.! 5`$2!`%*`+1.`/0'`%"`3!`.!`3.%0%*#` K
!0W/`/!!`3$0`%0`)!*/`0+`.!0!`0$!`/)!`100+*`".+)`0$!`,.!2%+1/`!4),(!`1/%*#``(//M
FODVV Button H[WHQGV React.Component {
UHQGHU() {
UHWXUQ <button />;
}
}
7KHPDLQGLIIHUHQFHV
,.0`".+)`0$!` %/.!,*%!/`.!#. %*#`0$!`/5*04L`0$!.!`.!`/+)!`)&+.` %""!.!*!/`0$0
3!`$2!`0+`'!!,`%*`)%* `3$!*`3!` !% !`0+`1/!`+*!`+.`*+0$!.K
3URSV
$!`"%./0` %""!.!*!`%/`%*`$+3`3!`*` !"%*!`0$!`,.+,/`0$0``+),+*!*0`!4,!0/`0+`.!!%2!L
* `0$!` !"1(0`2(1!/`"+.`!$`+*!`+"`0$!`,.+,/K
!`3%((`/!!`$+3`,.+,/`3+.'`%*` !0%(`"1.0$!.`%*0+`0$%/`$,0!.L`/+`(!0W/`*+3`+*!*0.0!`+*
$+3`3!`*` !"%*!`0$!)K
S`<>`T
.!0%*#`.1(5`!1/(!`+),+*!*0/ $,0!.`:
/`5+1`*`/!!L`3!`1/!`0$!`propTypes`00.%10!`0+`(%/0`((`0$!`,.+,/`0$0`3!`*`,//`0+`0$!
+),+*!*0K
!`0$!*`1/!`0$!`getDefaultProps`"1*0%+*`0+` !"%*!`0$!`2(1!/`0$0`0$!`,.+,/`.!`#+%*#
0+`$2!`5` !"1(0L`* `3$%$`3%((`!`+2!.3.%00!*`5`0$!`,.+,/`,//! `".+)`0$!`,.!*0L`%"
0$!5`.!`,.!/!*0K
+`$%!2!`0$!`/)!`.!/1(0`1/%*#`(//!/L`3!`$2!`0+`1/!``/(%#$0(5` %""!.!*0`/0.101.!M
FODVV Button H[WHQGV React.Component {
UHQGHU() {
UHWXUQ EXWWRQ!{this.props.text}EXWWRQ!;
}
}
Button.SURS7\SHV = {
WH[W: React.PropTypes.VWULQJ
};
Button.GHIDXOW3URSV = {
WH[W: 'Click me!'
};
/`5+1`*`/!!`%*`0$!`!4),(!L`0$!`propTypes`+&!0`%/`0$!`/)!`3!`1/!
3%0$`createClassK
S`<?`T
.!0%*#`.1(5`!1/(!`+),+*!*0/ $,0!.`:
6WDWH
*+0$!.`%#` %""!.!*!`!03!!*`0$!`createClass`"0+.5`* `0$!`extends
React.Component`)!0$+ `%/`0$!`35`5+1` !"%*!`0$!`%*%0%(`/00!`+"`0$!`+),+*!*0/K
#%*L`3%0$`createClassL`3!`1/!``"1*0%+*L`3$%(!`3%0$`0$!`=`(//!/`3!`/!0`*`00.%10!
+"`0$!`%*/0*!K
!0W/`/!!`*`!4),(!`+"`0$0`%*`0$!`"+((+3%*#`+ !`/*%,,!0M
FRQVW Button = React.FUHDWH&ODVV({
JHW,QLWLDO6WDWH() {
UHWXUQ {
WH[W: 'Click me!'
};
},
UHQGHU() {
UHWXUQ EXWWRQ!{this.state.text}EXWWRQ!;
}
});
+3!2!.L`3%0$`(//!/L`3!` !"%*!`+1.`%*%0%(`/00!`1/%*#`0$!`state`00.%10!`+"`0$!`%*/0*!
* `/!00%*#`%0`%*/% !`0$!`constructor`)!0$+ `+"`0$!`(//M
FODVV Button H[WHQGV React.Component {
FRQVWUXFWRU(props) {
VXSHU(props);
this.VWDWH = {
WH[W: 'Click me!'
};
}
UHQGHU() {
UHWXUQ EXWWRQ!{this.state.text}EXWWRQ!;
}
}
S`<@`T
.!0%*#`.1(5`!1/(!`+),+*!*0/ $,0!.`:
*`=L`0+`1/!`this`%*`/1_(//!/L`3!`"%./0`)1/0`((`superK` *`0$!`/!`+"`!0L`3!`(/+
,//`0$!`,.+,/`0+`0$!`,.!*0K
$XWRELQGLQJ
createClass`$/``++(`"!01.!`0$0`%/`,.!005`+*2!*%!*0L`10`%0`*`(/+`$% !`0$!`35
2.%,0`3+.'/L`3$%$`%/`)%/(! %*#L`!/,!%((5`"+.`!#%**!./K`$%/`"!01.!`(!0/`5+1`.!0!
!2!*0`$* (!./`//1)%*#`0$0L`3$!*`0$!5`#!0`((! L`this`.!"!.!*!/`0$!`+),+*!*0`%0/!("K
!0W/`/0.0`3%0$``/%),(!`!4),(!M
FRQVW Button = React.FUHDWH&ODVV({
KDQGOH&OLFN() {
console.ORJ(this);
},
UHQGHU() {
UHWXUQ EXWWRQ RQ&OLFN={this.handleClick} !;
}
});
S`=7`T
.!0%*#`.1(5`!1/(!`+),+*!*0/ $,0!.`:
+L`(!0W/`(++'`0`0$!`"+((+3%*#`!4),(!M
() => this.VHW6WDWH();
/`5+1`*`%)#%*!L`+*!`,+//%(!`/+(10%+*`0+`0$!`10+%* %*#`,.+(!)`%/`1/%*#`0$!`..+3
"1*0%+*` %.!0(5`%*`0$!`render`)!0$+ K`!0W/`(++'`0`0$!`"+((+3%*#`!4),(!M
FODVV Button H[WHQGV React.Component {
KDQGOH&OLFN() {
console.ORJ(this);
}
UHQGHU() {
UHWXUQ EXWWRQ RQ&OLFN={() => this.KDQGOH&OLFN()}!;
}
}
S`=8`T
.!0%*#`.1(5`!1/(!`+),+*!*0/ $,0!.`:
$!`!/0`35`0+`/+(2!`%0`%/`0+`%* `0$!`"1*0%+*`3%0$`*`..+3`"1*0%+*`10`%*`0$!`)!0$+
%0/!("L`* `,//`0$!`.!"!.!*!`0+`0$!`onClick`,.+,!.05M
FODVV Button H[WHQGV React.Component {
KDQGOH&OLFN () => {
console.ORJ(this);
}
UHQGHU() {
UHWXUQ EXWWRQ RQ&OLFN={this.handleClick}!;
}
}
$0W/`%0K`.+(!)`/+(2! P
6WDWHOHVVFRPSRQHQWV
+`".L`3!`$2!`+*(5`(!.*! `$+3`0+`.!0!`(//`+),+*!*0/`%*`!0K`$!/!`+),+*!*0/
.!`1/!"1(`3$!*`5+1`*!! `0+`$* (!`(+(`/00!/L`10`%*`/+)!`/!/L`3!`3%((`*!! `0+`.!* !.
/00%`).'1,K`+.`/00%`+),+*!*0/L`3!`*!! `0+`1/!`"1*0%+*(`+),+*!*0/L`(/+`'*+3*`/
/00!(!//`+),+*!*0/K`$%/`3%((`%),.+2!`0$!`,!."+.)*!`+"`+1.`,,(%0%+*K
S`=9`T
.!0%*#`.1(5`!1/(!`+),+*!*0/ $,0!.`:
$!`/5*04`%/`,.0%1(.(5`0!./!`* `!(!#*0`–`(!0W/`/!!`*`!4),(!M
() => <button />
3URSVDQGFRQWH[W
+),+*!*0/`0$0`.!`*+0`(!`0+`.!!%2!`*5`,.+,/`".+)`0$!`,.!*0/`.!`*+0`,.0%1(.(5
1/!"1(L`* `0$!`/00!(!//`"1*0%+*(`+),+*!*0/`*`.!!%2!`props`/`,.)!0!./M
props => EXWWRQ!{props.WH[W}EXWWRQ!;
(0!.*0%2!(5L`3!`*`1/!`*`!2!*`)+.!`+*%/!`/5*04`3%0$`0$!`=` !/0.101.%*#M
({ WH[W }) => EXWWRQ!{text}EXWWRQ!;
!`*` !"%*!`0$!`props`/+`0$0``/00!(!//`"1*0%+*`*`.!!%2!`1/%*#
0$!`,.+,5,!/`00.%10!`%*``/%)%(.`35`/`3!` +`3$!*`3!`!40!* `+),+*!*0/M
LPSRUW{string }IURP prop-types
Button.SURS7\SHV = {
WH[W: string
}
00!(!//`"1*0%+*(`+),+*!*0/`(/+`.!!%2!``/!+* `,.)!0!.`0$0`.!,.!/!*0/`0$!
+*0!40M
(props, context) => (
EXWWRQ!{context.currency}{props.value}EXWWRQ!
);
S`=:`T
.!0%*#`.1(5`!1/(!`+),+*!*0/ $,0!.`:
7KHWKLVNH\ZRUG
*!`0$%*#`0$0`)'!/`0$!`/00!(!//`"1*0%+*(`+),+*!*0/` %""!.!*0`".+)`0$!%.`/00!"1(
+1*0!.,.0/`%/`0$!`"0`0$0`this` +!/`*+0`.!,.!/!*0`0$!`+),+*!*0` 1.%*#`0$!%.`!4!10%+*K
+.`0$%/`.!/+*L`%0`%/`*+0`,+//%(!`0+`1/!`"1*0%+*/`/1$`/`setStateL`+.`(%"!`5(!`)!0$+ /
0$0`.!`//+%0! `3%0$`0$!`+),+*!*0`%*/0*!K
6WDWH
$!`*)!`/00!(!//`0!((/`1/`(!.(5`0$0`0$!`/00!(!//`"1*0%+*(`+),+*!*0/` +`*+0`$2!`*5
%*0!.*(`/00!L`* `0$!`"0`0$0`0$%/` +!/`*+0`!4%/0`!*"+.!/`%0K`$0`)'!/`0$!)`!40.!)!(5
,+3!."1(`* `!/5`0+`1/!`0`0$!`/)!`0%)!K
/LIHF\FOH
00!(!//`"1*0%+*(`+),+*!*0/` +`*+0`,.+2% !`*5`(%"!`5(!`$++'/L`/1$
/`componentDidMountN`0$!5`%),(!)!*0``.!* !._(%'!`)!0$+ L`* `!2!.50$%*#`!(/!`$/`0+
!`$* (! `5`0$!`,.!*0K
5HIVDQGHYHQWKDQGOHUV
%*!`0$!.!`%/`*+`+),+*!*0`%*/0*!L`0+`1/!`.!"/`+.`!2!*0`$* (!./`3%0$
/00!(!//`"1*0%+*(`+),+*!*0/L`5+1`*` !"%*!`0$!)`%*`0$!`"+((+3%*#`35M
() => {
OHW input;
UHWXUQ (
GLY!
LQSXWUHI={el => (input = HO)} !
EXWWRQRQ&OLFN={onClick}!Focus<EXWWRQ!
GLY!
)
}
S`=;`T
.!0%*#`.1(5`!1/(!`+),+*!*0/ $,0!.`:
2SWLPL]DWLRQ
*!`0$%*#`3!`/$+1( `'!!,`%*`)%* `3$!*`3!`1/!`/00!(!//`"1*0%+*(`+),+*!*0/`%/`0$0L
!2!*`%"`!++'` !2!(+,!./`/5`0$0`%*`0$!`"101.!`0$!5`3+1( `!`(!`0+`,.+2% !
,!."+.)*!`+,0%)%60%+*/`"+.`+),+*!*0/`3%0$+10``/00!L`0`0$!`0%)!`+"`3.%0%*#L`0$!5
,!."+.)``(%00(!`%0`(!//`3!((K
$%/`%/`*+0``%#`%//1!L`10`%0`%/`/+)!0$%*#`0+`+*/% !.K
/D\RXWFRPSRQHQWV
+.)((5L`5+1`*`1/!`/00!(!//`+),+*!*0/`"+.`(5+10`+),+*!*0/L`/1$`/`$! !./L
+*0!*0L`+.`"++0!./L`/%*!`5+1`&1/0`*!! `0+`.!* !.`/00%`).'1,K
!0W/`.!0!``*!3`,,(%0%+*`3%0$`create-react-appK` "`5+1`.1*`5+1.`,.+&!0`3%0$`npm
/0.0`5+1`3%((`/!!`/+)!0$%*#`(%'!`0$%/M
"`5+1`+,!*`0$!`"%(!`(+0! `%*`src/App.js`5+1`3%((`/!!`0$%/`+ !M
LPSRUW React, { Component } IURP 'react';
LPSRUW logo IURP './logo.svg';
LPSRUW './App.css';
S`=<`T
.!0%*#`.1(5`!1/(!`+),+*!*0/ $,0!.`:
UHWXUQ (
GLY FODVV1DPH="App"!
KHDGHUFODVV1DPH="App-header"!
LPJVUF={logo} FODVV1DPH="App-logo" DOW="logo"!
S!
Edit FRGH!src/App.jsFRGH! and save to reload.
S!
D
FODVV1DPH="App-link"
KUHI="https://reactjs.org"
WDUJHW="_blank"
UHO="noopener noreferrer"
!
Learn React
D!
KHDGHU!
GLY!
);
}
}
H[SRUWGHIDXOW App;
+3L`(!0W/`.!'`+1.`+ !`%*0+`(5+10`"%(!/`–`0$0`)!*/`3!`3%((`.!0!`0$!`HeaderL
ContentL`* `Footer`+),+*!*0/`0+`/%),(%"5`+1.`+ !K
$!`"%./0`+),+*!*0`%/`0$!`Header`+),+*!*0N`(!0W/`(++'`0`0$!`+ !`3!`*!! M
LPSRUW React IURP 'react';
LPSRUW { string } IURP 'prop-types';
Header.SURS7\SHV = {
WLWOH string.LV5HTXLUHG
};
H[SRUWGHIDXOW Header;
S`==`T
.!0%*#`.1(5`!1/(!`+),+*!*0/ $,0!.`:
H[SRUWGHIDXOW App;
+3L`(!0W/`.!0!``*!3`+),+*!*0`0+` `0$!`Content`+),+*!*0`+"`0$!`/%0!M
LPSRUW React IURP 'react';
LPSRUW { node } IURP 'prop-types';
Content.SURS7\SHV = {
FKLOGUHQ: node.LV5HTXLUHG
S`=>`T
.!0%*#`.1(5`!1/(!`+),+*!*0/ $,0!.`:
};
H[SRUWGHIDXOW Content;
&RQWHQW!
^ 7KLVFRQWHQWLVVHQGLQJDVWKHFKLOGUHQSURS `
S!
This is our VWURQJ!Content>VWURQJ! component
S!
&RQWHQW!
GLY!
);
}
}
H[SRUWGHIDXOW App;
$!`.!/1(0`%/`/`"+((+3/M
S`=?`T
.!0%*#`.1(5`!1/(!`+),+*!*0/ $,0!.`:
%*((5L`(!0W/`.!0!``Footer`+),+*!*0M
LPSRUW React IURP 'react';
LPSRUW { string } IURP 'prop-types';
Footer.SURS7\SHV = {
FRS\ULJKW: string.LV5HTXLUHG
};
H[SRUWGHIDXOW Footer;
&RQWHQW!
^ 7KLVFRQWHQWLVUHFHLYHGZLWKWKHFKLOGUHQSURS `
S!
This is our VWURQJ!Content>VWURQJ! component
S!
&RQWHQW!
)RRWHU
FRS\ULJKW={`Dev.education ^QHZ Date().JHW)XOO<HDU()``}
!
GLY!
);
}
}
H[SRUWGHIDXOW App;
S`=@`T
.!0%*#`.1(5`!1/(!`+),+*!*0/ $,0!.`:
7KHVWDWH
!`$2!`/!!*`$+3`0+`.!0!``+),+*!*0`3%0$`0$!`"0+.5L`!40!* %*#`0$!`!0`(//L`+.
1/%*#`/00!(!//`"1*0%+*(`+),+*!*0/K
!`3%((`(!.*`3$!*`3!`/$+1( `1/!`/00!(!//`"1*0%+*/`.0$!.`0$*`/00!"1(`+),+*!*0/L`*
3$5`0$0`.!,.!/!*0/``"1* )!*0(` !%/%+*`%*` !/%#*%*#`+),+*!*0/K
([WHUQDOOLEUDULHV
%./0`+"`((L`%0`%/`%),+.0*0`0+`1* !./0* `3$5`3!`/$+1( `+*/% !.`1/%*#`0$!`/00!`%*/% !`+1.
+),+*!*0/L`* `3$5`%0`*`$!(,`1/`%*` %""!.!*0`35/K
$%/`(! /`0+``+))+*`)%/+*!,0%+*`0$0`5+1`**+0`3.%0!``/00!"1(`,,(%0%+*`1/%*#
!0`+*(5L`3$%$`%/`".`".+)`0$!`0.10$K
S`>7`T
.!0%*#`.1(5`!1/(!`+),+*!*0/ $,0!.`:
$%/`/!0%+*`%/`+1.`+,,+.01*%05`0+`)'!`%0`(!.`$+3`3!`*`1/!`0$!`/00!`%*`0$!`.%#$0`35
* `1* !./0* `3$5L`%*`/+)!`/!/L`3!` +`*+0`*!! `*5`!40!.*(`(%..%!/K
+RZLWZRUNV
,.0`".+)`0$!` %""!.!*!/`%*` !(.%*#`0$!`%*%0%(`/00!`1/%*#`0$!`"0+.5`+.`!40!* %*#`0$!
+),+*!*0L`0$!`%),+.0*0`+*!,0`3!W2!`(!.*! `%/`0$0`!$`/00!"1(`!0`+),+*!*0`*
$2!`*`%*%0%(`/00!K
* `3!`.1*`setState`3%0$``*!3`,.)!0!.`/`"+((+3/M
this.VHW6WDWH({
FOLNHG: true
});
$!`.!/1(0%*#`/00!`%/`/`"+((+3/M
{
FOLNHG: true,
WH[W: 'Click it!'
}
S`>8`T
.!0%*#`.1(5`!1/(!`+),+*!*0/ $,0!.`:
+3!2!.L`%*`/+)!`/!/L`3!`)5`3*0`0+`,!."+.)`/+)!`+,!.0%+*/`3$!*`0$!`/00!`%/
1, 0! L`* `!0`,.+2% !/``(('`"+.`0$0`/`"+((+3/M
this.VHW6WDWH({
FOLFNHG: true
}, () => {
console.ORJ('the state is now', this.VWDWH);
});
$V\QFKURQRXV
$!`setState`"1*0%+*`/$+1( `(35/`!`+*/% !.! `/5*$.+*+1/L`/`0$!`+""%%(
+1)!*00%+*`/5/M
X$!.!`%/`*+`#1.*0!!`+"`/5*$.+*+1/`+,!.0%+*`+"`((/`0+`/!000!`SKKKTX
"`3!`0.5`0+`(+#`0$!`1..!*0`2(1!`+"`0$!`/00!`%*0+`0$!`+*/+(!`"0!.`3!`"%.!`setState`%*`*
!2!*0`$* (!.L`3!`#!0`0$!`+( `/00!`2(1!M
KDQGOH&OLFN() {
this.VHW6WDWH({
FOLFNHG: true,
});
console.ORJ('the state is now', this.VWDWH);
}
UHQGHU() {
UHWXUQ EXWWRQ RQ&OLFN={this.KDQGOH&OLFN}!Click me!EXWWRQ!;
}
*0+`0$!`+*/+(!K`$!`.!/+*`0$%/`$,,!*/`%/`0$0`!0`'*+3/`$+3`0+`+,0%)%6!`0$!`/00!
1, 0!`%*/% !`!2!*0`$* (!./`* `%0`0$!/`0$!`+,!.0%+*`"+.`!00!.`,!."+.)*!K
+3!2!.L`%"`3!`$*#!`+1.`+ !``(%00(!`/`"+((+3/M
KDQGOH&OLFN() {
VHW7LPHRXW(() => {
this.VHW6WDWH({
FOLFNHG: true
});
S`>9`T
.!0%*#`.1(5`!1/(!`+),+*!*0/ $,0!.`:
});
}
$!`.!/1(0`%/`#+%*#`0+`!`/`"+((+3/M
the state is now Object {clicked: true}
(!/!`*+0%!`0$0`setTimeout`$/`!!*`1/! `%*`0$!`!4),(!`+*(5`0+`/$+3`0$!`!$2%+.`+"
!0L`10`5+1`/$+1( `*!2!.`3.%0!`!2!*0`$* (!./`%*`0$0`35K
8VLQJWKHVWDWH
+3`0$0`3!`'*+3`$+3`0$!`/00!`3+.'/L`%0`%/`%),+.0*0`0+`1* !./0* `3$!*`%0`/$+1( `!
1/! `* `3$!*`3!`/$+1( `2+% `/0+.%*#``2(1!`%*`0$!`/00!K
"`3!`"+((+3`0$!`.1(!/L`3!`*`!/%(5`"%#1.!`+10`3$!*``+),+*!*0`/$+1( `!`/00!(!//`+.
/00!"1(L`* `$+3`0+` !(`3%0$`0$!`/00!`0+`)'!`+1.`+),+*!*0`.!1/(!`.+//`0$!
,,(%0%+*K
*+0$!.`35`0+`"%#1.!`+10`3$!0$!.`0$!`/00!`%/`0$!`.%#$0`,(!`0+`/0+.!`%*"+.)0%+*`%/`0+
$!'`%"`0$!` 0`3!`.!`,!./%/0%*#`%/`*!! ! `+10/% !`0$!`+),+*!*0`%0/!("`+.`5`%0/`$%( .!*K
S`>:`T
.!0%*#`.1(5`!1/(!`+),+*!*0/ $,0!.`:
'HULYDEOHV
2!.5`0%)!`3!`*`+),10!`0$!`"%*(`2(1!`".+)`0$!`,.+,/L`3!`/$+1( `*+0`/0+.!`*5` 0
%*0+`0$!`/00!K
$%/`3+1( `3+.'`%"`3!`.!0!`%0`(%'!`0$%/`%*`0$!`,.!*0`+),+*!*0M
3ULFH FXUUHQF\="$" YDOXH="100" !
$!`,.+(!)`%/`0$0L`%"`0$!`1..!*5`+.`0$!`2(1!`$*#!/` 1.%*#`0$!`(%"!0%)!`+"
0$!`Price`+),+*!*0L`0$!`/00!`*!2!.`#!0/`.!(1(0! `Q!1/!`0$!`+*/0.10+.`%/`((!
+*!R`* `0$!`,,(%0%+*`/$+3/`0$!`3.+*#`,.%!K
$!.!"+.!L`3!`/$+1( `1/!`0$!`,.+,/`0+`(1(0!``2(1!`3$!*!2!.`3!`*K
S`>;`T
.!0%*#`.1(5`!1/(!`+),+*!*0/ $,0!.`:
7KHUHQGHUPHWKRG
!`/$+1( `(35/`'!!,`%*`)%* `0$0`/!00%*#`0$!`/00!`1/!/`0$!`+),+*!*0`0+`.!_.!* !.
* L`"+.`0$0`.!/+*L`3!`/$+1( `+*(5`/0+.!`%*`0$!`/00!`0$+/!`2(1!/`0$0`3!`.!`1/%*#`%*/% !
0$!`render`)!0$+ K
$!`"+((+3%*#`+ !`%/`3.+*#L`!1/!`3!`.!`/0+.%*#``2(1!`%*`0$!`/00!`0+`1/!`%0`(0!.L`10
3!` +`*+0`!//`%0`%*`+1.`render`)!0$+ L`* `3!`"%.!`*`1**!!//.5`render`3$!*`3!`/!0
0$!`*!3`/00!M
FRPSRQHQW'LG0RXQW() {
this.VHW6WDWH({
UHTXHVW: API.JHW(...);
});
}
FRPSRQHQW:LOO8QPRXQW {
this.state.request.DERUW();
}
*+0$!.`+))+*`/+(10%+*`"+.`0$%/`'%* `+"`/%010%+*`%/`0+`/0+.!`0$!`.!-1!/0`/``,.%20!
)!)!.`+"`0$!`+),+*!*0`%*/0*!M
FRPSRQHQW'LG0RXQW() {
this.UHTXHVW = API.JHW(...);
}
FRPSRQHQW:LOO8QPRXQW() {
this.request.DERUW();
}
*`0$0`35L`0$!`.!-1!/0`%/`!*,/1(0! `%*0+`0$!`+),+*!*0`3%0$+10`""!0%*#`0$!`/00!L`/+`%0
+!/`*+0`0.%##!.`*5` %0%+*(`.!* !.%*#`3$!*`0$!`2(1!`$*#!/K
$!`"+((+3%*#`$!0`/$!!0`".+)`*`.)+2`3%((`$!(,`5+1`)'!`0$!`.%#$0` !%/%+*M
IXQFWLRQ shouldIKeepSomethingInReactState() {
LI (FDQ,&DOFXODWH,W)URP3URSV()) {
'RQ WGXSOLFDWHGDWDIURPSURSVLQVWDWH
&DOFXODWHZKDW\RXFDQLQUHQGHU PHWKRG
UHWXUQ false;
}
S`><`T
.!0%*#`.1(5`!1/(!`+),+*!*0/ $,0!.`:
LI (!DP,8VLQJ,W,Q5HQGHU0HWKRG()) {
'RQ WNHHSVRPHWKLQJLQWKHVWDWH
LI\RXGRQ WXVHLWIRUUHQGHULQJ
)RUH[DPSOH$3,VXEVFULSWLRQVDUH
EHWWHURIIDVFXVWRPSULYDWHILHOGV
RUYDULDEOHVLQH[WHUQDOPRGXOHV
UHWXUQ false;
}
<RXFDQXVH5HDFWVWDWHIRUWKLV
UHWXUQ true;
}
5HDFWKRRNV
!0` ++'/`.!``*!3`"!01.!`%*`!0`8=K?K`$!5`(!0`1/`1/!`/00!L`* `+0$!.`!0`"!01.!/L
3%0$+10`3.%0%*#``(//`+),+*!*0L`"+.`!4),(!M
LPSRUW React, { useState } IURP 'react';
IXQFWLRQ Counter() {
WLPHVLVRXUQHZVWDWHYDULDEOHDQGVHW7LPHVWKHIXQFWLRQWRXSGDWH
WKDWVWDWH
FRQVW [times, setTimes] = XVH6WDWH(0); LVWKHLQLWLDOYDOXHRI
WLPHV
UHWXUQ (
GLYFODVV1DPH="Times"!
S!Times clicked: {WLPHV}S!
EXWWRQRQ&OLFN={() => VHW7LPHV(WLPHV + )}!Click it!EXWWRQ!
GLY!
);
}
H[SRUWGHIDXOW Counter;
IXQFWLRQ Form() {
FRQVW [data, setData] = XVH6WDWH({
QDPH: '',
DJH: 0
S`>=`T
.!0%*#`.1(5`!1/(!`+),+*!*0/ $,0!.`:
});
UHWXUQ (
GLYFODVV1DPH="Form"!
S!
LQSXW
QDPH="name"
W\SH="text"
RQ&KDQJH={(e) => VHW'DWD({
QDPH: e.target.YDOXH,
DJH: data.DJH
})}
!
S!
S!
LQSXW
QDPH="age"
W\SH="number"
RQ&KDQJH={(e) => VHW'DWD({
DJH: e.target.YDOXH,
QDPH: data.QDPH
})}
!
S!
S!
Name: {data.QDPH} EU!
Age: {data.DJH}
S!
GLY!
);
}
H[SRUWGHIDXOW Form;
3URSW\SHV
1.`#+(`%/`0+`3.%0!`0.1(5`.!1/(!`+),+*!*0/L`* `0+` +`0$0`3!`$2!`0+` !"%*!`0$!%.
%*0!."!`%*`0$!`(!.!/0`,+//%(!`35K
"`3!`3*0`+1.`+),+*!*0/`0+`!`.!1/! `.+//`0$!`,,(%0%+*L`%0`%/`.1%(`0+`)'!`/1.!
0$0`+1.`+),+*!*0/`* `0$!%.`,.)!0!./`.!`3!((_ !"%*! `* `/0.%#$0"+.3. `0+`1/!K
S`>>`T
.!0%*#`.1(5`!1/(!`+),+*!*0/ $,0!.`:
%0$`!0L`0$!.!`%/``,+3!."1(`0++(`0$0`(!0/`1/`!4,.!//L`%*``2!.5`/%),(!`35L`0$!`*)!`+"
0$!`,.+,/`0$0``+),+*!*0`!4,!0/`0+`.!!%2!L`* `/+)!`2(% 0%+*`.1(!/`"+.`!$`+*!`+"
0$!)K
$!`.1(!/`.!(0!`0+`0$!`05,!`+"`,.+,!.05L`/`3!((`/`0+`3$!0$!.`0$!`,.+,!.05`%/`+,0%+*(`+.
.!-1%.! K`$!.!`%/`(/+`0$!`+,0%+*`0+`3.%0!`1/0+)`2(% 0%+*`"1*0%+*/K
%*!`!0`8<K<K7L`0$!`PropTypes`00.%10!/`.!`*+`(+*#!.`,.0`+"`0$!
!0`+.!K` */0! L`5+1`*!! `0+`%*/0((``/!,.0!`,'#!`((! `prop-
types`0+`1/!`%0K
npm install --save-dev prop-types
!0W/`/0.0`3%0$``2!.5`/%),(!`!4),(!M
LPSRUW PropTypes IURP 'prop-types';
FRQVW Button = ({ text }) => EXWWRQ!{text}EXWWRQ!;
Button.SURS7\SHV = {
WH[W: PropTypes.VWULQJ
};
*`0$!`,.!2%+1/`/*%,,!0L`3!`.!0! ``/00!(!//`"1*0%+*(`+),+*!*0`0$0`.!!%2!/``0!40
,.+,`+"`0$!`string`05,!K
.!0`–`*+3`!2!.5` !2!(+,!.`0$0`+)!/`.+//`+1.`+),+*!*0`'*+3/`$+3`0+`1/!`%0`%*`0$!
.%#$0`35K
S`>?`T
.!0%*#`.1(5`!1/(!`+),+*!*0/ $,0!.`:
0`#%2!/`1/`(/+`/+)!`10%(%0%!/L`/1$`/`oneOfL`3$%$`!,0`*`..5`+"`05,!/`0$0`.!`2(%
"+.``,.0%1(.`,.+,!.05K
//%*#`/%*#(!`,.%)%0%2!`,.+,/`$!(,/`1/`0+`"%* `3$!0$!.``+),+*!*0`/1."!`%/`0++`3% !
* `3$!0$!.`+.`*+0`%0`/$+1( `!`/,(%0`%*0+`/)((!.`/1."!/K
+.`!4),(!L`%"`3!`.!`.!0%*#``Profile`+),+*!*0`0$0`*!! /``1/!.`+&!0`3%0$`
.!-1%.! `*)!`* `*`+,0%+*(`/1.*)!L`3!`*` !"%*!`%0`/`"+((+3/M
LPSRUW { shape, string } IURP 'prop-types';
FRQVW Profile = ({ user }) => (
GLY!{user.name} {user.surname}GLY!
);
Profile.SURS7\SHV = {
XVHU: VKDSH({
QDPH: string.LV5HTXLUHG,
VXUQDPH: string
}).LV5HTXLUHG
};
"`*+*!`+"`0$!`!4%/0%*#`!0`propTypes`/0%/"%!/`+1.`*!! /L`3!`*`.!0!``1/0+)
"1*0%+*`0+`2(% 0!``,.+,!.05M
XVHU: VKDSH({
DJH: (props, propName) => {
LI (!(props[SURS1DPH] > 0 && props[SURS1DPH] < 100)) {
UHWXUQ QHZ Error(`^SURS1DPH` must be between 1 and 99`);
}
S`>@`T
.!0%*#`.1(5`!1/(!`+),+*!*0/ $,0!.`:
UHWXUQ null;
}
})
5HDFW'RFJHQ
+3`0$0`0$!`+1* .%!/`+"`+1.`+),+*!*0`.!`3!((_ !"%*! `0$*'/`0+`0$!`,.+,`05,!/L`0$!.!
%/`*+0$!.`+,!.0%+*`0$0`3!`*` +`0+`)'!`0$!)`!/5`0+`1/!`* `/$.!K
!`*`10+)0%((5`.!0!` +1)!*00%+*`"+.`+1.`+),+*!*0/`/0.0%*#`".+)`0$!
!"%*%0%+*`+"`0$!`,.+,`05,!/K
+.`!4),(!L`%"`3!`#+`'`0+`0$!`"%./0`100+*`3!`.!0! M
LPSRUW { string } IURP 'prop-types';
* `0$!*`.1*`0$!`"+((+3%*#`+))* M
UHDFWGRFJHQEXWWRQMV
!`#!0`0$!`"+((+3%*#`+&!0`%*`.!01.*L`/`"+((+3/M
{
"GHVFULSWLRQ": "",
"PHWKRGV": [],
"SURSV": {
"WH[W": {
"W\SH": {
"QDPH": "string"
},
S`?7`T
.!0%*#`.1(5`!1/(!`+),+*!*0/ $,0!.`:
"UHTXLUHG": false,
"GHVFULSWLRQ": ""
}
}
}
$%/`%/`` `+&!0`0$0`.!,.!/!*0/`0$!`%*0!."!`+"`+1.`+),+*!*0/K`/`5+1`*`/!!L`0$!.!
%/``props`00.%10!`0$0`$/`+1.`0!40`,.+,!.05`+"`05,!`/0.%*#` !"%*! `%*/% !`%0K
"`3!`.1*`0$!`+))* `#%*L`0$!`.!/1(0`%/`/`"+((+3/M
{
"GHVFULSWLRQ": "A generic button with text.",
"PHWKRGV": [],
"SURSV": {
"WH[W": {
"W\SH": {
"QDPH": "string"
},
"UHTXLUHG": false,
"GHVFULSWLRQ": "The text of the button."
}
}
}
$!`"0`0$0`0$!`+10,10`%/`%*` `)'!/`0$!`0++(`2!.5`"(!4%(!L`!1/!`%0`%/`2!.5`!/5`0+
#!*!.0!`3!`,#!/`,,(5%*#` `+&!0/`0+`0!),(0!/K
S`?8`T
.!0%*#`.1(5`!1/(!`+),+*!*0/ $,0!.`:
5HXVDEOHFRPSRQHQWV
!`$2!`/!!*`3$0`0$!`!/0`35/`0+`.!0!`+),+*!*0/`.!L`* `0$!`/!*.%+/`3$!.!`%0
)'!/`/!*/!`0+`1/!``(+(`/00!K`!`$2!`(/+`/!!*`$+3`3!`*`)'!`+1.`+),+*!*0/
.!1/(!` !"%*%*#``(!.`%*0!."!`3%0$`0$!`prop`05,!/K
S`?9`T
.!0%*#`.1(5`!1/(!`+),+*!*0/ $,0!.`:
!`*`*+3`)+2!`%*0+`0$!`,.0`3$!.!`0$!`,+/0/`.!` %/,(5! M
UHQGHU() {
UHWXUQ (
XO!
{this.state.posts.PDS(post => (
OL NH\={post.LG}!
K!{post.WLWOH}K!
{post.H[FHUSW && S!{post.H[FHUSW}S!}
OL!
))}
XO!
);
}
S`?:`T
.!0%*#`.1(5`!1/(!`+),+*!*0/ $,0!.`:
1,(%0%*#`0$!`+ !`%/`1/1((5`*+0`0$!`!/0`/+(10%+*L`/+`(!0W/`/!!`$+3`!0`*`$!(,`1/`0+
'!!,`+1.`+ !`3%0$`+*W0`!,!0`+1./!("`QRK`$!`"%./0`/0!,`0+`.!0%*#``.!1/(!`List
+),+*!*0`%/`0+`/0.0`%0``(%00(!`* ` !+1,(!`%0`".+)`0$!` 0`%0`$/`0+` %/,(5L`* `3!` +
0$0`5` !"%*%*#``#!*!.%`+((!0%+*`,.+,!.05K`$!`)%*`.!-1%.!)!*0`%/`0$0L`"+.`0$!`,+/0/L
3!`3*0`0+` %/,(5`0$!`0%0(!`* `0$!`!4!.,0L`3$%(!L`"+.`0$!`1/!./L`3!`$2!`0+`/$+3`0$!
1/!.*)!`* `0$!`%+K
$!`,.+,/`+"`0$!`*!3`.!1/(!`List`+),+*!*0`.!`0$!`"+((+3%*#M
LPSRUW { array, string } IURP 'prop-types';
...
List.SURS7\SHV = {
FROOHFWLRQ: array,
WH[W.H\: string,
WLWOH.H\: string,
}
%*!`0$!`List`+),+*!*0`%/`*+0`#+%*#`0+`$2!`*5`/00!`+.`"1*0%+*L`3!`*`3.%0!`%0`/`
/00!(!//`"1*0%+*(`+),+*!*0M
FRQVW List = ({ collection, textKey, titleKey }) => (
XO!
{collection.PDS(item =>
,WHP
NH\={item.id}
WH[W={item[textKey]}
WLWOH={item[titleKey]}
!
)}
XO!
);
$!`List`+),+*!*0`.!!%2!/`0$!`,.+,/L`* `%0!.0!/`+2!.`0$!`+((!0%+*L`),,%*#`((`0$!
%0!)/`%*0+`*+0$!.`+),+*!*0`Q0$0`3!`.!`#+%*#`0+`.!0!`*!40RK`/`5+1`*`/!!L`3!`.!
,//%*#`0+`0$!`$%( .!*`0%0(!/`* `0!40`props`0$0`.!,.!/!*0`0$!`2(1!/`+"`0$!`)%*`00.%10!
* `0$!`+,0%+*(`+*!L`.!/,!0%2!(5K
$!`Item`+),+*!*0`%/`2!.5`/%),(!`* `(!*M
LPSRUW { string } IURP 'prop-types';
S`?;`T
.!0%*#`.1(5`!1/(!`+),+*!*0/ $,0!.`:
K!{title}K!
{text && S!{text}S!}
OL!
);
Item.SURS7\SHV = {
text: string,
title: string
};
.!0`–`3!`*`*+3`.!3.%0!`+1.`03+`+),+*!*0/L`PostsListL`* `UsersListL`0+`)'!
0$!)`1/!`0$!`#!*!.%`.!1/(!`(%/0`* `2+% ` 1,(%0%*#`+ !K
$!*L`3!`3%((`)+ %"5`0$!`UserList`"1*0%+*`/`"+((+3/M
FRQVW UserList = ({ users }) => (
/LVW
FROOHFWLRQ={users}
WH[W.H\="bio"
WLWOH.H\="username"
!
);
!`3!*0`".+)``/%*#(!_,1.,+/!`+),+*!*0`0+``.!1/(!`+*!`1/%*#`0$!`,.+,/`0+`.!0!`
#!*!.%`* `3!((_ !"%*! `%*0!."!K
0`%/`*+3`,+//%(!`0+`.!1/!`0$%/`+),+*!*0`/`)*5`0%)!/`/`3!`*!! `%*`+1.`,,(%0%+*L
* `!2!.5` !2!(+,!.`*`!/%(5`1* !./0* `$+3`0+`%),(!)!*0`%0`0$*'/`0+`0$!`,.+,`05,!/K
S`?<`T
.!0%*#`.1(5`!1/(!`+),+*!*0/ $,0!.`:
!`*`*+3`)'!`0$!`$*#!`0`+*!`/%*#(!`,+%*0L`* `((`0$!`+),+*!*0/`0$0`.!`1/%*#`%0
3%((`!*!"%0`".+)`0$!`)+ %"%0%+*K
)UDJPHQWV
%*!`2!./%+*`!0`8=K9K7`3!`.!`(!`0+`.!01.*`..5/`* `/0.%*#/`".+)`0$!`.!* !.`)!0$+ K
!"+.!L`!0`"+.! `1/`0+`.!01.*`*`!(!)!*0`3.,,! `3%0$`<div>`+.`*5`+0$!.`0#N`%0`3/
*+0`,+//%(!`0+`.!01.*`*`..5`+.`/0.%*#` %.!0(5M
([DPSOH5HWXUQLQJDQDUUD\RIHOHPHQWV
UHQGHU() {
1RZ\RXGRQ WQHHGWRZUDSOLVWLWHPVLQDQH[WUDHOHPHQW
UHWXUQ [
OLNH\="1"!First itemOL!,
OLNH\="2"!Second itemOL!,
OLNH\="3"!Third itemOL!
];
}
([DPSOH5HWXUQLQJDVWULQJ
UHQGHU() {
UHWXUQ 'Hello World!';
}
S`?=`T
.!0%*#`.1(5`!1/(!`+),+*!*0/ $,0!.`:
([DPSOH8VLQJHPSW\WDJV!!
UHQGHU() {
UHWXUQ (
!
<ComponentA />
<ComponentB />
<ComponentC />
!
);
}
([DPSOH8VLQJ5HDFW)UDJPHQW
UHQGHU() {
UHWXUQ (
5HDFW)UDJPHQW!
<h1>An h1 heading</h1>
Some text here.
<h2>An h2 heading</h2>
More text here.
Even more text here.
5HDFW)UDJPHQW!
);
}
([DPSOH,PSRUWLQJWKH)UDJPHQW
LPSRUW React, { )UDJPHQW } IURP 'react';
UHQGHU() {
UHWXUQ (
)UDJPHQW!
<h1>An h1 heading</h1>
Some text here.
<h2>An h2 heading</h2>
More text here.
Even more text here.
)UDJPHQW!
);
}
S`?>`T
.!0%*#`.1(5`!1/(!`+),+*!*0/ $,0!.`:
6XPPDU\
$!`&+1.*!5`0+`(!.*`$+3`0+`)'!`.!1/(!`+),+*!*0/`$/`+)!`0+`0$!`!* K
!`.!`*+3`.! 5`0+`(!.*`0$!`2.%+1/`0!$*%-1!/`3!`*`,10`%*`,(!`0+`+),+/!`+1.
+),+*!*0/K
*`0$!`*!40`$,0!.L`3!`3%((`0('`+10`0$!`+))1*%0%+*`!03!!*`+),+*!*0/`* ` +K
S`??`T
&RPSRVH$OOWKH7KLQJV
*`0$!`,.!2%+1/`$,0!.`QChapter 3L`.!0!`.1(5`!1/(!`+),+*!*0/RL`3!`/3`$+3`0+
.!0!`.!1/(!`+),+*!*0/`3%0$``(!*`%*0!."!K`+3L`%0W/`0%)!`0+`(!.*`$+3`0+`)'!
0$+/!`+),+*!*0/`+))1*%0!`3%0$`!$`+0$!.`!""!0%2!(5K
!0`%/`,+3!."1(`!1/!`%0`(!0/`5+1`1%( `+),(!4`,,(%0%+*/`+),+/%*#`/)((L`0!/0(!L
* `)%*0%*(!`+),+*!*0/K`,,(5%*#`0$%/`,. %#)L`5+1`*`0'!`+*0.+(`+"`!2!.5
/%*#(!`,.0`+"`0$!`,,(%0%+*K
*`0$%/`$,0!.L`3!`3%((`#+`0$.+1#$`/+)!`+"`0$!`)+/0`,+,1(.`+),+/%0%+*`,00!.*/`*
0++(/K
!`3%((`+2!.`0$!`"+((+3%*#`0+,%/M
&RPPXQLFDWLRQEHWZHHQFRPSRQHQWV
!1/%*#`"1*0%+*/`%/`+*!`+"`+1.`#+(/`/` !2!(+,!./L`* `3!`$2!`/!!*`$+3`!0`)'!/`%0
!/5`0+`.!0!`.!1/(!`+),+*!*0/K`!1/(!`+),+*!*0/`*`!`/$.! `.+//`)1(0%,(!
+)%*/`+"`5+1.`,,(%0%+*`0+`2+% ` 1,(%0%+*K
)((`+),+*!*0/`3%0$``(!*`%*0!."!`*`!`+),+/! `0+#!0$!.`0+`.!0!`+),(!4
,,(%0%+*/`0$0`.!`,+3!."1(`* `)%*0%*(!`0`0$!`/)!`0%)!K
+.`!4),(!L`5+1`*`.!0!``Profile`+),+*!*0`5`/%),(5`+),+/%*#
`Picture`+),+*!*0`0+` %/,(5`0$!`,.+"%(!`%)#!`* ``UserName`+),+*!*0`0+` %/,(5
0$!`*)!`* `0$!`/.!!*`*)!`+"`0$!`1/!.K
*`0$%/`35L`5+1`*`,.+ 1!`*!3`,.0/`+"`0$!`1/!.`%*0!."!`2!.5`-1%'(5L`3.%0%*#`+*(5`
"!3`(%*!/`+"`+ !K`$!*!2!.`5+1`+),+/!`+),+*!*0/L`/`%*`0$!`,.!! %*#`!4),(!L`5+1
/$.!` 0`!03!!*`0$!)`1/%*#`,.+,/K`.+,/`.!`0$!`35``,.!*0`+),+*!*0`*`,//`%0/
0` +3*`0$!`0.!!`0+`!2!.5`+),+*!*0`0$0`*!! /`%0`Q+.`,.0`+"`%0RK
$!*``+),+*!*0`,//!/`/+)!`,.+,/`0+`*+0$!.`+),+*!*0L`%0`%/`((! `0$!`+3*!.L
%..!/,!0%2!`+"`0$!`,.!*0_$%( `.!(0%+*/$%,`!03!!*`0$!)K
S`@7`T
+),+/!`((`0$!`$%*#/ $,0!.`;
&KLOGUHQ
$!.!`%/``/,!%(`,.+,`0$0`*`!`,//! `".+)`0$!`+3*!./`0+`0$!`+),+*!*0/` !"%*!
%*/% !`0$!%.`render`)!0$+ —$%( .!*K
+*/% !.`0$0`3!`$2!``Button`+),+*!*0`0$0`$/``0!40`,.+,!.05`.!,.!/!*0%*#`0$!`0!40
+"`0$!`100+*M
LPSRUW { string } IURP 'prop-types';
0`*`!`1/! `%*`0$!`"+((+3%*#`35M
%XWWRQ WH[W="Click me!" !
0`*`.!* !.`0$!`"+((+3%*#`+ !M
EXWWRQ FODVV="btn"!Click me!EXWWRQ!
+3L`/1,,+/!`3!`3*0`0+`1/!`0$!`/)!`100+*`3%0$`0$!`/)!`(//`*)!`%*`)1(0%,(!`,.0/
+"`+1.`,,(%0%+*L`* `3!`(/+`3*0`0+`!`(!`0+` %/,(5`)+.!`0$*``/%),(!`/0.%*#K`1.`
+*/%/0/`+"`100+*/`3%0$`0!40L`100+*/`3%0$`0!40`* `%+*/L`* `100+*/`3%0$`0!40`* `(!(/K
S`@8`T
+),+/!`((`0$!`$%*#/ $,0!.`;
,,(5%*#`0$%/`$*#!L`3!`.!`*+0`(%)%0! `0+``/%),(!`/%*#(!`0!40`,.+,!.05L`10`3!`*`,//
*5`!(!)!*0`0+`ButtonL`* `%0`%/`.!* !.! `%*`,(!`+"`0$!`children`,.+,!.05K
$%/`%/``,.!005`+*2!*%!*0`35`0+`((+3`+),+*!*0/`0+`!,0`*5`children`!(!)!*0/`*
3.,`0$+/!`!(!)!*0/`%*/% !``,.! !"%*! `,.!*0K
!`*`,//``/%*#(!`$%( L`/`/$+3*`%*`0$!`"+((+3%*#`+ !M
%XWWRQ!
VSDQ!Click me!VSDQ!
%XWWRQ!
S`@9`T
+),+/!`((`0$!`$%*#/ $,0!.`;
"`3!`,//``/%*#(!`$%( L`3!`#!0`0$!`"+((+3%*#`+10,10M
Failed prop type: Invalid prop `children` of type `object` supplied to
`Button`, expected `array`.
$%/`%/`!1/!L`3$!*``+),+*!*0`$/``/%*#(!`$%( L`!0`+,0%)%6!/`0$!`.!0%+*`+"`0$!
!(!)!*0/`* `2+% /`((+0%*#`*`..5`"+.`,!."+.)*!`.!/+*/K
!`*`!/%(5`"%4`0$%/`3.*%*#`5`/!00%*#`0$!`children`,.+,`0+`!,0`0$!`"+((+3%*#`prop
05,!/M
LPSRUW { oneOfType, array, element } IURP 'prop-types';
Button.SURS7\SHV = {
FKLOGUHQ: RQH2I7\SH([
DUUD\,
HOHPHQW
])
};
7KHFRQWDLQHUDQGSUHVHQWDWLRQDOSDWWHUQ
*`0$!`(/0`$,0!.L`3!`/3`$+3`0+`0'!``+1,(! `+),+*!*0`* `)'!`%0`.!1/(!`/0!,`5
/0!,K` *`0$%/`/!0%+*L`3!`3%((`/!!`$+3`0+`,,(5``/%)%(.`,00!.*`0+`+1.`+),+*!*0/`0+`)'!
0$!)`(!*!.`* `)+.!`)%*0%*(!K
!0`+),+*!*0/`05,%((5`+*0%*``)%4`+"`(+#%`* `,.!/!*00%+*K`5`(+#%L`3!`.!"!.`0+
*50$%*#`0$0`%/`1*.!(0! `0+`0$!` L`/1$`/` `((/L` 0`)*%,1(0%+*L`* `!2!*0
$* (!./K`$!`,.!/!*00%+*`%/L`%*/0! L`0$!`,.0`%*/% !`0$!`render`)!0$+ `3$!.!`3!`.!0!
0$!`!(!)!*0/`0+`!` %/,(5! `+*`0$!` K
1,,+/!`3!`$2!``+),+*!*0`0$0`1/!/`#!+(+0%+*` /`0+`#!0`0$!`,+/%0%+*`+"`0$!`1/!.L
* `%0` %/,(5/`0$!`(0%01 !`* `(+*#%01 !`+*`0$!`,#!`%*`0$!`.+3/!.K
S`@:`T
+),+/!`((`0$!`$%*#/ $,0!.`;
%./0L`3!`.!0!``Geolocation.js`"%(!`%*`+1.`+),+*!*0/`"+( !.
Qcomponents/Geolocation/index.jsxR`* ` !"%*!`0$!`Geolocation`+),+*!*0`1/%*#
`class`+),+*!*0M
FODVV Geolocation H[WHQGV Component
+3L`3!`*`1/!`0$!`componentDidMount`(('`0+`"%.!`0$!`.!-1!/0`0+`0$!` /M
FRPSRQHQW'LG0RXQW() {
LI (navigator.geolocation) {
navigator.geolocation.JHW&XUUHQW3RVLWLRQ(this.KDQGOH6XFFHVV);
}
}
$!*`0$!`.+3/!.`.!01.*/`0$!` 0L`3!`/0+.!`0$!`.!/1(0`%*0+`0$!`/00!`1/%*#`0$!`"+((+3%*#
"1*0%+*M
KDQGOH6XFFHVV({ coords: { latitude, longitude } }) {
this.VHW6WDWH({
ODWLWXGH,
ORQJLWXGH
});
}
%*((5L`3!`/$+3`0$!`latitude`* `longitude`1/%*#`0$!`render`)!0$+ M
UHQGHU() {
UHWXUQ (
GLY!
K!Geolocation:K!
GLY!Latitude: {this.state.ODWLWXGH}GLY!
GLY!Longitude: {this.state.ORQJLWXGH}GLY!
GLY!
);
}
S`@;`T
+),+/!`((`0$!`$%*#/ $,0!.`;
!`3%((`%/+(0!`0$!`,.!/!*00%+*(`,.0`+"`0$!`)%*`+),+*!*0`5`3$!*`"+((+3%*#`0$!
+*0%*!.`* `,.!/!*00%+*(`,00!.*K
*`0$%/`,00!.*L`!2!.5`+),+*!*0`%/`/,(%0`%*0+`03+`/)((!.`+*!/L`!$`+*!`3%0$`%0/`(!.
.!/,+*/%%(%0%!/K
$!`+*0%*!.`'*+3/`!2!.50$%*#`+10`0$!`(+#%`+"`0$!`+),+*!*0L`* `%0W/`3$!.!`0$!` /
.!`((! K` 0`(/+` !(/`3%0$` 0`)*%,1(0%+*`* `!2!*0`$* (%*#K
$!.!`.!`*+`.1(!/`0$0`/5`0$0`0$!`,.!/!*00%+*(`+),+*!*0`)1/0`*+0`$2!``/00!K`+.
!4),(!L`%0`+1( `'!!,`` `/00!`%*/% !`%0K` *`0$%/`/!L`3!`*!! ``+),+*!*0`0+` %/,(5`0$!
(0%01 !`* `(+*#%01 !L`/+`3!`.!`#+%*#`0+`1/!``/%),(!`"1*0%+*K
%./0`+"`((L`3!`/$+1( `.!*)!`+1.`Geolocation`+),+*!*0`0+`GeolocationContainerM
FODVV GeolocationContainer H[WHQGV Component
!`3%((`(/+`$*#!`0$!`"%(!*)!`".+)`Geolocation.js`0+`GeolocationContainer.jsxK
S`@<`T
+),+/!`((`0$!`$%*#/ $,0!.`;
H[SRUWGHIDXOW Geolocation;
!`/1.!(5`3*0`0+`"+((+3`0$!`!/0`,.0%!/`* ` !"%*!``(!.`%*0!."!`"+.`+1.`+),+*!*0L
/+`3!`1/!`propTypes`0+` !(.!`0$!`,.+,!.0%!/`0$0`0$!`+),+*!*0`*!! /M
Geolocation.SURS7\SHV = {
ODWLWXGH: number,
ORQJLWXGH: number
};
"`5+1`.1*`0$!`+),+*!*0/`%*`0$!`.+3/!.`0$!`"%./0`0%)!L`0$!`.+3/!.`3%((`.!-1%.!`5+1.
,!.)%//%+*`0+`((+3`%0`0+`'*+3`+10`5+1.`(+0%+*M
S`@=`T
+),+/!`((`0$!`$%*#/ $,0!.`;
"0!.`5+1`((+3`0$!`.+3/!.`0+`'*+3`5+1.`(+0%+*L`5+1`3%((`/!!`/+)!0$%*#`(%'!`0$%/M
0`0$!`/)!`0%)!L`+0$!.` !2!(+,!./`%*`+1.`0!)`*`%),.+2!`0$!`+*0%*!.`0$0`1/!/
#!+(+0%+*`5` %*#`/+)!`!..+._$* (%*#`(+#%L`3%0$+10`""!0%*#`%0/`,.!/!*00%+*K
!%*#`(!`0+`3+.'`%*`,.((!(`+*`0$!`/)!`+),+*!*0`%/``%#`3%*`"+.`0!)/L`!/,!%((5`"+.
0$+/!`+),*%!/`3$!.!`1%( %*#`%*0!."!/`%/`*`%0!.0%2!`,.+!//K
S`@>`T
+),+/!`((`0$!`$%*#/ $,0!.`;
*`0$!`+0$!.`$* L`,,(5%*#`0$%/`,00!.*`3%0$+10``.!(`.!/+*`*`#%2!`1/`0$!`+,,+/%0!
,.+(!)`* `)'!`0$!`+ !/!`(!//`1/!"1(`/`%0`%*2+(2!/`0$!`.!0%+*`+"`)+.!`"%(!/`*
+),+*!*0/K
*`#!*!.(L`0$!`.%#$0`,0$`0+`"+((+3`%/`/0.0%*#`3%0$``/%*#(!`+),+*!*0`* `/,(%00%*#`%0`+*(5
3$!*`0$!`(+#%`* `0$!`,.!/!*00%+*`!+)!`0++`+1,(! `3$!.!`0$!5`/$+1( *W0`!K
+*0%*!.`+),+*!*0/M
$!5`.!`)+.!`+*!.*! `3%0$`!$2%+.
$!5`.!* !.`0$!%.`,.!/!*00%+*(`+),+*!*0/
$!5`)'!` `((/`* `)*%,1(0!` 0
$!5` !"%*!`!2!*0`$* (!./
$!5`.!`3.%00!*`/`(//!/
.!/!*00%+*(`+),+*!*0/M
$!5`.!`)+.!`+*!.*! `3%0$`2%/1(`.!,.!/!*00%+*
$!5`.!* !.`0$!` `).'1,`Q+.`+0$!.`+),+*!*0/R
$!5`.!!%2!` 0`".+)`0$!`,.!*0/`%*`0$!`"+.)`+"`,.+,/
$!5`.!`+"0!*`3.%00!*`/`/00!(!//`"1*0%+*(`+),+*!*0/
0L[LQV
+),+*!*0/`.!`#.!0`0+`$%!2!`.!1/%(%05L`10`3$0`%"` %""!.!*0`+),+*!*0/`%*` %""!.!*0
+)%*/`/$.!`0$!`/)!`!$2%+.O
S`@?`T
+),+/!`((`0$!`$%*#/ $,0!.`;
%./0`+"`((L`)%4%*/`3+.'`+*(5`3%0$`0$!`createClass`"0+.5L`/+`%"`5+1`.!`1/%*#`(//!/L`5+1
**+0`1/!`)%4%*/L`* `0$0`%/`+*!`+"`0$!`.!/+*/`3$5`0$!%.`1/!`%/` %/+1.#! K
+`+))1*%0!`3%0$`0$!`+),+*!*0L`)%4%*/`1/1((5`1/!`0$!`/00!K
%0$`getInitialStateL`0$!`/00!`#!0/`%*%0%(%6! `3%0$`0$!`%*%0%(`innerWidth`+"`
3%* +3M
JHW,QLWLDO6WDWH() {
UHWXUQ {
LQQHU:LGWK: window.LQQHU:LGWK
};
}
+3L`3!`3*0`0+`'!!,`0.'`+"`0$!`$*#!/L`/+`3$!*`0$!`+),+*!*0`)+1*0/L`3!`/0.0
(%/0!*%*#`0+`0$!`3%* +3`.!/%6!`!2!*0M
FRPSRQHQW'LG0RXQW() {
window.DGG(YHQW/LVWHQHU('resize', this.KDQGOH5HVL]H);
}
!`(/+`3*0`0+`.!)+2!`0$!`!2!*0`(%/0!*!.`/`/++*`/`0$!`+),+*!*0`1*)+1*0/L`3$%$`%/
.%0%(L`0$1/`".!!%*#`0$!`)!)+.5`* `*+0`(!2%*#`1*1/! `(%/0!*!./`00$! `0+`0$!`3%* +3M
FRPSRQHQW:LOO8QPRXQW() {
window.UHPRYH(YHQW/LVWHQHU('resize', this.KDQGOH5HVL]H);
}
S`@@`T
+),+/!`((`0$!`$%*#/ $,0!.`;
/`5+1`*`/!!`".+)`0$!`,.!! %*#`/*%,,!0L`.!0%*#``)%4%*`%/`2!.5`/%)%(.`0+`.!0%*#`
+),+*!*0K
+3L`%"`3!`3*0`0+`1/!`0$!`)%4%*`%*`+1.`+),+*!*0L`3!`&1/0`$2!`0+`//%#*`%0`0+`0$!`..5`+"
)%4%*/L`3$%$`%/``,.+,!.05`+"`0$!`+&!0M
FRQVW MyComponent = React.FUHDWH&ODVV({
PL[LQV: [WindowResize],
UHQGHU() {
console.ORJ('window.innerWidth', this.state.LQQHU:LGWK);
...
}
});
.+)`0$%/`,+%*0`+*L`0$!`2(1!`+"`innerWidth`+"`0$!`3%* +3`3%((`!`2%((!`%*`0$!`/00!`+"
+1.`+),+*!*0L`* `0$!`+),+*!*0`3%((`.!_.!* !.`3%0$`0$!`1, 0! `2(1!`*5`0%)!
`innerWidth`$*#!/K
!`*`1/!`0$!`)%4%*`%*`)*5`+),+*!*0/`0``0%)!`* `(/+`1/!`)1(0%,(!`)%4%*/`"+.`!$
+),+*!*0K``*%!`"!01.!`+"`)%4%*/`%/`0$0`0$!5`*`)!.#!`(%"!`5(!`)!0$+ /`* `0$!`%*%0%(
/00!K
+.`!4),(!L`%"`3!`1/!`+1.`WindowResize`)%4%*`%*``+),+*!*0`3$!.!`3!`(/+` !"%*!
`componentDidMount`$++'L`+0$`3%((`!`!4!10! `%*`+. !.K
$!`/)!`$,,!*/`%*`0$!`/!`+"`)1(0%,(!`)%4%*/`0$0`1/!`0$!`/)!`(%"!`5(!`$++'/K
+3L`(!0W/`#+`0$.+1#$`0$!`,.+(!)/`+"`)%4%*/K` *`0$!`*!40`/!0%+*L`3!`3%((`/!!`3$0`0$!`!/0
0!$*%-1!`%/`0+`$%!2!`0$!`/)!`.!/1(0`3%0$+10`((`0$!`%//1!/`%0`1/1((5`.%*#/K
%./0`+"`((L`)%4%*/`/+)!0%)!/`1/!`%*0!.*(`"1*0%+*/`0+`+))1*%0!`3%0$`0$!`+),+*!*0K
S`877`T
+),+/!`((`0$!`$%*#/ $,0!.`;
+.`!4),(!L`+1.`WindowResize`)%4%*`+1( `!4,!0`0$!`+),+*!*0`0+`%),(!)!*0
`handleResize`"1*0%+*`* `#%2!` !2!(+,!./`0$!`".!! +)`+"` +%*#`/+)!`+,!.0%+*/`3$!*
0$!`/%6!`$*#!/L`%*/0! `+"`1/%*#`0$!`/00!`0+`0.%##!.`0$!`1, 0!K
*"+.01*0!(5L`0$!.!`%/`*+`35`"+.`1/`0+`'*+3`+"`0$!`(%/0`+"`)!0$+ /`0$0`$2!`0+`!
%),(!)!*0! K
$%/`%/`,.0%1(.(5` `"+.`)%*0%*%(%05`!1/!L`%"``+),+*!*0`1/!/`)1(0%,(!`)%4%*/L`%0
!* /`1,`%),(!)!*0%*#` %""!.!*0`)!0$+ /L`3$%$`)'!/`%0` %""%1(0`0+`!(%)%*0!`0$!`+ !
3$!*`/+)!`)%4%*/`.!`.!)+2! L`+.`0$!5`$*#!`0$!%.`!$2%+.K
`2!.5`+))+*`,.+(!)`3%0$`)%4%*/`%/`(/$%*#K`$+1#$`%0`%/`0.1!`0$0`!0`%/`/).0
!*+1#$`0+`)!.#!`(%"!`5(!`(('/L`%0`**+0` +`*50$%*#`%"`03+`)%4%*/` !"%*!`+.`.!-1%.!
0$!`/)!`"1*0%+*`*)!`+.`1/!`0$!`/)!`00.%10!`%*`0$!`/00!K
/`3!`/3`%*`0$!`WindowResize`!4),(!L`)%4%*/`0!* `0+`+))1*%0!`3%0$`0$!
+),+*!*0`1/%*#`0$!`/00!K`+L`"+.`!4),(!L``)%4%*`*`1, 0!``/,!%(`00.%10!`%*`0$!
/00!`+"``+),+*!*0L`* `0$!*`0$!`+),+*!*0`.!_.!* !./L`0'%*#`%*0+`+1*0`0$!`*!3
00.%10!K
S`878`T
+),+/!`((`0$!`$%*#/ $,0!.`;
+LJKHURUGHUFRPSRQHQWV
*`0$!`,.!2%+1/`/!0%+*L`3!`/3`$+3`)%4%*/`.!`1/!"1(`"+.`/$.%*#`"1*0%+*(%0%!/`!03!!*
+),+*!*0/`* `0$!`,.+(!)/`0$0`0$!5`.%*#`0+`+1.`,,(%0%+*/K
!0W/`/!!`%"`3!`*`,,(5`0$!`/)!`+*!,0`0+`!0`+),+*!*0/`* `$%!2!`+1.`#+(`+"
/$.%*#`"1*0%+*(%0%!/`!03!!*`+),+*!*0/`3$%(!`2+% %*#`0$!` +3*/% !/`+"`)%4%*/K
%./0`+"`((L`(!0W/`/!!`3$0`*`HoC`(++'/`(%'!M
FRQVW HoC = Component => EnhancedComponent;
1,,+/!`5+1`*!! `0+`00$`0$!`/)!`className`,.+,!.05`0+`!2!.5`+),+*!*0`"+.`/+)!
.!/+*K`+1`+1( `#+`* `$*#!`((`0$!`.!* !.`)!0$+ /` %*#`0$!`className`,.+,!.05
0+`!$`+"`0$!)L`+.`5+1`+1( `3.%0!`*` +`/1$`/`0$!`"+((+3%*#`+*!M
FRQVW withClassName = Component => props => (
&RPSRQHQW {...props} FODVV1DPH="my-class" !
);
$!`.!01.*! `"1*0%+*`%/``/00!(!//`"1*0%+*(`+),+*!*0`0$0`.!!%2!/`/+)!`,.+,/`*
.!* !./`0$!`+.%#%*(`+),+*!*0K`$!`+((!0! `,.+,/`.!`/,.! L`* ``className`,.+,!.05
3%0$`0$!`"my-class"`2(1!`%/`,//! `0+`%0K
S`879`T
+),+/!`((`0$!`$%*#/ $,0!.`;
!0W/`*+3`/!!`$+3`3!`*`1/!`0$!`withClassName` +`%*`+1.`+),+*!*0/K
%./0`+"`((L`3!`.!0!``/00!(!//`"1*0%+*(`+),+*!*0`0$0`.!!%2!/`0$!`(//`*)!`*
,,(%!/`%0`0+``div`0#M
LPSRUW { string } IURP 'prop-types';
.,,%*#`+1.`+),+*!*0/`%*0+`0$!`withClassName`"1*0%+*L`3!`!*/1.!`0$0`%0`.!!%2!/
0$!`className`,.+,!.05K
+3L`(!0W/`)+2!`+*`0+`/+)!0$%*#`)+.!`!4%0%*#`* `(!0W/`0.5`0+`0.*/"+.)
0$!`WindowResize`)%4%*`3!`/3`%*`0$!`,.!2%+1/`/!0%+*`%*0+`*` +`"1*0%+*`0$0`3!`*
.!1/!`.+//`+1.`,,(%0%+*K
*!`+"`0$!`%##!/0`,.+(!)/`3%0$`0$0`)%4%*`3/L`0$0`%0`3/`1/%*#`0$!`/00!`+"`0$!`
+),+*!*0`0+`,.+2% !`0$!`innerWidth`2(1!K
%./0`+"`((L`3!`$2!`0+`.!0!``"1*0%+*`0$0`.!!%2!/``ComponentM
FRQVW withInnerWidth = Component => (
FODVV H[WHQGV React.&RPSRQHQW { ... }
);
S`87:`T
+),+/!`((`0$!`$%*#/ $,0!.`;
1.`withInnerWidth`"1*0%+*`3%((`.!01.*``(//`+),+*!*0`%*/0! `+"
`"1*0%+*(`/00!(!//`+),+*!*0`!1/!L`/`3!`/3`%*`0$!`,.!2%+1/`!4),(!L`3!`*!!
%0%+*(`"1*0%+*/`* `/00!K
!0W/`/!!`3$0`0$!`.!01.*! `(//`(++'/`(%'!K
/`5+1`)5`*+0!`$!.!L`3!`.!`/,.! %*#`0$!`,.+,/`/`3!`/3`!"+.!L`10`3!`.!`(/+
/,.! %*#`0$!`stateK
!`.!`/0+.%*#`0$!`innerWidth`2(1!`%*/% !`0$!`/00!`0+`$%!2!`0$!`+.%#%*(`!$2%+.L`10
3!` +`*+0`,+((10!`0$!`/00!`+"`0$!`+),+*!*0N`3!`1/!`,.+,/`%*/0! K
S`87;`T
+),+/!`((`0$!`$%*#/ $,0!.`;
!`.!0!``/00!(!//`"1*0%+*(`+),+*!*0`0$0`!4,!0/`innerWidth`/``,.+,!.05M
FRQVW MyComponent = ({ innerWidth }) => {
console.ORJ('window.innerWidth', LQQHU:LGWK);
...
};
MyComponent.SURS7\SHV = {
LQQHU:LGWK: number
};
!`!*$*!`%0`/`"+((+3/M
FRQVW MyComponentWithInnerWidth = ZLWK,QQHU:LGWK(MyComponent);
*`0$%/`,.0%1(.`/!L`3!`+1( `.!0!``+),+*!*0`"+.`!$`+"`0$!
%""!.!*0`innerWidth`/%6!/`3!`/1,,+.0K
+*/% !.`0$!`"+((+3%*#`!4),(!M
0\&RPSRQHQW LQQHU:LGWK={320} !
.`+*/% !.`0$!`"+((+3%*#M
0\&RPSRQHQW LQQHU:LGWK={960} !
5HFRPSRVH
/`/++*`/`3!`!+)!`")%(%.`3%0$` +/L`3!`.!(%6!`$+3`,+3!."1(`0$!5`.!`* `$+3`3!
*`#!0`0$!`)+/0`+10`+"`0$!)K
$!` +/`0$0`0$!`(%..5`+""!./`.!`/)((`10%(%0%!/`0$0`3!`*`1/!`0+`3.,`+1.`+),+*!*0/L
)+2%*#`35`".+)`/+)!`+"`0$!%.`(+#%`* `)'%*#`0$!)` 1)!.`* `)+.!`.!1/(!K
S`87<`T
+),+/!`((`0$!`$%*#/ $,0!.`;
!00%*#`+),+*!*0/`.!!%2!`.%0..5`+&!0/`%/`*+0``#++ `,.0%!`!1/!`%0`.!(%!/`+*`0$!
"0`0$0`0$!`+),+*!*0`'*+3/`0$!`/$,!`+"`0$!`+&!0`* L`)+/0`%),+.0*0(5L`%"`0$!`+&!0
$*#!/L`0$!`+),+*!*0`.!'/K
`!00!.`35`"+.``+),+*!*0`0+`.!!%2!`,.+,/`".+)`0$!`,.!*0`%/`0+` !"%*!`!$`/%*#(!
,.+,!.05`1/%*#`,.%)%0%2!/K
"`5+1`3*0`0+`$*#!`%0/`%*0!."!`0+`.!!%2!`/%*#(!`,.+,/`%*/0! `+"`0$!`"1((`1/!.`+&!0L`3!
*` +`/+`3%0$`0$!`flattenProp` +`,.+2% ! `5`.!+),+/!K
!0W/`/!!`$+3`%0`3+.'/K
!`"%./0`$*#!`0$!`+),+*!*0`0+` !(.!`/%*#(!`,.+,!.0%!/L`/`"+((+3/M
FRQVW Profile = ({ XVHUQDPH, DJH }) => (
GLY!
GLY!Username: {XVHUQDPH}GLY!
GLY!Age: {DJH}GLY!
GLY!
);
Profile.SURS7\SHV = {
XVHUQDPH: string,
DJH: number
};
$!*L`3!`!*$*!`%0`3%0$`0$!` +M
FRQVW ProfileWithFlattenUser = IODWWHQ3URS('user')(3URILOH);
S`87=`T
+),+/!`((`0$!`$%*#/ $,0!.`;
$!%.`/%#*01.!`%/`/+)!0$%*#`/%)%(.`0+`0$!`"+((+3%*#M
FRQVW HoC = DUJV => &RPSRQHQW => (QKDQFHG&RPSRQHQW;
.!0P`+3L`/1,,+/!`"+.`/+)!`.!/+*`0$0`3!`3*0`0+`$*#!`0$!`00.%10!`1/!.*)!`0+
)'!`0$%/`+),+*!*0`)+.!`#!*!.%`* `.!1/(!K
!.!`%/`3$!.!`0$!`compose`"1*0%+*`+"`.!+),+/!`+)!/`%*`$* 5K
$!*L`3!`*`,,(5`%0`0+`+1.`+),+*!*0`%*`0$!`"+((+3%*#`35M
FRQVW EnhancedProfile = HQKDQFH(Profile);
$%/`%/`)+.!`+*2!*%!*0`* `!(!#*0K
S`87>`T
+),+/!`((`0$!`$%*#/ $,0!.`;
!`*`+*0!*0!`)1(0%,(!` +/`0+`'!!,`+1.`+),+*!*0/`/`/%),(!`/`,+//%(!K
0`%/`%),+.0*0`*+0`0+`1/!` +/`!1/!`3%0$`!2!.5`/0.0%+*`+)!/`,.+(!)/N`%*`0$%/
/!L`0$!`0. !_+""`%/`.!(0! `0+`,!."+.)*!K
+1`$2!`0+`0$%*'`0$0`!2!.5`0%)!`5+1`3.,``+),+*!*0`%*0+``$%#$!.`+. !.`+*!L`5+1`.!
%*#``*!3`.!* !.`"1*0%+*L``*!3`(%"!`5(!`)!0$+ `((L`* `)!)+.5`((+0%+*K
+.`0$0`.!/+*L`%0`%/`%),+.0*0`0+`0$%*'`.!"1((5`+10`3$!*`%0`)'!/`/!*/!`0+`1/!`*` +
* `3$!*`%0`%/`!00!.`0+`.!0$%*'`5+1.`/0.101.!K
&RQWH[W
+/`+)!`%*`2!.5`$* 5`3$!*`3!`$2!`0+` !(`3%0$`+*0!40K
+3!2!.L`%*`/+)!`/!*.%+/L`%0`%/``2!.5`,+3!."1(`0++(`0$0`*`$!(,`1/`,//`%*"+.)0%+*
+3*`0+`0$!`0.!!`3%0$+10`1/%*#`,.+,/`0`!2!.5`(!2!(K
+`#!0`0$!`!*!"%0/`+"`+*0!40`3%0$+10`+1,(%*#`+1.`+),+*!*0/`0+`%0/` /L`3!`*`1/!`*
+K
S`87?`T
+),+/!`((`0$!`$%*#/ $,0!.`;
(/+L`%"`0$!` /`+"`0$!`+*0!40`$*#!`%*`0$!`"101.!L`0$!`+*(5`,.0`+"`0$!`,,(%0%+*`0$0`$/
0+`!`$*#! `%/`0$!` +`!1/!`0$!`+),+*!*0/`.!` !+1,(! `".+)`%0L`3$%$`%/``%#
3%*K
$!.!`%/``"1*0%+*`0$0W/`,.+2% ! `5`.!+),+/!`0$0`)'!/`1/%*#`+*0!40`%*``0.*/,.!*0
35`* `.!!%2%*#`,.+,/`2!.5`!/5`* `/0.%#$0"+.3. N`(!0W/`/!!`$+3`%0`3+.'/K
!0W/`/0.0`3%0$``+*0!40_3.!`+),+*!*0`* `(!0W/`0.*/"+.)`%0`/0!,`5`/0!,`%*0+`
.!1/(!`+*!L`0$*'/`0+` +/M
FRQVW Price = ({ value }, { currency }) => (
GLY!{FXUUHQF\}{YDOXH}GLY!
);
Price.SURS7\SHV = {
YDOXH: number
};
Price.FRQWH[W7\SHV = {
FXUUHQF\: string
};
!`$2!``/00!(!//`"1*0%+*(`+),+*!*0`0$0`.!!%2!/`0$!`2(1!`/``,.+,!.05`* `0$!
1..!*5`/`0$!`/!+* `,.)!0!.`".+)`0$!`+*0!40K
%./0`+"`((L`(!0W/`$*#!`0$!`+),+*!*0`0+`#!0`+0$`2(1!/`".+)`0$!`,.+,/M
FRQVW Price = ({ currency, value }) => (
GLY!{currency}{value}GLY!
);
Price.SURS7\SHV = {
FXUUHQF\: string,
YDOXH: number
};
S`87@`T
+),+/!`((`0$!`$%*#/ $,0!.`;
"`+1./!L`3!`**+0`/1/0%010!`%0`3%0$`0$!`,.!2%+1/`+*!`/0.%#$035`!1/!`*+`,.!*0/
.!`/!00%*#`%0/`1..!*5`,.+,K`$0`3!`*` +`%/`3.,`%0`%*0+`*` +`0$0`*`0.*/"+.)`0$!
2(1!/``0$0`.!`.!!%2! `".+)`0$!`+*0!40`%*0+`,.+,/K`!`.!`1/%*#`0$!
getContext`"1*0%+*`".+)`.!+),+/!L`10`5+1`*`!/%(5`3.%0!``1/0+)`3.,,!.`".+)
/.0$K
$!*L`3!`,,(5`%0`0+`0$!`+),+*!*0M
FRQVW PriceWithCurrency = ZLWK&XUUHQF\(Price);
$%/`%/``%#`3%*`!1/!`3!` % `*+0`$2!`0+`$*#!`0$!`,.!*0L`3!`*`1/!`0$!`+*0!40
3%0$+10`3+..5%*#`+10`"101.!` `$*#!/L`* `0$!`Price`+),+*!*0`%/`*+3`.!1/(!K
)XQFWLRQ$V&KLOG
$!.!`%/``,00!.*`0$0`%/`#%*%*#`+*/!*/1/`3%0$%*`0$!`!0`+))1*%05L`* `%0`%/`'*+3*
/`FunctionAsChildK` 0`%/`3% !(5`1/! `%*`0$!`,+,1(.`(%..5`react-motionL`3$%$`3!
3%((`/!!`%*`Chapter 6L`.%0!`+ !`"+.`0$!`.+3/!.K
!0W/`/!!`3$0`%0`(++'/`(%'!M
FRQVW FunctionAsChild = ({ children }) => FKLOGUHQ();
FunctionAsChild.SURS7\SHV = {
FKLOGUHQ: func.LV5HTXLUHG
};
/`5+1`*`/!!L`FunctionAsChild`%/``+),+*!*0`0$0`$/``children`,.+,!.05` !"%*!
/``"1*0%+*`* L`%*/0! `+"`!%*#`1/! `/`` `!4,.!//%+*L`%0`#!0/`((! K
S`887`T
+),+/!`((`0$!`$%*#/ $,0!.`;
!0W/` !(2!`%*0+``)+.!`)!*%*#"1(`!4),(!`3$!.!`0$!`,.!*0`+),+*!*0`,//!/`/+)!
,.)!0!./`0+`0$!`children`"1*0%+*K
.!0!``Name`+),+*!*0`0$0`!4,!0/``"1*0%+*`/`children`* `,//!/`%0`0$!
/0.%*#`WorldM
FRQVW Name = ({ children }) => FKLOGUHQ('World');
Name.SURS7\SHV = {
FKLOGUHQ: func.LV5HTXLUHG
};
$!`"%./0`!*!"%0`%/`0$0`3!`*`3.,`+),+*!*0/L`,//%*#`0$!)`2.%(!/`0`.1*0%)!`.0$!.
0$*`"%4! `,.+,!.0%!/L`/`3!` +`3%0$` +/K
S`888`T
+),+/!`((`0$!`$%*#/ $,0!.`;
/0`10`*+0`(!/0L`0$!`3.,,!.`%/`$%#$(5`.!1/(!`!1/!`%0` +!/`*+0`)'!`*5`//1),0%+*/
+10`0$!`$%( .!*`%0`.!!%2!/—%0`&1/0`!4,!0/``"1*0%+*K
6XPPDU\
*`0$%/`$,0!.L`3!`(!.*! `$+3`0+`+),+/!`+1.`.!1/(!`+),+*!*0/`* `)'!`0$!)
+))1*%0!`!""!0%2!(5K`.+,/`.!``35`0+` !+1,(!`+),+*!*0/`".+)`!$`+0$!.`*
.!0!``(!*`* `3!((_ !"%*! `%*0!."!K
$!*L`3!`3!*0`0$.+1#$`/+)!`+"`0$!`)+/0`%*0!.!/0%*#`+),+/%0%+*`,00!.*/`%*`!0K`$!
"%./0`+*!`3/`0$!`/+_((! `+*0%*!.`* `,.!/!*00%+*(`,00!.*L`3$%$`$!(,/`1/`/!,.0!`0$!
(+#%`".+)`0$!`,.!/!*00%+*`* `.!0!`)+.!`/,!%(%6! `+),+*!*0/`3%0$``/%*#(!
.!/,+*/%%(%05K
!`/3`$+3`!0`0.%! `0+`/+(2!`0$!`,.+(!)`+"`/$.%*#`"1*0%+*(%0%!/`!03!!*
+),+*!*0/`3%0$`)%4%*/K`*"+.01*0!(5L`)%4%*/`/+(2!`0$+/!`,.+(!)/`5` %*#`/!2!.(
+0$!.`+*!/L`* `0$!5`""!0`0$!`)%*0%*%(%05`+"`+1.`,,(%0%+*/K`*!`35`0+`$%!2!`0$!
/)!`#+(`3%0$+10` %*#`+),(!4%05`%/`5`1/%*#` +/L`3$%$`.!`"1*0%+*/`0$0`0'!`
+),+*!*0`* `.!01.*`*`!*$*! `+*!K
S`889`T
3URSHU'DWD)HWFKLQJ
$!`#+(`+"`0$%/`$,0!.`%/`0+`/$+3`0$!` %""!.!*0` 0`"!0$%*#`,00!.*/`0$0`3!`*`,10`%*
,(!`%*``!0`,,(%0%+*K`+`"%* `0$!`!/0`/0.0!#5L`3!`$2!`0+`1* !./0* `$+3`0$!` 0
"(+3/`3%0$%*``0.!!`+"`+),+*!*0/`%*`!0K
%*((5L`3!`3%((`/!!`$+3`!4%/0%*#`(%..%!/`/1$`/`react-refetch.`*`/2!`1/``(+0`+"
0%)!`5`,.+2% %*#`0$!`+.!` 0`"!0$%*#`"1*0%+*(%0%!/`3!`*!! K
*`0$%/`$,0!.L`3!`3%((`+2!.`0$!`"+((+3%*#`0+,%/M
'DWDIORZ
*`0$!`(/0`03+`$,0!./L`3!`/3`$+3`0+`.!0!`/%*#(!`.!1/(!`+),+*!*0/`* `$+3`0+
+),+/!`0$!)`0+#!0$!.`!""!0%2!(5K`+3L`%0`%/`0%)!`0+`(!.*`$+3`0+`1%( ``,.+,!.` 0`"(+3
"+.`/$.%*#` 0`.+//`)1(0%,(!`+),+*!*0/`%*`+1.`,,(%0%+*K
!0`!*"+.!/``2!.5`%*0!.!/0%*#`,00!.*`0+`)'!` 0`#+`".+)`0$!`.++0`0+`0$!`(!2!/K`$%/
,00!.*`%/`1/1((5`((! `1*% %.!0%+*(` 0`"(+3L`* `3!`3%((`(++'`0`%0`%*` !0%(`%*`0$%/
/!0%+*K
$%/`,,.+$`3%((`(!0`1/`/!!`0$!`!/0`,00!.*/`0+`,,(5`%*`!$`,$/!`0+`(!0`0$!` 0`"(+3
.+//`0$!`0.!!K
!`3%((`/0.0`5`.!0%*#``(//`0$0`!40!* /`0$!`Component`"1*0%+*`".+)`!0M
FODVV Counter H[WHQGV Component
S`88;`T
.+,!.`0`!0$%*# $,0!.`<
FRXQWHU: 0
};
this.KDQGOH'HFUHPHQW = this.handleDecrement.ELQG(this);
this.KDQGOH,QFUHPHQW = this.handleIncrement.ELQG(this);
}
&KLOGSDUHQWFRPPXQLFDWLRQ FDOOEDFNV
$!.!`.!`*+`)&+.`%//1!/`3%0$`0$%/`+),+*!*0L`,.0`".+)`0$!`"0`0$0`%0` +!/`)1(0%,(!
0$%*#/M
0`%/`(35/`#++ `,.0%!`0+`/,(%0`+),+*!*0/`%*0+`/)((!.`+*!/L`!$`3%0$``2!.5`/,!%"%
!$2%+.L`0+`%),.+2!`0$!`)%*0%*%(%05`+"`0$!`,,`* `)'!`%0`"(!4%(!`3$!*`.!-1%.!)!*0/
$*#!K
S`88<`T
.+,!.`0`!0$%*# $,0!.`<
0`%/``/%),(!L`/00!(!//`"1*0%+*(`+),+*!*0`3$!.!`0$!`onClick`!2!*0`$* (!./`"%.!`0$!
"1*0%+*/`.!!%2! `".+)`0$!`,.+,/K`+3L`%0`%/`0%)!`0+`/!!`$+3`0+`%*0!#.0!`0$%/`*!3
+),+*!*0`%*0+`0$!`CounterK
!`&1/0`.!,(!`0$!`+.%#%*(`).'1,`3%0$`0$!`+),+*!*0L`,//%*#`0$!`%*0!.*(`"1*0%+*/`0+
0$!`*!3`$%( L`/`"+((+3/M
UHQGHU() {
UHWXUQ (
GLY!
K!{this.state.FRXQWHU}K!
%XWWRQV
RQ'HFUHPHQW={this.KDQGOH'HFUHPHQW}
RQ,QFUHPHQW={this.KDQGOH,QFUHPHQW}
!
GLY!
);
}
S`88=`T
.+,!.`0`!0$%*# $,0!.`<
2!.50$%*#`!(/!`.!)%*/`0$!`/)!L`* `0$!`(+#%`%/`/0%((`%*`0$!`,.!*0`+),+*!*0K`$!
100+*/`.!`*+3` 1)L`* `0$!5`.!`+*(5`(!`0+`*+0%"5`0$!%.`+3*!.`3$!*`0$!5`.!`(%'!
+*K
&RPPRQSDUHQW
+3L`0$!`Counter`(++'/``%0`!00!.L`* `0$!`Buttons`.!`.!1/(!K`$!`(/0`0$%*#`0+`!
+*!`0+`(!*`%0`1,`+),(!0!(5`%/`0+`.!)+2!`0$!` %/,(5`(+#%`".+)`%0K
#%*L`3!`*`1/!``/00!(!//`"1*0%+*(`+),+*!*0`!1/!`0$!.!`%/`*+`*!! `0+`'!!,`*5
/00!K`/`5+1`)5`*+0!`$!.!L`/,(%00%*#`0$%/`+),+*!*0`%/`*+0`*!! ! `!1/!`%0`&1/0
.!* !./`*`h1`!(!)!*0K` +3!2!.L`%*`5+1.`,,(%0%+*L`5+1`)5` ``(//!/L` %/,(5
(+#%`0+`$*#!`0$!`+(+.`+"`0$!`+1*0!.`+. %*#`0+`%0/`2(1!L`* `/+`+*K
*`#!*!.(L`+1.`#+(`%/`0+`)'!`+),+*!*0/`1*3.!`+"`0$!` 0`/+1.!`/+`0$0`3!`*`.!1/!
0$!)`3%0$` %""!.!*0`/+1.!/`%*`2.%+1/`,.0/`+"`0$!`,,(%0%+*K
/%*#`0$!`*!3`+),+*!*0`%*`0$!`Counter`%/`!/5K`!`&1/0`$2!`0+`.!,(!`0$!`+( `).'1,
3%0$`0$!`Display`+),+*!*0L`/`"+((+3/M
UHQGHU() {
UHWXUQ (
GLY!
'LVSOD\FRXQWHU={this.state.FRXQWHU} !
%XWWRQV
RQ'HFUHPHQW={this.KDQGOH'HFUHPHQW}
RQ,QFUHPHQW={this.KDQGOH,QFUHPHQW}
!
GLY!
);
}
S`88>`T
.+,!.`0`!0$%*# $,0!.`<
/`5+1`*`/!!`$!.!L`03+`/%(%*#`+),+*!*0/`.!`+))1*%0%*#`0$.+1#$`0$!%.`+))+*
,.!*0K
'DWDIHWFKLQJ
*`0$!`,.!! %*#`/!0%+*L`3!`/3`0$!` %""!.!*0`,00!.*/`3!`*`,10`%*`,(!`0+`/$.!` 0
!03!!*`+),+*!*0/`%*`0$!`0.!!K` 0`%/`*+3`0%)!`0+`2%!3`$+3`0+`"!0$` 0`%*`!0`*
3$!.!`0$!` 0`"!0$%*#`(+#%`/$+1( `!`(+0! K`$!`!4),(!/`%*`0$%/`/!0%+*`1/!`0$!`fetch
"1*0%+*`0+`)'!`3!`.!-1!/0/L`3$%$`%/``)+ !.*`.!,(!)!*0`"+.`XMLHttpRequestK
S`88?`T
.+,!.`0`!0$%*# $,0!.`<
$!*L`3!` !"%*!``constructorL`3$!.!`3!`%*%0%(%6!`0$!`stateM
FRQVWUXFWRU(props) {
VXSHU(props);
this.VWDWH = {
JLVWV: []
};
}
+3`+)!/`0$!`%*0!.!/0%*#`,.0M` 0`"!0$%*#K`$!.!`.!`03+`(%"!`5(!`$++'/`3$!.!
3!`*`,10`0$!` 0`"!0$%*#M`componentWillMount`* `componentDidMountK
!`3%((`0$!*`1/!`0$!`componentDidMount`$++'`/+`0$0`3!`*`!`/1.!`0$0`0$!`
!* ,+%*0`%/`((! `+*`0$!`.+3/!.`+*(5K
S`88@`T
.+,!.`0`!0$%*# $,0!.`<
+1`)%#$0`$2!`*+0! `0$!`'!5`00.%10!`+"`<li>K`!`1/!`%0`"+.`,!."+.)*!`.!/+*/`0$0`5+1
3%((`1* !./0* `5`0$!`!* `+"`0$%/`++'K` "`5+1`0.5`0+`.!)+2!`0$!`00.%10!L`5+1`3%((`#!0`
3.*%*#`".+)`!0`%*/% !`0$!`.+3/!.W/`+*/+(!K
+2%*#`0$!`+),+*!*0`35`%/`*+0``,.+(!)`!1/!`3!`$2!`/!!*`$+3`+),+*!*0/`%*
%""!.!*0`,.0/`+"`0$!`,,(%0%+*`*`.!!%2!`0$!` 0`0$!5`*!! `".+)`0$!%.`,.!*0/K
!`.!`#+%*#`0+`1/!`0$!`,.0%(`,,(%0%+*`0+`.!!%2!`0$!`,.)!0!./`"%./0L`* `0$!*`0$!
01(`+),+*!*0`/`0$!`/!+* `,.)!0!.M
FRQVW withData = url => &RPSRQHQW => (...);
!`$2!`((! `0$!`withData`"1*0%+*L`"+((+3%*#`0$!`with*`,00!.*K
S`897`T
.+,!.`0`!0$%*# $,0!.`<
$!`%),(!)!*00%+*`%/`,.!005`/%)%(.`0+`0$!`+),+*!*0`%*`0$!`,.!! %*#`!4),(!L`,.0
".+)`0$!`"0`0$0`0$!``%/`*+3``,.)!0!.`* L`%*/% !`0$!`.!* !.`)!0$+ L`3!`1/!`0$!
$%( `+),+*!*0K
0`$/``+*/0.10+.`0+`/!0`0$!`%*%0%(`!),05`/00!K
0`%/`%),+.0*0`0+`*+0!`0$0`0$!``%/`*+3`/!0`1/%*#`0$!`"%./0`,.)!0!.`0$0W/`.!!%2! `".+)
0$!` +K` *`0$%/`35L`3!`*`.!1/!`%0`0+`)'!`*5` `((`0+`*5`!* ,+%*0K
!0W/`/!!`$+3`0+`3!`*`1/!`%0K
S`898`T
.+,!.`0`!0$%*# $,0!.`<
$%/`%/`#.!0`!1/!`3!`*`*+3`3.,`*5`+),+*!*0`3%0$`0$!`*!3`withGists`"1*0%+*
* `%0`3%((`.!!%2!`#!.+*W/`#%/0/`3%0$+10`/,!%"5%*#`0$!``)1(0%,(!`0%)!/K
%*((5L`3!`3.,`0$!`+),+*!*0`* `#!0``*!3`+*!M
FRQVW ListWithGists = ZLWK*LVWV(List);
*"+.01*0!(5L`0$!`,.+,/`.!`1*'*+3*`0`0$!`)+)!*0`3!`,,(5`0$!` +L`/+`3!`*!! `
$++'`0$0`%/`((! `3$!*`0$!`,.+,/`.!`2%((!`* `!"+.!`)'%*#`0$!` `((K
S`899`T
.+,!.`0`!0$%*# $,0!.`<
"`0$!``%/``"1*0%+*L`3!`"%.!`%0`5`,//%*#`0$!`,.+,/`/`,.)!0!./L`3$%(!`%"`%0`%/``/0.%*#L
3!`1/!`%0` %.!0(5K
!`*`*+3`1/!`0$!` +`%*`0$!`"+((+3%*#`35M
FRQVW withGists = ZLWK'DWD(
SURSV => `https://api.github.com/users/${props.username}/gists`
);
!.!L`0$!`1/!.*)!`"+.`(+ %*#`0$!`#%/0/`*`!`/!0`%*`0$!`,.+,/`+"`0$!`+),+*!*0M
/LVW:LWK*LVWV XVHUQDPH="gaearon" !
5HDFWUHIHWFK
+3L`+1.` +`3+.'/`/`!4,!0! `* `3!`*`.!1/!`%0`.+//`0$!`+ !/!`3%0$+10`*5
,.+(!)/K`$!`-1!/0%+*`%/L`3$0`/$+1( `3!` +`%"`3!`*!! `)+.!`"!01.!/O
S`89:`T
.+,!.`0`!0$%*# $,0!.`<
.+)`0$!`,.!2%+1/`/!0%+*L`3!`$2!``List`+),+*!*0L`3$%$`%/``/00!(!//`"1*0%+*(
+),+*!*0`0$0`*`.!!%2!``+((!0%+*`+"`#%/0/N`%0` %/,(5/`0$!` !/.%,0%+*`"+.`!$`+*!`+"
0$!)M
LPSRUW React IURP 'react';
LPSRUW { array } IURP 'prop-types';
List.SURS7\SHV = {
GDWD: array
};
!`1/!`0$!`connect`"1*0%+*L`,//%*#``"1*0%+*`0+`%0`/``,.)!0!.K`$!`,.)!0!.
"1*0%+*`.!!%2!/`0$!`,.+,/`Q* `0$!`+*0!40R`/`,.)!0!./`/+`0$0`3!`*`.!0!` 5*)%
/`/! `+*`0$!`1..!*0`,.+,!.0%!/`+"`0$!`+),+*!*0K
1.`(('`"1*0%+*`.!01.*/`*`+&!0`3$!.!`0$!`'!5/`.!`0$!`% !*0%"%!./`+"`0$!`.!-1!/0L`*
0$!`2(1!/`.!`0$!`/K`$!``%/`*+0`(%)%0! `0+`!%*#``/0.%*#N`3!W((`/!!`$+3`3!`*`
)1(0%,(!`,.)!0!./`0+`0$!`.!-1!/0`(0!.K
S`89;`T
.+,!.`0`!0$%*# $,0!.`<
0`0$%/`,+%*0L`3!`!*$*!`+1.`+),+*!*0`3%0$`0$!`"1*0%+*`3!`&1/0`.!0! L`/`"+((+3/M
FRQVW ListWithGists = FRQQHFW:LWK*LVWV(List);
!`*+3`$2!`0+`)'!`/)((`$*#!/`0+`0$!`%*%0%(`+),+*!*0`0+`)'!`%0`3+.'`3!((`3%0$`0$!
*!3` +K
$!`gists`,.+,`%/`*+0`0$!`01(` 0—%0`%/``,.0%1(.`05,!`+"`+&!0L
((! `PromiseStateK
`PromiseState`+&!0`%/``/5*$.+*+1/`.!,.!/!*00%+*`+"``PromiseL`* `%0`$/`/+)!
1/!"1(`00.%10!/`/1$`/`,!* %*#`+.`"1("%((! `0$0`3!`*`1/!`0+`/$+3``/,%**!.`+.``(%/0`+"
0K
$!.!`%/`(/+``rejected`,.+,!.05`0$0`3!`*`1/!`%*`/!`+"`!..+./K
2!.50$%*#`!(/!`.!)%*/`0$!`/)!K
S`89<`T
.+,!.`0`!0$%*# $,0!.`<
+3`0$0`3!`$2!`0$%/`(%..5`%*`+1.`,.+&!0L`3!`*` `)+.!`"1*0%+*(%0%!/`0+
+1.`List`+),+*!*0K
+.`!4),(!L`3!`*` ``100+*`0+`/0.0`0$!`#%/0/K
$!`Gist`+),+*!*0`%/``/00!(!//`"1*0%+*(`+),+*!*0`!1/!`0$!`/0..%*#`(+#%`%/
$* (! `5`react-refetch`* `3!` +`*+0`*!! `*5`/00!`+.`!2!*0`$* (!./K
$!``+"`0$!`!* ,+%*0`0+`/0.``#%/0`%/`/`"+((+3/M
https:/b/bapi.bgithub.bcom/bgists/b:id/bstarbaccess_btoken=b:access_btokenK
S`89=`T
.+,!.`0`!0$%*# $,0!.`<
$!5`.!`(/+`+10/% !`0$!`/+,!`+"`0$%/`++'L`/+`3!`.!`*+0`#+%*#`0+`+2!.`0$!)`%*`0$%/
/!0%+*K`$!`*!40`/0!,`%/`0+` ``"1*0%+*`0+`0$!`onClick`!2!*0`+"`0$!`100+*`0+`)'!`*
`((`3%0$`0$!` `+"`0$!`#%/0K
$!`+**!0`"1*0%+*`+"`react-refetch`!,0/``"1*0%+*`/`0$!`"%./0`.#1)!*0L`* `0$!
"1*0%+*`$/`0+`.!01.*`*`+&!0`+"`.!-1!/0/L`/`3!`$2!`,.!2%+1/(5`/!!*K` "`0$!`2(1!/`+"`0$!
.!-1!/0/`.!`/0.%*#/L`0$!*`0$!` 0`%/`"!0$! `/`/++*`/`0$!`,.+,/`.!`2%((!K
!0W/` !(2!`%*0+`0$!`+ !M
FRQVW token = 'access_token=123';
%./0L`3!`,.0%((5`,,(5`0$!`+((!0%+*`"1*0%+*L`* `3!`1/!`0$!`id`,.+,`0+`+),+/!`0$!
K
0`%/`*+3`0%)!`0+`!*$*!`+1.`+),+*!*0M
FRQVW GistWithStar = FRQQHFW:LWK6WDU(Gist);
(/+L`%0`%/`0%)!`0+`1/!`0$!`star`"1*0%+*`%*/% !`%0`0+`"%.!`0$!`.!-1!/0M
FRQVW Gist = ({ description, star }) => (
OL!
S`89>`T
.+,!.`0`!0$%*# $,0!.`<
{GHVFULSWLRQ}
EXWWRQRQ&OLFN={star}!+1EXWWRQ!
OL!
);
Gist.SURS7\SHV = {
GHVFULSWLRQ: string,
VWDU: func
};
/`5+1`*`/!!L`%0`%/`2!.5`/%),(!N`0$!`+),+*!*0`.!!%2!/`0$!`star`"1*0%+*L`3$!.!`0$!
/0.`%/`0$!`*)!`+"`0$!`.!-1!/0`0$0`3!` !"%*! `%*`0$!`+**!0`"1*0%+*K`$!`"1*0%+*`#!0/
"%.! `3$!*`0$!`100+*`%/`(%'! `+*K
$%/`%/`0$!`"%*(`.!/1(0`%*`0$!`.+3/!.`3%* +3M
S`89?`T
.+,!.`0`!0$%*# $,0!.`<
+1`)5`$2!`*+0! `0$0`0$*'/`0+`react-refetchL`3!`*`'!!,`+1.`+),+*!*0/`/00!(!//
* `1*3.!`+"`0$!`0%+*/`0$0`0$!5`.!`"%.%*#K
$%/`)'!/`0!/0/`!/%!.L`* `)!*/`0$0`3!`*`(/+`$*#!`0$!`%),(!)!*00%+*`+"`0$!
+`3%0$+10`)+ %"5%*#`0$!`/1+),+*!*0K
&RQWH[W$3,
$!`*!3`* `+""%%(`+*0!40` `3/`%*0.+ 1! `%*`!0`8=K:K7K`!"+.!L`!0`+""!.! `*
!4,!.%)!*0(` `"+.`+*0!40K`(0$+1#$`%0`3/``,+3!."1(`0++(L`%0/`1/!`3/` %/+1.#!
!1/!`+"`%*$!.!*0`,.+(!)/`%*`0$!` K`
'HSHQGHQFLHV
LPSRUW React, { Component, createContext } IURP 'react';
LPSRUW { element } IURP 'prop-types';
&RQWH[W
H[SRUWFRQVW ListContext = FUHDWH&RQWH[W();
VWDWH = {
JLVWV: [],
VWDWXV: 'initial'
}
FRPSRQHQW'LG0RXQW() {
)HWFKLQJWKHJLVWVZKHQWKHFRPSRQHQWLVPRXQWHG
this.IHWFK*LVWV();
}
S`89@`T
.+,!.`0`!0$%*# $,0!.`<
JLVWV: [],
VWDWXV: 'fetching'
});
WU\ {
FRQVW data = DZDLW
IHWFK('https://api.github.com/users/gaearon/gists')
.WKHQ(response => response.MVRQ());
this.VHW6WDWH({
JLVWV: data,
VWDWXV: 'done'
});
} FDWFK (error) {
this.VHW6WDWH({
VWDWXV: 'error'
});
}
}
UHQGHU() {
FRQVW { children } = this.SURSV;
UHWXUQ (
/LVW&RQWH[W3URYLGHU
YDOXH={{
...this.VWDWH
(YHU\WKLQJ\RXSDVVLQKHUHZLOOEHDYDLODEOHLQWKH
&RQVXPHU
``
!
{children}
/LVW&RQWH[W3URYLGHU!
);
}
}
3URYLGHUV
LPSRUW { ListProvider, ListContext } IURP './ListContext';
S`8:7`T
.+,!.`0`!0$%*# $,0!.`<
/LVW3URYLGHU!
/LVW&RQWH[W&RQVXPHU!
^ 7KHVHSURSVDUHFRPPLQJIURPWKH3URYLGHU VYDOXH `
{({ JLVWV }) => (
XO!
{gists.PDS(gist => (
OLNH\={gist.iG}!{gist.GHVFULSWLRQ}OL!
))}
XO!
)}
/LVW&RQWH[W&RQVXPHU!
/LVW3URYLGHU!
);
List.SURS7\SHV = {
GDWD: array
};
H[SRUWGHIDXOW List;
UHQGHU() {
FRQVW { children } = this.SURSV;
UHWXUQ (
/LVW&RQWH[W3URYLGHU
YDOXH={{
P\/RJ$FWLRQ: this.P\/RJ$FWLRQ, // Here you can pass your actions
...this.VWDWH
}}
>
{children}
/LVW&RQWH[W3URYLGHU!
);
}
S`8:8`T
.+,!.`0`!0$%*# $,0!.`<
$!*L`%*`5+1.`+*/1)!.L`5+1`*` +`/+)!0$%*#`(%'!`0$%/M
FRQVW List = () => (
/LVW3URYLGHU!
/LVW&RQWH[W&RQVXPHU!
{/* These props are comming from the Provider's value*/}
{({ gists, P\/RJ$FWLRQ }) => (
XO!
{P\/RJ$FWLRQ()}
{gists.PDS(gist => (
<li key={gist.id}>{gist.description}</li>
))}
</ul>
)}
/LVW&RQWH[W&RQVXPHU!
/LVW3URYLGHU!
);
$!*L`%*`5+1.`.+3/!.`+*/+(!L`5+1`3%((`/!!`0$!`"+((+3%*#M
6XPPDU\
$!`&+1.*!5`0$.+1#$` 0`"!0$%*#`%*`!0`$/`+)!`0+`*`!* L`* `5+1`*+3`'*+3`$+3`0+
/!* `* `.!0.%!2!` 0`0+`* `".+)` `!* ,+%*0/K`!`/3`$+3` 0`"(+3`3+.'/`%*`!0
* `3$5`0$!`,,.+$`%0`!*"+.!/`*`)'!`+1.`,,(%0%+*/`/%),(!`* `(!*K
S`8:9`T
.+,!.`0`!0$%*# $,0!.`<
%*((5L`3!`(!.*! `$+3`0+`1/!`0$!`*!3`+*0!40` K
*`0$!`*!40`$,0!.L`3!`3%((`/!!`$+3`3!`*`3+.'`!""!0%2!(5`3%0$`!0`%*`0$!`.+3/!.K
S`8::`T
:ULWH&RGHIRUWKH%URZVHU
$!.!`.!`/+)!`/,!%"%`+,!.0%+*/`3!`*` +`3$!*`3!`3+.'`3%0$`!0`* `0$!`.+3/!.K
+.`!4),(!L`3!`*`/'`+1.`1/!./`0+`!*0!.`/+)!`%*"+.)0%+*`1/%*#`"+.)/L`* `3!`3%((`(++'
0`$+3L`%*`!0L`3!`*`,,(5` %""!.!*0`0!$*%-1!/`0+` !(`3%0$`0$!)K
*`0$%/`$,0!.L`3!`3%((`(/+`(++'`0`$+3`!2!*0/`%*`!0`3+.'`* `$+3`0$!`(%..5
%),(!)!*0/`/+)!` 2*! `0!$*%-1!/`0+`#%2!`1/``+*/%/0!*0`%*0!."!`.+//` %""!.!*0
.+3/!./K`!`3%((`(/+`(++'`0`/+)!`%*0!.!/0%*#`/+(10%+*/`0$0`0$!`!0`0!)`$/
%),(!)!*0! `0+`)'!`0$!`!2!*0`/5/0!)`2!.5`,!."+.)*0K
"0!.`0$!`!2!*0/L`3!`3%((`&1),`%*0+`.!"/`0+`(++'`0`$+3`3!`*`!//`0$!`1* !.(5%*#`
*+ !/`%*`+1.`!0`+),+*!*0/K`$%/`.!,.!/!*0/``,+3!."1(`"!01.!L`10`%0`/$+1( `!`1/!
.!"1((5`!1/!`%0`.!'/`/+)!`+"`0$!`+*2!*0%+*/`0$0`)'!`!0`!/5`0+`3+.'`3%0$K
"0!.`0$!`.!"/L`3!`3%((`(++'`0`$+3`3!`*`%),(!)!*0`*%)0%+*/`!/%(5`3%0$`0$!`!0` _
+*/`* `0$%. _,.05`(%..%!/`/1$`/`.!0_)+0%+*K`%*((5L`3!`3%((`(!.*`$+3`!/5`%0`%/`0+
3+.'`3%0$` /`%*`!0L`* `$+3`3!`*`.!0!` 5*)%((5`+*"%#1.(!`%+*/`"+.`+1.
,,(%0%+*/K
*`0$%/`$,0!.L`3!`3%((`#+`0$.+1#$`0$!`"+((+3%*#`0+,%/M
/%*#` %""!.!*0`0!$*%-1!/`0+`.!0!`"+.)/`3%0$`!0
%/0!*%*#`0+``!2!*0/`* `%),(!)!*0%*#`1/0+)`$* (!./
`35`+"`,!."+.)%*#`%),!.0%2!`+,!.0%+*/`+*``*+ !/`1/%*#`.!"/
.!0%*#`/%),(!`*%)0%+*/`0$0`3+.'`.+//`0$!` %""!.!*0`.+3/!./
$!`!0`35`+"`#!*!.0%*#` /
.%0!`+ !`"+.`0$!`.+3/!. $,0!.`=
)RUPV
/`/++*`/`3!`/0.0`1%( %*#``.!(`,,(%0%+*`3%0$`!0L`3!`*!! `0+`%*0!.0`3%0$`0$!
1/!./K` "`3!`3*0`0+`/'`"+.`%*"+.)0%+*`".+)`+1.`1/!./`3%0$%*`0$!`.+3/!.L`"+.)/`.!`0$!
)+/0`+))+*`/+(10%+*K`1!`0+`0$!`35`0$!`(%..5`3+.'/`* `%0/` !(.0%2!`*01.!L` !(%*#
3%0$`%*,10`"%!( /`* `+0$!.`"+.)`!(!)!*0/`%/`*+*_0.%2%(`3%0$`!0L`10`/`/++*`/`3!
1* !./0* `%0/`(+#%L`%0`!+)!/`(!.K
8QFRQWUROOHGFRPSRQHQWV
!0W/`/0.0`3%0$``/%`!4),(!— %/,(5%*#``"+.)`3%0$`*`%*,10`"%!( `* ``1)%0
100+*K
$!`+ !`%/`,.!005`/0.%#$0"+.3. M
FRQVW Uncontrolled = () => (
IRUP!
LQSXWW\SH="text" !
EXWWRQ!SubmitEXWWRQ!
IRUP!
);
"`3!`.1*`0$!`,.!! %*#`/*%,,!0`%*`0$!`.+3/!.L`3!`*`/!!`!40(5`3$0`3!`!4,!0—*
%*,10`"%!( `%*`3$%$`3!`*`3.%0!`/+)!0$%*#`* ``(%'(!`100+*K`$%/`%/`*`!4),(!`+"
*`1*+*0.+((! `+),+*!*0L`3$!.!`3!` +`*+0`/!0`0$!`2(1!`+"`0$!`%*,10`"%!( L`10`3!`(!0`0$!
+),+*!*0`)*#!`%0/`+3*`%*0!.*(`/00!K
+/0`(%'!(5L`3!`3*0`0+` +`/+)!0$%*#`3%0$`0$!`2(1!`+"`0$!`!(!)!*0`3$!*`0$!`1)%0
100+*`%/`(%'! K`+.`!4),(!L`3!`)5`3*0`0+`/!* `0$!` 0`0+`*` `!* ,+%*0K
%./0L`3!`$2!`0+`$*#!`0$!`+),+*!*0`".+)`/00!(!//`0+``class`!1/!`3!`*!! `0+
!"%*!`/+)!`"1*0%+*/`* ``/00!M
FODVV Uncontrolled H[WHQGV Component
$!`(//`$/``constructor`3$!.!`3!`%* `0$!`!2!*0`(%/0!*!.M
FRQVWUXFWRU(props) {
VXSHU(props);
this.KDQGOH&KDQJH = this.handleChange.ELQG(this);
}
S`8:<`T
.%0!`+ !`"+.`0$!`.+3/!. $,0!.`=
$!*L`3!` !"%*!`0$!`!2!*0`(%/0!*!.`%0/!("M
KDQGOH&KDQJH({ target: { value } }) {
console.ORJ(YDOXH);
}
$!`!2!*0`(%/0!*!.`%/`.!!%2%*#`*`!2!*0`+&!0L`3$!.!`0$!`0.#!0`.!,.!/!*0/`0$!`"%!( `0$0
#!*!.0! `0$!`!2!*0L`* `3!`.!`%*0!.!/0! `%*`%0/`2(1!K`!`/0.0`5`&1/0`(+##%*#`%0`!1/!`%0
%/`%),+.0*0`0+`,.+!! `3%0$`/)((`/0!,/L`10`3!`3%((`/0+.!`0$!`2(1!`%*0+`0$!`/00!`/++*K
%*((5L`3!`.!* !.`0$!`"+.)M
UHQGHU() {
UHWXUQ (
IRUP!
LQSXWW\SH="text" RQ&KDQJH={this.KDQGOH&KDQJH}!
EXWWRQ!SubmitEXWWRQ!
IRUP!
);
}
$!`handleChange`(%/0!*!.`%/`"%.! `!2!.5`0%)!`0$!`2(1!`+"`0$!`%*,10`$*#!/K`$!.!"+.!L
+1.`"1*0%+*`%/`((! `+*!`"+.`!$`05,! `$.0!.K`$!`*!40`/0!,`%/`0+`/0+.!`0$!`2(1!`0$0W/
!*0!.! `5`0$!`1/!.`* `)'!`%0`2%((!`3$!*`0$!`1/!.`(%'/`0$!`1)%0`100+*K
S`8:=`T
.%0!`+ !`"+.`0$!`.+3/!. $,0!.`=
!`)5`(/+`3*0`0+`%*%0%(%6!`0$!`2(1!`,.+,!.05`+"`0$!`/00!`/`*`!),05`/0.%*#L`%*`/!`0$!
100+*`#!0/`(%'! `!"+.!`*5`$*#!`!2!*0`%/`0.%##!.! K
S`8:>`T
.%0!`+ !`"+.`0$!`.+3/!. $,0!.`=
+3L`3!`%),(!)!*0`0$!`*!3`$* (!./M
KDQGOH&KDQJH)LUVW1DPH({ WDUJHW: { YDOXH } }) {
this.VHW6WDWH({
ILUVW1DPH: value
})
}
KDQGOH&KDQJH/DVW1DPH({ WDUJHW: { YDOXH } }) {
this.VHW6WDWH({
ODVW1DPH: value
})
}
S`8:?`T
.%0!`+ !`"+.`0$!`.+3/!. $,0!.`=
!0W/`(++'`0`$+3`3!`*`+,0%)%6!`%0``(%00(!`%0K`1.`#+(`%/`0+`1/!``/%*#(!`$*#!`$* (!.`/+
0$0`3!`*` `*`.%0..5`*1)!.`+"`"%!( /`3%0$+10`.!0%*#`*!3`(%/0!*!./K
!`)5`/0%((`3*0`0+`%*%0%(%6!`0$!`2(1!/L`* `(0!.`%*`0$%/`/!0%+*L`3!`3%((`(++'`0`$+3`0+
,.+2% !`,.!"%((! `2(1!/`"+.`0$!`"+.)K
/`3!`$2!`/!!*`,.!2%+1/(5L`0$!`target`,.+,!.05`+"`0$!`!2!*0`3!`.!!%2!`.!,.!/!*0/`0$!
%*,10`"%!( `0$0`$/`"%.! `0$!`!2!*0L`/+`3!`*`1/!`0$!`*)!`+"`0$!`"%!( `* `%0/`2(1!`/
2.%(!/K
S`8:@`T
.%0!`+ !`"+.`0$!`.+3/!. $,0!.`=
EXWWRQ!SubmitEXWWRQ!
IRUP!
);
}
&RQWUROOHGFRPSRQHQWV
$!`*!40`0$%*#`3!`.!`#+%*#`0+`(++'`0`%/`$+3`3!`*`,.!"%((`0$!`"+.)`"%!( /`3%0$`/+)!
2(1!/L`3$%$`3!`)5`.!!%2!`".+)`0$!`/!.2!.`+.`/`,.+,/`".+)`0$!`,.!*0K
"`3!`+,!*`0$!`+*/+(!L`!0`%0/!("`%/`0!((%*#`1/`0$0`3!`.!` +%*#`/+)!0$%*#`3.+*#M
You provided a `value` prop to a form field without an `onChange` handler.
This will render a read-only field.
* `0$0`%/`!40(5`3$0`$,,!*! K
S`8;7`T
.%0!`+ !`"+.`0$!`.+3/!. $,0!.`=
IRUP!
);
/`1/1(L`3!`/0.0` !"%*%*#``+*/0.10+.`3$!.!`3!`%*%0%(%6!`0$!`/00!L`0$%/`0%)!`3%0$`0$!
!"1(0`2(1!/`+"`0$!`"%!( /K`!`(/+`%* `0$!`!2!*0`$* (!./`0$0`3!`*!! `0+`)'!`0$!`"+.)
3+.'K
$!`$* (!./`.!`0$!`/)!`/`0$!`,.!2%+1/`+*!/M
KDQGOH&KDQJH({ WDUJHW: { QDPH, YDOXH } }) {
this.VHW6WDWH({
[QDPH]: value
});
}
KDQGOH6XEPLW(e) {
e.SUHYHQW'HIDXOW();
console.ORJ(`^this.state.ILUVW1DPH` ^this.state.ODVW1DPH``);
}
S`8;8`T
.%0!`+ !`"+.`0$!`.+3/!. $,0!.`=
QDPH="firstName"
YDOXH={this.state.ILUVW1DPH}
RQ&KDQJH={this.KDQGOH&KDQJH}
!
LQSXW
W\SH="text"
QDPH="lastName"
YDOXH={this.state.ODVW1DPH}
RQ&KDQJH={this.KDQGOH&KDQJH}
!
EXWWRQ!SubmitEXWWRQ!
IRUP!
);
}
-621VFKHPD
+3`0$0`3!`'*+3`$+3`"+.)/`3+.'`%*`!0L`3!`*`)+2!`%*`0+`/+)!0$%*#`0$0`$!(,/`1/
10+)0!`"+.)`.!0%+*L`2+% `3.%0%*#``(+0`+"`+%(!.,(0!L`* `'!!,`+1.`+ !`)1$`(!*!.K
`,+,1(.`/+(10%+*`%/`react-jsonschema-formL`3$%$`%/`)%*0%*! `5`+6%((`/!.2%!/K
%./0L`3!`)1/0`%*/0((`%0`1/%*#`npmM
QSPLQVWDOOVDYHUHDFWMVRQVFKHPDIRUP
!` !"%*!``/$!)L`/`"+((+3/M
FRQVW schema = {
W\SH: 'object',
SURSHUWLHV: {
ILUVW1DPH: { W\SH: 'string', GHIDXOW: 'Dan' },
ODVW1DPH: { W\SH: 'string', GHIDXOW: 'Abramov' },
S`8;9`T
.%0!`+ !`"+.`0$!`.+3/!. $,0!.`=
}
};
"`3!`0$!*`,//`0$!`/$!)`0+`0$!`Form`+),+*!*0`3!`%),+.0! `".+)`0$!`(%..5L``"+.)
3%((`!`#!*!.0! `"+.`1/`10+)0%((5K
*!`)+.!L`(!0W/`/0.0`3%0$``/%),(!`/00!(!//`"1*0%+*(`+),+*!*0`/+`0$0`3!`*`
"!01.!/`0+`%0`%0!.0%2!(5M
FRQVW JSONSchemaForm = () => (
)RUPVFKHPD={schema} !
);
$!`handleSubmit`$* (!.`%/`.!!%2%*#`*`+&!0L`3$%$`$/``formData`00.%10!`0$0
+*0%*/`0$!`*)!/`* `0$!`2(1!/`+"`0$!`"+.)`"%!( /M
KDQGOH6XEPLW({ formData }) {
console.ORJ(formData);
}
S`8;:`T
.%0!`+ !`"+.`0$!`.+3/!. $,0!.`=
%*((5L`+1.`render`)!0$+ `(++'/`/`"+((+3/M
UHQGHU() {
UHWXUQ (
)RUPVFKHPD={schema} RQ6XEPLW={this.KDQGOH6XEPLW} !
);
}
+DQGOLQJHYHQWV
2!*0/`3+.'`%*``/(%#$0(5` %""!.!*0`35`.+//`0$!`2.%+1/`.+3/!./K`!0`0.%!/`0+`/0.0
0$!`35`!2!*0/`3+.'`* `#%2!` !2!(+,!./``+*/%/0!*0`%*0!."!`0+` !(`3%0$K`$%/`%/``#.!0
"!01.!`+"`!0`!1/!`3!`*`"+.#!0`+10`0$!`.+3/!./`3!`.!`0.#!0%*#`* `3.%0!`!2!*0
$* (!./`* `"1*0%+*/`0$0`.!`2!* +._#*+/0%K
!`$2!`/!!*`0$%/`,00!.*`%*`0%+*`%*`0$!`,.!2%+1/`!4),(!/L`3$!.!`3!`3!.!`(%/0!*%*#`0+
0$!`onChange`!2!*0`+"`0$!`"+.)`"%!( /K
!0W/`.!%0!.0!``/%`!2!*0`(%/0!*!.`!4),(!`0+`/!!`$+3`3!`*`+.#*%6!`)1(0%,(!`!2!*0/
%*/% !`0$!`/)!`+),+*!*0`%*``*%!.`35K
S`8;;`T
.%0!`+ !`"+.`0$!`.+3/!. $,0!.`=
!`.!`#+%*#`0+`%),(!)!*0``/%),(!`100+*L`* `3!`/0.0L`/`1/1(L`5`.!0%*#``(//M
FODVV Button H[WHQGV Component
/`5+1`*`/!!`$!.!L`3!`.!` +%*#``2!.5`/%),(!`0$%*#M`3!`&1/0`$!'`0$!`05,!`+"`0$!`!2!*0
+&!0`3!`.!!%2!`".+)`!0`* `0$!`05,!`+"`*0%2!`!2!*0`00$! `0+`%0K`!`!4,!0`0$!`"%./0
0+`.!01.*`false`* `0$!`/!+* `0+`.!01.*`trueK
S`8;<`T
.%0!`+ !`"+.`0$!`.+3/!. $,0!.`=
%./0L`3!`$*#!`0$!`constructor`+"`0$!`+),+*!*0L`!1/!`3!`*+3`3*0`%0`0+`%* `0$!
*!3`#!*!.%`!2!*0`$* (!.M
FRQVWUXFWRU(props) {
VXSHU(props);
this.KDQGOH(YHQW = this.handleEvent.ELQG(this);
}
%*((5L`3!`00$`0$!`*!3`!2!*0`(%/0!*!.`0+`0$!`onClick`* `onDoubleClick`00.%10!/M
UHQGHU() {
UHWXUQ (
EXWWRQ
RQ&OLFN={this.KDQGOH(YHQW}
RQ'RXEOH&OLFN={this.KDQGOH(YHQW}
!
Click me!
EXWWRQ!
);
}
S`8;=`T
.%0!`+ !`"+.`0$!`.+3/!. $,0!.`=
`+1,(!`)+.!`%*0!.!/0%*#`0$%*#/`0+`'*+3`+10`!2!*0/`%*`!0`.!`0$0`/5*0$!0%`!2!*0/
.!`.!1/! `* `0$0`0$!.!`%/``/%*#(!`#(+(`$* (!.K`$!`"%./0`+*!,0`)!*/`0$0`3!`**+0
/0+.!``/5*0$!0%`!2!*0`* `.!1/!`%0`(0!.`!1/!`%0`!+)!/`*1((`.%#$0`"0!.`0$!`0%+*K`$%/
0!$*%-1!`%/`2!.5`#++ `%*`0!.)/`+"`,!."+.)*!L`10`%0`*`!`,.+(!)0%`%"`3!`3*0`0+
/0+.!`0$!`!2!*0`%*/% !`0$!`/00!`+"`0$!`+),+*!*0`"+.`/+)!`.!/+*K`+`/+(2!`0$%/`,.+(!)L
!0`#%2!/`1/``persist`)!0$+ `+*`0$!`/5*0$!0%`!2!*0/L`3$%$`3!`*`((`0+`)'!`0$!
!2!*0`,!./%/0!*0`/+`0$0`3!`*`/0+.!`%0`* `.!0.%!2!`%0`(0!.K
$!*!2!.`3!`1/!`0$!`on`00.%10!/L`3!`.!` !/.%%*#`0+`!0`0$!`!$2%+.`3!`3*0`0+
$%!2!L`10`0$!`(%..5` +!/`*+0`00$`0$!`01(`!2!*0`$* (!.`0+`0$!`1* !.(5%*#`
*+ !/K
5HIV
*!`+"`0$!`.!/+*/`,!+,(!`(+2!`!0`%/`!1/!`%0`%/` !(.0%2!K`!%*#` !(.0%2!`)!*/
0$0`5+1`&1/0` !/.%!`3$0`5+1`3*0`0+`!` %/,(5! `+*`0$!`/.!!*`0`*5`#%2!*`,+%*0`%*
0%)!`* `!0`0'!/`.!`+"`0$!`+))1*%0%+*/`3%0$`0$!`.+3/!.K`$%/`"!01.!`)'!/
!0`2!.5`!/5`0+`.!/+*`+10`* `%0`%/`2!.5`,+3!."1(`0`0$!`/)!`0%)!K
S`8;>`T
.%0!`+ !`"+.`0$!`.+3/!. $,0!.`=
!0W/`.!0!``(//`((! `Focus`3%0$``+*/0.10+.`3$!.!`3!`%*
0$!`handleClick`)!0$+ M
FODVV Focus H[WHQGV Component
!`3%((`(%/0!*`0+`0$!`(%'`!2!*0/`+*`0$!`100+*`0+`"+1/`0$!`%*,10`"%!( M
FRQVWUXFWRU(props) {
VXSHU(props);
this.KDQGOH&OLFN = this.handleClick.ELQG(this);
}
$!*L`3!`%),(!)!*0`0$!`01(`handleClick`)!0$+ M
KDQGOH&OLFN() {
this.element.IRFXV();
}
/`5+1`*`/!!L`3!`.!`.!"!.!*%*#`0$!`element`00.%10!`+"`0$!`(//`* `((%*#`0$!`focus
)!0$+ `+*`%0K
UHQGHU() {
UHWXUQ (
IRUP!
LQSXW
W\SH="text"
UHI={HOHPHQW => (this.HOHPHQW = HOHPHQW)}
!
EXWWRQ RQ&OLFN={this.KDQGOH&OLFN}!FocusEXWWRQ!
IRUP!
);
}
S`8;?`T
.%0!`+ !`"+.`0$!`.+3/!. $,0!.`=
$!`/!*.%+/`3$!.!`3!`)%#$0`*!! `0+`1/!`%0`3%0$+10`*5`+0$!.`/+(10%+*/`.!`0$!`+*!/
3$!.!`3!`.!`%*0!#.0%*#`+1.`+),+*!*0/`3%0$`+0$!.`%),!.0%2!`(%..%!/L`/1$`/`&1!.5K` 0
%/`%),+.0*0`0+`'*+3`0$0`3$!*`/!00%*#`0$!`.!"`(('`+*``*+*_*0%2!`+),+*!*0`Q
1/0+)`+),+*!*0`0$0`/0.0/`3%0$`*`1,,!./!`(!00!.RL`0$!`.!"!.!*!`3!`.!!%2!`/`
,.)!0!.`+"`0$!`(('`%/`*+0```*+ !`%*/0*!L`10`0$!`%*/0*!`+"`0$!`+),+*!*0
%0/!("K`$%/`%/`.!((5`,+3!."1(`!1/!`%0`#%2!/`1/`!//`0+`0$!`%*0!.*(`%*/0*!`+"``$%(
+),+*!*0L`10`%0`%/`(/+` *#!.+1/`* `/$+1( `!`2+% ! K`+`/!!`*`!4),(!`+"`0$%/
/+(10%+*L`3!`.!`#+%*#`0+`.!0!`03+`+),+*!*0/M
!0W/`/0.0`5`.!0%*#`0$!`%*,10M
FODVV Input H[WHQGV Component
S`8;@`T
.%0!`+ !`"+.`0$!`.+3/!. $,0!.`=
$!`reset`"1*0%+*`%/`2!.5`/%),(!L`* `&1/0`.%*#/`0$!`/00!`'`0+`!),05M
UHVHW() {
this.VHW6WDWH({
YDOXH: ''
});
}
$!`handleChange`%/`,.!005`/%),(!`/`3!((L`* `%0`&1/0`'!!,/`0$!`/00!`+"`0$!`+),+*!*0`%*
/5*`3%0$`0$!`1..!*0`2(1!`+"`0$!`%*,10`!(!)!*0M
KDQGOH&KDQJH({ target: { value } }) {
this.VHW6WDWH({
YDOXH
});
}
+3L`3!`.!`#+%*#`0+`.!0!`0$!`Reset`+),+*!*0L`3$%$`1/!/`0$!`,.!! %*#`+),+*!*0L
* `((`%0/`reset`)!0$+ `3$!*`0$!`100+*`%/`(%'! M
FODVV Reset H[WHQGV Component
S`8<7`T
.%0!`+ !`"+.`0$!`.+3/!. $,0!.`=
/`5+1`*`/!!`$!.!L`.!"!.!*%*#`*+ !`!(!)!*0/`+.`%*/0*!/`%/`/%((5`0$!`/)!`%*`0!.)/
+"`.!"`(('K
$%/`%/`,.!005`,+3!."1(`!1/!`3!`*`!/%(5`!//`)!0$+ /`+*`0$!`+),+*!*0/L`10`3!
/$+1( `!`.!"1(`!1/!`%0`.!'/`0$!`!*,/1(0%+*`* `)'!/`.!"0+.%*#`,.!005`$. K
1,,+/!L`%*`"0L`0$0`5+1`*!! `0+`.!*)!`0$!`reset`"1*0%+*`"+.`/+)!`.!/+*N`5+1`$2!`0+
$!'`((`0$!`,.!*0`+),+*!*0/`0$0`.!`1/%*#`%0`* `$*#!`0$!)`/`3!((K
$QLPDWLRQV
$!*`3!`0$%*'`+10` /`* `0$!`.+3/!.L`3!`)1/0`/1.!(5`0$%*'`+10`*%)0%+*/`/`3!((K
S`8<8`T
.%0!`+ !`"+.`0$!`.+3/!. $,0!.`=
*!`3!`$2!` +*!`0$0L`3!`*`%),+.0`0$!`+),+*!*0M
LPSRUW CSSTransitionGroup IURP 'react-addons-css-transition-group';
$!*L`3!`&1/0`3.,`0$!`+),+*!*0`0+`3$%$`3!`3*0`0+`,,(5`0$!`*%)0%+*`3%0$`%0M
FRQVW Transition = () => (
&667UDQVLWLRQ*URXS
WUDQVLWLRQ1DPH="fade"
WUDQVLWLRQ$SSHDU
WUDQVLWLRQ$SSHDU7LPHRXW={500}
!
K!Hello ReactK!
&667UDQVLWLRQ*URXS!
);
/`5+1`*`/!!L`0$!.!`.!`/+)!`,.+,/`0$0`*!! `!4,(%*%*#K
%./0L`3!`.!` !(.%*#``transitionNameK`$!`ReactCSSTransitionGroup`,,(%!/`
(//`3%0$`0$!`*)!`+"`0$0`,.+,!.05`0+`0$!`$%( `!(!)!*0`/+`0$0`3!`*`0$!*`1/!`
0.*/%0%+*/`0+`.!0!`+1.`*%)0%+*/K
%0$``/%*#(!`(//L`3!`**+0`!/%(5`.!0!``,.+,!.`*%)0%+*L`* `0$0`%/`3$5`0$!
0.*/%0%+*`#.+1,`,,(%!/`)1(0%,(!`(//!/`+. %*#`0+`0$!`/00!`+"`0$!`*%)0%+*K
*`0$%/`/!L`3%0$`0$!`transitionAppear`,.+,L`3!`.!`0!((%*#`0$!`+),+*!*0`0$0`3!`3*0
0+`*%)0!`0$!`$%( .!*`3$!*`0$!5`,,!.`+*`0$!`/.!!*K
*`0$!`*!40`0%'L`0$!`fade-appear-active`(//`%/`,,(%! `/+`0$0`3!`*`"%.!`+1.
*%)0%+*`".+)`0$!`%*%0%(`/00!`0+`0$!`*!3`+*!L`1/%*#`K
!`(/+`$2!`0+`/!0`0$!`transitionAppearTimeout`,.+,!.05`0+`0!((`!0`0$!`(!*#0$`+"`0$!
*%)0%+*`/+`0$0`%0` +!/*W0`.!)+2!`!(!)!*0/`".+)`0$!``!"+.!`*%)0%+*/`.!
+),(!0! K
S`8<9`T
.%0!`+ !`"+.`0$!`.+3/!. $,0!.`=
$!``0+`)'!`*`!(!)!*0`" !`%*`%/`/`"+((+3/K
%./0L`3!` !"%*!`0$!`+,%05`+"`0$!`!(!)!*0`%*`0$!`%*%0%(`/00!M
IDGHDSSHDU {
opacity: 0.01;
}
!`.!`0.*/%0%+*%*#`0$!`+,%05`".+)`0.01`0+`1`%*`500ms`1/%*#`0$!`ease-in`"1*0%+*K
$%/`%/`,.!005`!/5L`10`3!`*`.!0!`)+.!`+),(!4`*%)0%+*/L`* `3!`*`(/+`*%)0!
%""!.!*0`/00!/`+"`0$!`+),+*!*0K
`/%)%(.`0$%*#`,,(%!/`0+`.!)+2!`!(!)!*0/K
5HDFWPRWLRQ
/`/++*`/`0$!`+),(!4%05`+"`0$!`*%)0%+*/`#.+3/L`+.`3$!*`3!`*!! `*%)0%+*/`0$0
!,!* `+*`+0$!.`*%)0%+*/L`+.L`3$%$`%/`)+.!` 2*! L`3$!*`3!`*!! `0+`,,(5`/+)!
,$5/%/_/! `!$2%+.`0+`+1.`+),+*!*0/L`3!`.!(%6!`0$0`0$!`0.*/%0%+*`#.+1,`%/`*+0
$!(,%*#`1/`!*+1#$L`/+`3!`)5`+*/% !.`1/%*#``0$%. _,.05`(%..5K
$!`)+/0`,+,1(.`(%..5`0+`.!0!`*%)0%+*/`%*`!0`%/`react-motionL`3$%$
%/`)%*0%*! `5`$!*#`+1K` 0`,.+2% !/``2!.5`(!*`* `!/5` `0$0`#%2!/`1/``2!.5
,+3!."1(`0++(`0+`.!0!`*5`*%)0%+*/K
+`1/!`%0L`3!`"%./0`$2!`0+`%*/0((`%0M
QSPLQVWDOOVDYHUHDFWPRWLRQ
S`8<:`T
.%0!`+ !`"+.`0$!`.+3/!. $,0!.`=
!0W/`(++'`0`0$!`+ !M
FRQVW Transition = () => (
0RWLRQ
GHIDXOW6W\OH={{ RSDFLW\: 0.01 }}
VW\OH={{ RSDFLW\: VSULQJ(1) }}
!
{LQWHUSRODWLQJ6W\OH => (
KVW\OH={interpolatingStyle}!Hello ReactK!
)}
0RWLRQ!
);
$!.!`.!``(+0`+"`%*0!.!/0%*#`0$%*#/`$!.!K
$!*L`3!`*`/!!`0$0`0$!`Motion`+),+*!*0`$/`03+`00.%10!/M`0$!`"%./0`+*!
%/`defaultStyleL`3$%$`.!,.!/!*0/`0$!`%*%0%(`/05(!K
S`8<;`T
.%0!`+ !`"+.`0$!`.+3/!. $,0!.`=
$%/`(%..5`*` +`/+)!`)+.!`++(`/01""L`10`0$!`"%./0`0$%*#/`0+`(!.*`+10`.!`0$!`/%
+*!,0/L`* `0$%/`!4),(!`/$+1( `(.%"5`0$!)K
0`%/`(/+`%*0!.!/0%*#`0+`+),.!`0$!`03+` %""!.!*0`,,.+$!/`+"`0$!`0.*/%0%+*`#.+1,
* `react-motion`0+`!`(!`0+`$++/!`0$!`.%#$0`+*!`"+.`0$!`,.+&!0`5+1`.!`3+.'%*#`+*K
6FDODEOH9HFWRU*UDSKLFV
/0`10`*+0`(!/0L`+*!`+"`0$!`)+/0`%*0!.!/0%*#`0!$*%-1!/`3!`*`,,(5`%*`0$!`.+3/!.`0+
.3`%+*/`* `#.,$/`%/`((!`!0+.` .,$%/`Q RK
!`1/! `0+`1/!`%+*`"+*0/`0+`.!0!`%+*/L`10`0$!5`$2!`3!((_'*+3*`,.+(!)/L`3%0$`0$!`"%./0
!%*#`0$0`0$!5`.!`*+0`!//%(!K` 0`%/`(/+`,.!005`$. `0+`,+/%0%+*`%+*`"+*0/`3%0$`L`*
0$!5` +`*+0`(35/`(++'`!10%"1(`%*`((`.+3/!./K`$!/!`.!`0$!`.!/+*/`3!`/$+1( `,.!"!.
`"+.`+1.`3!`,,(%0%+*/K
+L`%"`3!`0$%*'`+10`+1.`+),+*!*0/`/``"1*0%+*`+"`0$!%.`,.+,/L`3!`*`!/%(5`%)#%*!
$+3`3!`*`.!0!`/!("_+*0%*! ` `%+*/`0$0`3!`*`)*%,1(0!`5`,//%*#` %""!.!*0
,.+,/`0+`0$!)K
`+))+*`35`0+`.!0!` /`%*``3!`,,`3%0$`!0`%/`0+`3.,`+1.`2!0+./`%*0+``!0
+),+*!*0`* `1/!`0$!`,.+,/`0+` !"%*!`0$!%.` 5*)%`2(1!/K
!0W/`(++'`0``/%),(!`!4),(!`3$!.!`3!` .3``(1!`%.(!L`0$1/`.!0%*#``!0
+),+*!*0`0$0`3.,/`*` `!(!)!*0M
FRQVW Circle = ({ x, y, radius, fill }) => (
VYJ!
FLUFOHF[={x} F\={y} U={radius} ILOO={fill} !
VYJ!
);
/`5+1`*`/!!L`3!`*`!/%(5`1/!``/00!(!//`"1*0%+*(`+),+*!*0`0$0`3.,/`0$!`
).'1,L`* `%0`!,0/`0$!`/)!`,.+,/`/`0$!` ` +!/K
S`8<<`T
.%0!`+ !`"+.`0$!`.+3/!. $,0!.`=
*`!4),(!`1/#!`%/`/`"+((+3/M
&LUFOH[={20} \={20} UDGLXV={20} ILOO="blue" !
$%/`%/`,.!005`,+3!."1(`3$!*`3!`1%( ` /L`!/,!%((5`%*``0!)`3$!.!`3!`/$.!`+1.`%+*`/!0
* `3!`3*0`0+`$2!`/+)!` !"1(0`2(1!/`%*`%0L`10`3!`(/+`3*0`0+`(!0`+0$!.`0!)/` !% !
0$!%.`/!00%*#/`3%0$+10`$2%*#`0+`.!.!0!`0$!`/)!` `/$,!/K
+3!2!.L`%*`/+)!`/!/L`3!`,.!"!.`0+`!`)+.!`/0.%0`* `"%4`/+)!`2(1!/`0+`'!!,
+*/%/0!*5K`%0$`!0L`0$%/`%/``/1,!.`/%),(!`0/'K
+.`!4),(!L`3!`*`3.,`0$!`/!`%.(!`+),+*!*0`%*0+``RedCircleL`/`"+((+3/M
FRQVW RedCircle = ({ x, y, radius }) => (
&LUFOH[={x}\={y} UDGLXV={radius} ILOO="red"!
);
S`8<=`T
.%0!`+ !`"+.`0$!`.+3/!. $,0!.`=
$!`,.+,`05,!/`.!`0$!`/)!`3%0$+10`0$!`"%((M
RedCircle.SURS7\SHV = {
[: number,
\: number,
UDGLXV: number
};
6XPPDU\
*`0$%/`$,0!.L`3!`(++'! `0`0$!` %""!.!*0`0$%*#/`3!`*` +`3$!*`3!`0.#!0`0$!`.+3/!.
3%0$`!0L`".+)`"+.)`.!0%+*`0+`!2!*0/L`* `".+)`*%)0%+*/`0+` /K
S`8<>`T
6HFWLRQ3HUIRUPDQFH
,PSURYHPHQWVDQG3URGXFWLRQ
!`3%((`!#%*`0$%/`/!0%+*`5`(!.*%*#`$+3`0+`)'!`+1.`+),+*!*0/`!10%"1(L`* `+)!`0+
1* !./0* `0$!`+*!,0`+"`/!.2!._/% !`.!* !.%*#`%*`!0`"+.`+0$`"1*`* `,.+"%0K`!`3%((
0$!*`(!.*`$+3`0+`%),.+2!`0$!`,!."+.)*!`+"`+1.`,,(%0%+*/`5`0!/0%*#`* ` !1##%*#
0$!)K`!`3%((`(/+` %,`%*0+``-1%'`$,0!.`+10`!0`+10!.K`%*((5L`3!`3%((`!* `0$%/
/!0%+*`* `0$!`++'`%0/!("`5`(!.*%*#`$+3`0+` !,(+5`+1.`,,(%0%+*`0+`,.+ 10%+*`* `/!!
3$0`/0!,/`5+1`*`0'!`*!40K
*`0$%/`/!0%+*L`3!`3%((`+2!.`0$!`"+((+3%*#`$,0!./M
Chapter 7L`'!`+1.`+),+*!*0/`++'`!10%"1(
Chapter 8L`!.2!._% !`!* !.%*#`"+.`1*`* `.+"%0
Chapter 9L` ),.+2!`0$!`!."+.)*!`+"`+1.`,,(%0%+*/
Chapter 10L`+10`!/0%*#`* `!1##%*#
Chapter 11L`!0`+10!.
Chapter 12L`*0%_00!.*/`0+`!`2+% !
Chapter 13L`!,(+5%*#`0+`.+ 10%+*
Chapter 14L`!40`0!,/
0DNH<RXU&RPSRQHQWV/RRN
%HDXWLIXO
1.`&+1.*!5`%*0+`!0`!/0`,.0%!/`* ` !/%#*`,00!.*/`$/`*+3`.!$! `0$!`,+%*0`3$!.!
3!`3*0`0+`)'!`+1.`+),+*!*0/`(++'`!10%"1(K`+` +`0$0L`3!`3%((`#+`0$.+1#$`((`0$!
.!/+*/`3$5`.!#1(.``)5`*+0`!`0$!`!/0`,,.+$`"+.`/05(%*#`+),+*!*0/L`* `3!`3%((
$!'`+10`2.%+1/`(0!.*0%2!`/+(10%+*/K
*`0$%/`$,0!.L`3!`3%((`+2!.`0$!`"+((+3%*#`0+,%/M
+))+*`,.+(!)/`3%0$`.!#1(.``0`/(!
$0`%0`)!*/`0+`1/!`%*(%*!`/05(!/`%*`!0`* `0$!` +3*/% !/
+3`0$!` %1)`(%..5`*`$!(,`"%4`%//1!/`+"`%*(%*!`/05(!/
+3`0+`/!0`1,``,.+&!0`".+)`/.0$`1/%*#`3!,'`* ``)+ 1(!/
!01.!/`+"``)+ 1(!/`* `3$5`0$!5`.!,.!/!*0``#.!0`/+(10%+*`0+`2+% `#(+(
05(! `+),+*!*0/L``*!3`(%..5`0$0`+""!./``)+ !.*`,,.+$`0+`/05(%*#`!0
+),+*!*0/
'!`+1.`+),+*!*0/`++'`!10%"1( $,0!.`>
&66LQ-DYD6FULSW
*`0$!`+))1*%05L`!2!.5+*!`#.!!/`0$0``.!2+(10%+*`0++'`,(!`%*`0$!`/05(%*#`+"`!0
+),+*!*0/`%*`+2!)!.`978;L`3$!*`$.%/0+,$!.`$! !1`#2!``0('`0`0$!`0%+*
+*"!.!*!K
(/+`'*+3*`/`2&!14`+*`0$!`%*0!.*!0L`$.%/0+,$!.`3+.'/`0`!++'`* `+*0.%10!/`0+
!0K` *`$%/`0('L`$!`3!*0`0$.+1#$`((`0$!`,.+(!)/`.!(0! `0+``+*`0$!`/(!`0$0`0$!5
3!.!`"%*#`0$!)`0`!++'K
$!`"+((+3%*#`%/`0$!`(%/0`+"`%//1!/`3%0$`L`/%((5`,.+(!)/`3%0$``0`/(!M
(+(`)!/,!
!,!* !*%!/
! `+ !`(%)%*0%+*
%*%"%0%+*
$.%*#`+*/0*0/
+*_ !0!.)%*%/0%`!/+1(10%+*
/+(0%+*
$!`"%./0`3!((_'*+3*`,.+(!)`+"``%/`0$0`((`0$!`/!(!0+./`.!`#(+(K`+`)00!.`$+3`3!
+.#*%6!`+1.`/05(!/L`1/%*#`*)!/,!/`+.``,.+! 1.!`(%'!`0$!`(+'L`(!)!*0L`+ %"%!.
QR`)!0$+ +(+#5L`%*`0$!`!* L`3!`.!`(35/`,+((10%*#`0$!`#(+(`*)!/,!L`3$%$`3!
((`'*+3`%/`3.+*#K` 0`%/`*+0`+*(5`3.+*#`%*`,.%*%,(!L`10`%0`(/+`(! /`0+`)*5`!..+./`%*`%#
+ !/!/L`* `%0`)'!/`)%*0%*%(%05`2!.5`$. `%*`0$!`(+*#`0!.)K`+.'%*#`3%0$`%#
0!)/L`%0`%/`*+*0.%2%(`0+`'*+3`%"``,.0%1(.`(//`+.`!(!)!*0`$/`(.! 5`!!*`/05(! L`*
)+/0`+"`0$!`0%)!`3!`0!* `0+` `)+.!`(//!/`%*/0! `+"`.!1/%*#`!4%/0%*#`+*!/K
S`8=7`T
'!`+1.`+),+*!*0/`++'`!10%"1( $,0!.`>
*+0$!.`,%*`+"`3+.'%*#`3%0$``+*!.*/`0$!`)%*%"%0%+*`+"`0$!`/!(!0+./`* `0$!`(//
*)!/L`+0$`%*`0$!``* `%*`0$!` 2.%,0`,,(%0%+*K` 0`3+1( `/!!)`*`!/5`0/'L`10`%0
%/`*+0L`!/,!%((5`3$!*`(//!/`.!`,,(%! `+*`0$!`"(5`+.`+*0!*0! `%*`0$!`(%!*0K
*+0$!.`,.!005`+))+*`+,!.0%+*`0$0`%/`*+*_0.%2%(`3%0$`.!#1(.``%/`/$.%*#`+*/0*0/
!03!!*`0$!`/05(!/`* `0$!`(%!*0`,,(%0%+*K`!`+"0!*`*!! `0+`'*+3`0$!`$!%#$0`+"``$! !.L
"+.`!4),(!L`0+`.!(1(0!`0$!`,+/%0%+*`+"`+0$!.`!(!)!*0/`0$0` !,!* `+*`%0K
1,,+/!L`"+.`!4),(!L`0$0`3!`3*0`0+`+,0%)%6!`0$!`35`3!`.!-1!/0`L`(+ %*#`0$!`
.!(0! `0+``,.0%1(.`,#!`+*(5`3$!*`0$!`1/!./`*2%#0!`0+`%0K` "`0$!``.!(0! `0+`0$%/`(/0
,#!`$/`/+)!`.1(!/`0$0`(/+`,,(5`0+`0$!`!(!)!*0/`+"` %""!.!*0`,#!/L`0$!`"0`0$0`%0`$/
!!*`(+ ! `(/0`+1( `""!0`0$!`/05(%*#`+"`0$!`.!/0`+"`0$!`,,K`+.`!4),(!L`%"`0$!`1/!.`#+!/
'`0+`0$!`,.!2%+1/`,#!L`0$!5`)%#$0`/!!``,#!`3%0$`` `0$0`%/`/(%#$0(5` %""!.!*0`0$*`0$!
"%./0`0%)!`0$!5`2%/%0! `%0K
S`8=8`T
'!`+1.`+),+*!*0/`++'`!10%"1( $,0!.`>
*`0$!`"+((+3%*#`/!0%+*L`3!`3%((`(++'`0`3$0`%0`)!*/`0+`1/!`%*(%*!`/05(!/`3%0$`!0`*
0$!`!*!"%0/`* ` +3*/% !/`+"`%0K
,QOLQHVW\OHV
$!`+""%%(`!0` +1)!*00%+*`/1##!/0/` !2!(+,!./`1/!`%*(%*!`/05(!/`0+`/05(!`0$!%.`!0
+),+*!*0/K`$%/`/!!)/`+ `!1/!`3!`((`(!.*! `%*`,/0`5!./`0$0`/!,.0%*#`0$!
+*!.*/`%/`%),+.0*0`* `3!`/$+1( `*+0`)%4`).'1,`* `K
!0`0.%!/`0+`$*#!`0$!`+*!,0`+"`/!,.0%+*`+"`+*!.*/`5`)+2%*#`%0`".+)`0$!`/!,.0%+*
+"`0!$*+(+#%!/`0+`0$!`/!,.0%+*`+"`+),+*!*0/K`!,.0%*#`).'1,L`/05(%*#L`* `(+#%`%*0+
%""!.!*0`"%(!/`3$!*`0$!5`.!`0%#$0(5`+1,(! `* `3$!.!`+*!`**+0`3+.'`3%0$+10`0$!`+0$!.
%/`&1/0`*`%((1/%+*K`2!*`%"`%0`$!(,/`'!!,`0$!`,.+&!0`/0.101.!`(!*!.L`%0` +!/`*+0`#%2!`*5`.!(
!*!"%0K
*`!0L`3!`+),+/!`+),+*!*0/`0+`.!0!`,,(%0%+*/`3$!.!`+),+*!*0/`.!`
"1* )!*0(`1*%0`+"`+1.`/0.101.!K`!`/$+1( `!`(!`0+`)+2!`+),+*!*0/`.+//`0$!
,,(%0%+*L`* `0$!5`/$+1( `,.+2% !`0$!`/)!`.!/1(0`.!#. %*#`+0$`(+#%`* ` L`*+
)00!.`3$!.!`0$!5`#!0`.!* !.! K
$%/`%/`+*!`+"`0$!`.!/+*/`3$5`+((+0%*#`0$!`/05(!/`3%0$%*`+1.`+),+*!*0/`* `,,(5%*#
0$!)`1/%*#`%*(%*!`/05(!/`+*`0$!`!(!)!*0/`+1( `)'!`/!*/!`%*`!0K
%./0L`(!0W/`(++'`0`*`!4),(!`+"`3$0`%0`)!*/`0+`1/!`0$!`/05(!`00.%10!`+"`0$!`*+ !/`0+
,,(5`0$!`/05(%*#`0+`+1.`+),+*!*0/`%*`!0K
!`.!`#+%*#`0+`.!0!``100+*`3%0$`0$!`0!40`(%'`)!PL`* `3!`.!`#+%*#`0+`,,(5``+(+.
* ``'#.+1* `+(+.`0+`%0M
FRQVW style = {
FRORU: 'palevioletred',
EDFNJURXQG&RORU: 'papayawhip'
};
FRQVW Button = () => EXWWRQVW\OH={style}!Click me!EXWWRQ!;
S`8=9`T
'!`+1.`+),+*!*0/`++'`!10%"1( $,0!.`>
/`5+1`*`/!!L`%0`%/`,.!005`!/5`0+`/05(!`!(!)!*0/`3%0$`%*(%*!`/05(!/`%*`!0K`!`&1/0`$2!`0+
.!0!`*`+&!0`3$!.!`0$!`00.%10!/`.!`0$!``.1(!/L`* `0$!`2(1!/`.!`0$!`2(1!/`3!
3+1( `1/!`%*``.!#1(.``"%(!K
0$!.`1/!`/!/`.!`*1)!./—0$!5`*`!`3.%00!*`3%0$+10`-1+0!/`+.`1*%0/`+"`)!/1.!)!*0
* L`5` !"1(0L`0$!5`.!`0.!0! `/`,%4!(/K
$!`"+((+3%*#`.1(!`,,(%!/``$!%#$0`+"`100`,4M
FRQVW style = {
KHLJKW: 100
};
!0W/`(++'`0`$+3`!/5`%0`%/`0+`1/!`%*(%*!`/05(!/`%*/0! K
S`8=:`T
'!`+1.`+),+*!*0/`++'`!10%"1( $,0!.`>
};
this.KDQGOH&KDQJH = this.handleChange.ELQG(this);
}
!`%),(!)!*0``/%),(!`$*#!`$* (!.L`3$!.!`3!`1/!`0$!`0.#!0`00.%10!`+"`0$!`!2!*0`0+
.!0.%!2!`0$!`1..!*0`2(1!`+"`0$!`"%!( M
KDQGOH&KDQJH({ WDUJHW: { value } }) {
this.VHW6WDWH({
YDOXH: 1XPEHU(value)
});
}
/0`10`*+0`(!/0L`3!`1/!`0$!`/05(!`00.%10!`+"`0$!`"%!( `0+`/!0`%0/`font-sizeK`/`5+1`*
/!!L`3!`.!`1/%*#`0$!`)!(/! `2!./%+*`+"`0$!``.1(!`0+`"+((+3`0$!`!0`+*2!*0%+*M
UHQGHU() {
UHWXUQ (
LQSXW
W\SH="number"
YDOXH={this.state.YDOXH}
RQ&KDQJH={this.KDQGOH&KDQJH}
VW\OH={{ IRQW6L]H: this.state.YDOXH }}
/>
);
}
+.`!4),(!L`3%0$`%*(%*!`/05(!/L`%0`%/`*+0`,+//%(!`0+`1/!`,/!1 +_/!(!0+./`Q"+.
!4),(!L`:hoverR`* `,/!1 +_!(!)!*0/L`3$%$`%/``,.!005`/%#*%"%*0`(%)%00%+*`%"`5+1`.!
.!0%*#`` `3%0$`%*0!.0%+*/`* `*%)0%+*/K
S`8=;`T
'!`+1.`+),+*!*0/`++'`!10%"1( $,0!.`>
2.%,0`+&!0/`**+0`$2!`03+`00.%10!/`3%0$`0$!`/)!`*)!K`05(!`"(('/`/$+1( `!
2+% ! L`10`%0`%/`(35/`#++ `0+`$2!`0$!`%(%05`0+`1/!`0$!)`%"`*!! ! K
*+0$!.`"!01.!`+"``0$0`%0`%/`*+0`,+//%(!`0+`!)1(0!`1/%*#`%*(%*!`/05(!/`%/`*%)0%+*/K
$!`3+.'.+1* `$!.!`%/`0+` !"%*!`*%)0%+*/`#(+((5`* `1/!`0$!)`%*/% !`0$!`/05(!
00.%10!`+"`0$!`!(!)!*0/K
%0$`%*(%*!`/05(!/L`((`0$!`/05(!/`+"`0$!`%0!)/`.!`(%/0! `%*`0$!%.`/05(!`00.%10!L`3$%$`)'!/`%0
2!.5`$. `0+`$!'`* ` !1#`0$!`.!/1(0K
S`8=<`T
'!`+1.`+),+*!*0/`++'`!10%"1( $,0!.`>
%0$`%*(%*!`/05(!/L`3!`.!`,100%*#`((`0$!`+*0!*0`+"`0$!``%*0+`0$!`).'1,L`3$%$` /`*
!40.`*1)!.`+"`50!/`0+`0$!`"%(!`0$0`3!`/!* `0+`0$!`(%!*0/`* `)'!/`0$!`3!`,,(%0%+*
,,!.`/(+3!.K
+),.!//%+*`(#+.%0$)/`*`$!(,`3%0$`0$0`!1/!`0$!5`*`!/%(5`+),.!//`/%)%(.
,00!.*/L`* L`%*`/+)!`/!/L`(+ %*#`0$!`.%0%(`,0$``%/``#++ `/+(10%+*L`10`%*`#!*!.(L
3!`/$+1( `0.5`0+`2+% `%0K
0`01.*/`+10`0$0`%*(%*!`/05(!/`#%2!`)+.!`,.+(!)/`0$*`0$!`,.+(!)/`0$!5`0.5`0+`/+(2!K
+.`0$%/`.!/+*L`0$!`+))1*%05`.!0! ` %""!.!*0`0++(/`0+`/+(2!`0$!`,.+(!)/`+"`%*(%*!`/05(!/
10`'!!,%*#`0$!`/05(!/`%*/% !`0$!`+),+*!*0/L`+.`(+(`0+`0$!`+),+*!*0/L`0+`#!0`0$!`!/0`+"
+0$`3+.( /K
*`0$!`!#%**%*#L`0$!.!`3!.!`03+`+.`0$.!!L`3$%(!`0+ 5`0$!.!`.!`)+.!`0$*`"+.05K
*`0$!`"+((+3%*#`/!0%+*/L`3!`3%((`#+`0$.+1#$`0$!`)+/0`,+,1(.`+*!/K
5DGLXP
*!`+"`0$!`"%./0`(%..%!/`0$0`3/`.!0! `0+`/+(2!`0$!`,.+(!)/`+"`%*(%*!`/05(!/`3!
!*+1*0!.! `%*`0$!`,.!2%+1/`/!0%+*`%/` %1)K` 0`%/`)%*0%*! `5`0$!`#.!0` !2!(+,!./
0`+.)% (!`/L`* `%0`%/`/0%((`+*!`+"`0$!`)+/0`,+,1(.`/+(10%+*/K
!`.!`#+%*#`0+`.!0!``2!.5`/%),(!`100+*L`/%)%(.`0+`0$!`+*!`3!`1%(0`%*`0$!`!4),(!
!.(%!.`%*`0$%/`$,0!.K
S`8==`T
'!`+1.`+),+*!*0/`++'`!10%"1( $,0!.`>
$!`100+*`3!`3%((`/0.0`3%0$`%/`.!0! `/`"+((+3/M
FRQVW Button = () => EXWWRQ!Click me!EXWWRQ!;
%./0L`3!`$2!`0+`%*/0((` %1)`1/%*#`npmM
QSPLQVWDOOVDYHUDGLXP
*!`0$!`%*/0((0%+*`%/`+),(!0!L`3!`*`%),+.0`0$!`(%..5`* `3.,`0$!`100+*`%*0+`%0M
LPSRUW radium IURP 'radium';
FRQVW Button = () => EXWWRQ!Click me!EXWWRQ!;
H[SRUWGHIDXOW UDGLXP(Button);
$!`.!/1(0`%/`0$!`"+((+3%*#`).'1,M
EXWWRQGDWDUDGLXP="true" VW\OH="background-color: rgb(255, 0, 0); width:
320px; padding: 20px; border-radius: 5px; border: none; outline:
none;"!Click me!EXWWRQ!
$!`+*(5` %""!.!*!`5+1`*`/!!`$!.!`%/`0$0`0$!.!`%/``data-radium`00.%10!`/!0
0+`true`00$! `0+`0$!`!(!)!*0K
S`8=>`T
'!`+1.`+),+*!*0/`++'`!10%"1( $,0!.`>
+3!2!.L`%"`5+1`+,!*`5+1.`!2++(/`* `0.5`0+`"+.!`0$!`:hover`/001/`%*`0$!`05(!/`,*!(L
5+1`3%((`/!!`0$0`*+0$%*#`$,,!*/K
$!`.!/+*`5+1`*`/!!`0$!`$+2!.`!""!0`10`5+1`**+0`/%)1(0!`%0`3%0$``%/`0$0` %1)
1/!/` 2.%,0`0+`,,(5`* `.!)+2!`0$!`$+2!.`/00!` !"%*! `%*`0$!`/05(!`+&!0K
"`5+1`$+2!.`+2!.`0$!`!(!)!*0`3%0$`0$!`!2++(/`+,!*L`5+1`*`/!!`0$0`0$!`/05(!`/0.%*#
$*#!/`* `0$!`+(+.`#!0/` ! `0+`%0` 5*)%((5M
EXWWRQGDWDUDGLXP="true" VW\OH="background-color: rgb(255, 0, 0); width:
320px; padding: 20px; border-radius: 5px; border: none; outline: none;
color: rgb(255, 255, 255);"!Click me!EXWWRQ!
S`8=?`T
'!`+1.`+),+*!*0/`++'`!10%"1( $,0!.`>
!0W/`(++'`0`$+3`%0`3+.'/—0$!` `%/`,.!005`/%)%(.N`3!`$2!`0+`.!0!``*!3`00.%10!`+*
+1.`/05(!`+&!0`* `*!/0`0$!`/05(!/`0$0`)1/0`!`,,(%! `3$!*`0$!`)! %`-1!.5`)0$!/
%*/% !`%0M
FRQVW styles = {
EDFNJURXQG&RORU: '#ff0000',
ZLGWK: 320,
SDGGLQJ: 20,
ERUGHU5DGLXV: 5,
ERUGHU: 'none',
RXWOLQH: 'none',
KRYHU : {
FRORU: '#fff'
},
DFWLYH : {
SRVLWLRQ: 'relative',
WRS: 2
},
#PHGLD PD[ZLGWKS[ : {
ZLGWK: 160
}
};
S`8=@`T
'!`+1.`+),+*!*0/`++'`!10%"1( $,0!.`>
+L`0$!`% !`%/`0+`%),+.0`0$!`StyleRoot`+),+*!*0M
LPSRUW { StyleRoot } IURP 'radium';
$!*L`3!`*`3.,`+1.`!*0%.!`,,(%0%+*`%*/% !`%0M
FODVV App H[WHQGV Component {
UHQGHU() {
UHWXUQ (
<StyleRoot>
...
</StyleRoot>
)
}
}
$!`rmq-1d8d7428`(//`$/`!!*`,,(%! `0+`0$!`100+*`10+)0%((5L`/`3!((M
EXWWRQFODVV="rmq-1d8d7428" GDWDUDGLXP="true" VW\OH="background-color:
rgb(255, 0, 0); width: 320px; padding: 20px; border-radius: 5px; border:
none; outline: none;"!Click me!EXWWRQ!
"`5+1`*+3`.!/%6!`0$!`.+3/!.`3%* +3L`5+1`*`/!!`0$0`0$!`100+*`!+)!/`/)((!.`"+.
/)((`/.!!*/L`/`!4,!0! K
&66PRGXOHV
"`5+1`"!!(`0$0`%*(%*!`/05(!/`.!`*+0``/1%0(!`/+(10%+*`"+.`5+1.`,.+&!0`* `5+1.`0!)L`10
5+1`/0%((`3*0`0+`'!!,`0$!`/05(!/`/`(+/!`/`,+//%(!`0+`5+1.`+),+*!*0/L`0$!.!`%/``/+(10%+*
"+.`5+1L`((! ``)+ 1(!/K
S`8>7`T
'!`+1.`+),+*!*0/`++'`!10%"1( $,0!.`>
:HESDFN
!"+.!` %2%*#`%*0+``)+ 1(!/`* `(!.*%*#`$+3`%0`3+.'/L`%0`%/`%),+.0*0`0+`1* !./0*
$+3`%0`3/`.!0! `* `0$!`0++(/`0$0`/1,,+.0`%0K
*`0$!`!0`3+.( L`3!,'`%/`!/,!%((5`,+,1(.`!1/!`%0`+""!./`)*5`%*0!.!/0%*#`*
1/!"1(`"!01.!/L`3%0$`0$!`"%./0`+*!`!%*#`0$!`+*!,0`+"`(+ !./K`%0$`3!,'L`5+1`*
,+0!*0%((5`(+ `*5` !,!* !*%!/`+0$!.`0$*` 2.%,0L`%"`0$!.!`%/``(+ !.`"+.`%0K`+.
!4),(!L`5+1`*`(+ ` `"%(!/L`/`3!((`/`%)#!/`* `+0$!.`//!0/L`%*/% !`0$!`1* (!K
6HWWLQJXSDSURMHFW
*`0$%/`/!0%+*L`3!`3%((`(++'`0`$+3`0+`/!0`1,``2!.5`/%),(!`3!,'`,,(%0%+*L`1/%*#
!(`0+`0.*/,%(!`0$!` 2.%,0`* `0$!``)+ 1(!/`0+`(+ `+1.`(+((5`/+,! ``%*0+
0$!`1* (!K`!`3%((`(/+`#+`0$.+1#$`((`0$!`"!01.!/`+"``)+ 1(!/`* `(++'`0`0$!
,.+(!)/`0$!5`*`/+(2!K`$!`"%./0`0$%*#`0+` +`%/`)+2!`0+`*`!),05`"+( !.`* `.1*`0$!
"+((+3%*#`+ !M
QSPLQLW
$%/`3%((`.!0!``package.json`3%0$`/+)!` !"1(0/K
S`8>8`T
'!`+1.`+),+*!*0/`++'`!10%"1( $,0!.`>
/0`10`*+0`(!/0L`3!`%*/0((`react`* `react-dom`0+`1/!`0$!)`%*`+1.`/%),(!`!4),(!M
QSPLQVWDOOUHDFWUHDFWGRP
"VFULSWV": {
"VWDUW": "webpack-dev-server"
}
PRGXOHH[SRUWV = {};
$!`+&!0`3!`!4,+.0`.!,.!/!*0/`0$!`+*"%#1.0%+*`+&!0`1/! `5`3!,'`0+`.!0!`0$!
1* (!L`* `%0`*`$2!` %""!.!*0`,.+,!.0%!/` !,!* %*#`+*`0$!`/%6!`* `0$!`"!01.!/`+"`0$!
,.+&!0K
!`3*0`0+`'!!,`+1.`!4),(!`2!.5`/%),(!L`/+`3!`.!`#+%*#`0+` `0$.!!`00.%10!/K
$!`"%./0`+*!`%/`0$!`!*0.5L`3$%$`0!((/`3!,'`3$!.!`0$!`)%*`"%(!`+"`+1.`,,(%0%+*`%/M
HQWU\: './index.js'
S`8>9`T
'!`+1.`+),+*!*0/`++'`!10%"1( $,0!.`>
!`.!`/5%*#`0$0`0$!`"%(!/`0$0`)0$`0$!`.js``+.`.jsx`.!#!4`.!`(+ ! `1/%*#`0$!`babel-
loader`/+`0$0`0$!5`#!0`0.*/,%(! `* `(+ ! `%*0+`0$!`1* (!K
+1`)5`(/+`$2!`*+0%! `0$0`3!`.!`/!00%*#`0$!`,.!/!0/`%*`0$!.!`/`3!((K`/`3!`/3
%*`Chapter 2L`(!*`,`+1.`+ !L`0$!`,.!/!0/`.!`/!0/`+"`+*"%#1.0%+*`+,0%+*/`0$0`%*/0.10
!(`+*`$+3`0+` !(`3%0$`0$!` %""!.!*0`05,!/`+"`/5*04`Q"+.`!4),(!L` RK
S`8>:`T
'!`+1.`+),+*!*0/`++'`!10%"1( $,0!.`>
$!`+),(!0!`webpack.config.js`/$+1( `!`(%'!`0$%/M
FRQVW HtmlWebpackPlugin = UHTXLUH('html-webpack-plugin');
module.H[SRUWV = {
HQWU\: './index.js',
PRGXOH: {
UXOHV: [
{
WHVW: /\.(jsx|js)$/,
H[FOXGH: /node_modules/,
XVH: {
ORDGHU: 'babel-loader',
RSWLRQV: {
SUHVHWV: [
'@babel/preset-env',
'@babel/preset-react'
]
}
}
},
{
WHVW: /\.css/,
XVH: [
'style-loader',
'css-loadermodules=true'
]
}
]
},
SOXJLQV: [QHZ +WPO:HESDFN3OXJLQ()]
};
S`8>;`T
'!`+1.`+),+*!*0/`++'`!10%"1( $,0!.`>
WLWOH!Webpack AppWLWOH!
<KHDG!
ERG\!
VFULSWW\SH="text/javascript" VUF="bundle.js"!VFULSW!
ERG\!
KWPO!
/RFDOO\VFRSHG&66
+3L`%0`%/`0%)!`0+`.!0!`+1.`,,L`3$%$`3%((`+*/%/0`+"``%),(!`100+*L`+"`0$!`/)!`/+.0`3!
1/! `%*`,.!2%+1/`!4),(!/K`!`3%((`1/!`%0`0+`/$+3`((`0$!`"!01.!/`+"`0$!``)+ 1(!/K
!0W/`.!0!`*`index.js`"%(!L`3$%$`%/`0$!`!*0.5`3!`/,!%"%! `%*`0$!`3!,'`+*"%#1.0%+*L
* `(!0W/`%),+.0`React`* `ReactDOM`/`3!((M
LPSRUW React IURP 'react';
LPSRUW { render } IURP 'react-dom';
!`*`0$!*`.!0!``%),(!`100+*K`/`1/1(L`3!`.!`#+%*#`0+`/0.0`3%0$``*+*/05(!
100+*L`* `3!`3%((` `0$!`/05(!/`/0!,`5`/0!,M
FRQVW Button = () => EXWWRQ!Click me!EXWWRQ!;
%*((5L`3!`*`.!* !.`0$!`100+*`%*0+`0$!`M
UHQGHU(%XWWRQ!, document.ERG\);
+3L`/1,,+/!`3!`3*0`0+`,,(5`/+)!`/05(!/`0+`0$!`100+*—`'#.+1* `+(+.L`0$!`/%6!L
* `/+`+*K
S`8><`T
'!`+1.`+),+*!*0/`++'`!10%"1( $,0!.`>
$!`.!/1(0`+"`0$%/`import`/00!)!*0`%/``styles`+&!0L`3$!.!`((`0$!`00.%10!/`.!`0$!
(//!/` !"%*! `%*`0$!`index.cssK
"`3!`.1*`console.log(styles)L`3!`*`/!!`0$!`"+((+3%*#`+&!0`%*`!2++(/M
{
EXWWRQ: "_2wpxM3yizfwbWee6k0UlD4"
}
+L`3!`$2!`*`+&!0`3$!.!`0$!`00.%10!/`.!`0$!`(//`*)!/`* `0$!`2(1!/`.!
Q,,.!*0(5R`.* +)`/0.%*#/K`!`3%((`/!!`(0!.`0$0`0$!5`.!`*+*.* +)L`10`(!0W/`$!'
3$0`3!`*` +`3%0$`0$0`+&!0`"%./0K
!`*`1/!`0$!`+&!0`0+`/!0`0$!`(//`*)!`00.%10!`+"`+1.`100+*L`/`"+((+3/M
FRQVW Button = () => (
EXWWRQFODVV1DPH={styles.EXWWRQ}!Click me!EXWWRQ!
);
* `0$0`%/`*+0`)#%L`!1/!`%"`3!`$!'`%*`!2++(/L`0$!`(//`0$0`$/`!!*`,,(%! `0+
0$!`!(!)!*0`%/`0$!`/)!`/0.%*#`0$0W/`00$! `0+`0$!`/05(!`+&!0`3!`%),+.0! `%*/% !`+1.
+ !M
EXWWRQFODVV="_2wpxM3yizfwbWee6k0UlD4"!Click me!EXWWRQ!
"`3!`(++'`0`0$!`$! !.`/!0%+*`+"`0$!`,#!L`3!`*`*+3`/!!`0$0`0$!`/)!`(//`*)!`$/
(/+`!!*`%*&!0! `%*0+`0$!`,#!M
VW\OHW\SH WH[WFVV!
BZS[0\L]IZE:HHN8O' {
background-color: #ff0000;
width: 320px;
padding: 20px;
border-radius: 5px;
border: none;
outline: none;
}
VW\OH!
S`8>=`T
'!`+1.`+),+*!*0/`++'`!10%"1( $,0!.`>
$%/`%/`2!.5`,+3!."1(`!1/!`3!`$2!`0$!`"1((`,+3!.`* `!4,.!//%2!*!//`+"`0$!`L
+)%*! `3%0$`0$!` 2*0#!/`+"`$2%*#`(+((5`/+,! `(//`*)!/`* `!4,(%%0
!,!* !*%!/K
+.`!4),(!L`3!`*` ``.1(!/`(%'!`0$!`"+((+3%*#M
EXWWRQKRYHU {
color: #fff;
}
EXWWRQDFWLYH {
position: relative;
top: 2px;
}
#PHGLD PD[ZLGWKS[ {
EXWWRQ {
width: 160px
}
}
S`8>>`T
'!`+1.`+),+*!*0/`++'`!10%"1( $,0!.`>
+.`!4),(!L`3!`*`$*#!`0$!`2(1!`+"`0$!`(+ !.`/`"+((+3/M
{
WHVW: /\.css/,
XVH: [
'style-loader',
'css-loadermodules=true&ORFDO,GHQW1DPH >ORFDO@>KDVKEDVH@'
]
}
0$!.`2%((!`,(!$+( !./`.!`[path]L`3$%$`.!,.!/!*0/`0$!`,0$`+"`0$!``"%(!L`*
[name]L`3$%$`%/`0$!`*)!`+"`0$!`/+1.!``"%(!K
0%20%*#`0$!`,.!2%+1/`+*"%#1.0%+*`+,0%+*L`0$!`.!/1(0`3!`$2!`%*`0$!`.+3/!.`%/`/
"+((+3/M
EXWWRQFODVV="button--2wpxM"!Click me!EXWWRQ!
S`8>?`T
'!`+1.`+),+*!*0/`++'`!10%"1( $,0!.`>
%0$`3!,'L`%0`%/`,.!005`/0.%#$0"+.3. `!1/!`3!`*`$2!`)1(0%,(!`+*"%#1.0%+*`"%(!/
0$0`*`!`1/! `%*`0$!` %""!.!*0`/0#!/`+"`+1.`,,(%0%+*`(%"!`5(!K`(/+L`%*`,.+ 10%+*L`3!
)5`3*0`0+`!40.0`0$!``"%(!`%*/0! `+"`%*&!0%*#`%0`%*0+`0$!`.+3/!.`".+)`0$!`1* (!`/+
0$0`3!`*`$2!``(%#$0!.`1* (!`* `$!`0$!``+*```"+.`!00!.`,!."+.)*!K
$!.!`.!``+1,(!`+"`"!01.!/`+"``)+ 1(!/`0$0`.!`3+.0$`)!*0%+*%*#K
$!`"%./0`+*!`%/`0$!`global`'!53+. K`.!"%4%*#`*5`(//`3%0$`:globalL`%*`"0L`)!*/
/'%*#``)+ 1(!/`*+0`0+`/+,!`0$!`1..!*0`/!(!0+.`(+((5K
+.`!4),(!L`(!0W/`/5`3!`$*#!`+1.``/`"+((+3/M
JOREDOEXWWRQ {
...
}
$!`+10,10`3%((`!`/`"+((+3/M
EXWWRQ {
...
}
5`"2+.%0!`"!01.!`+"``)+ 1(!/`%/`+),+/%0%+*K`%0$`+),+/%0%+*L`3!`*`(//!/`".+)
0$!`/)!`"%(!`+.`!40!.*(` !,!* !*%!/`* `#!0`((`0$!`/05(!/`,,(%! `0+`0$!`!(!)!*0K
!`*`0$!*`+),+/!`%0`%*/% !`+1.`100+*`%*`0$!`"+((+3%*#`35M
EXWWRQ {
composes: background-red;
width: 320px;
S`8>@`T
'!`+1.`+),+*!*0/`++'`!10%"1( $,0!.`>
padding: 20px;
border-radius: 5px;
border: none;
outline: none;
}
$%/`%/``2!.5`,+3!."1(`"!01.!`* `%0`3+.'/`%*``"/%*0%*#`35K`+1`)%#$0`!4,!0`0$0`((
0$!`+),+/! `(//!/`.!` 1,(%0! `%*/% !`0$!`(//!/`3$!.!`0$!5`.!`.!"!.!*! `/
`@extend` +!/L`10`0$0`%/`*+0`0$!`/!K`%),(5`,10L`((`0$!`+),+/! `(//`*)!/`.!
,,(%! `+*!`"0!.`0$!`+0$!.`+*`0$!`+),+*!*0`%*`0$!`K
*`+1.`/,!%"%`/!L`3!`3+1( `$2!`0$!`"+((+3%*#M
EXWWRQFODVV="_2wpxM3yizfwbWee6k0UlD4 Sf8w9cFdQXdRV_i9dgcOq"!Click
me!EXWWRQ!
!.!L`0$!``0$0`%/`%*&!0! `%*0+`0$!`,#!`%/`/`"+((+3/M
6IZF)G4;G59BLGJF2T {
background-color: #ff0000;
}
BZS[0\L]IZE:HHN8O' {
width: 320px;
padding: 20px;
border-radius: 5px;
border: none;
outline: none;
}
$WRPLF&66PRGXOHV
0`/$+1( `!`(!.`$+3`+),+/%0%+*`3+.'/`* `3$5`%0`%/``2!.5`,+3!."1(`"!01.!`+"`
)+ 1(!/K`0`(*L`0$!`+),*5`3$!.!` `3+.'! `3$!*` `/0.0! `3.%0%*#`0$%/`++'L`3!`0.%!
0+`,1/$`%0``/0!,`"1.0$!.L`+)%*%*#`0$!`,+3!.`+"`composes`3%0$`0$!`"(!4%%(%05`+"`0+)%
`Q(/+`'*+3*`/`1*0%+*(`RK
0+)%``%/``35`0+`1/!``3$!.!`!2!.5`(//`$/``/%*#(!`.1(!K
S`8?7`T
'!`+1.`+),+*!*0/`++'`!10%"1( $,0!.`>
+.`!4),(!L`3!`*`.!0!``(//`0+`/!0`0$!`).#%*_+00+)`0+`6!.+M
PE {
margin-bottom: 0;
}
!`*`1/!`*+0$!.`+*!`0+`/!0`0$!`"+*0_3!%#$0`0+`600M
IZ {
font-weight: 600;
}
$!*L`3!`*`,,(5`((`0$+/!`0+)%`(//!/`0+`0$!`!(!)!*0/M
KFODVV="mb0 fw6"!Hello ReactK!
$!`%##!/0`.#1)!*0`#%*/0`0+)%``%/`1/1((5`0$0`5+1`.!`)+2%*#`0$!`/05(%*#`(+#%
".+)`0$!``0+`0$!`).'1,L`3$%$`%/`3.+*#K`(//!/`.!` !"%*! `%*``"%(!/L`10`0$!5`.!
+),+/! `%*`0$!`2%!3/L`* `!2!.5`0%)!`5+1`$2!`0+`)+ %"5`0$!`/05(!`+"`*`!(!)!*0L`5+1`!*
1,`! %0%*#`0$!`).'1,K
*`"0L`3$!*`((`0$!`/!`.1(!/`$2!`!!*`#!*!.0! L`,,(5%*#`0$+/!`(//!/`0+`0$!`!(!)!*0/
* `.!0%*#`*!3`/05(!/`%/``2!.5`-1%'`,.+!//L`3$%$`%/`#++ K`!+* L`1/%*#`0+)%`L
3!`*`+*0.+(`0$!`/%6!`+"`0$!``"%(!L`!1/!`/`/++*`/`3!`.!0!`*!3`+),+*!*0/`3%0$
0$!%.`/05(!/L`3!`.!`1/%*#`!4%/0%*#`(//!/`* `3!` +`*+0`*!! `0+`.!0!`*!3`+*!/L`3$%$`%/
#.!0`"+.`,!."+.)*!K
S`8?8`T
'!`+1.`+),+*!*0/`++'`!10%"1( $,0!.`>
!0W/`(++'`0`*`!4),(!M
WLWOH {
FRPSRVHV: mb0 fw6;
}
!.!W/`*+0$!.`!4),(!M
KFODVV1DPH={styles.title}!Hello ReactK!
5HDFW&66PRGXOHV
/0`10`*+0`(!/0L`0$!.!`%/``#.!0`(%..5`0$0`*`$!(,`1/`3+.'`3%0$``)+ 1(!/K`+1`)5
$2!`*+0%! `$+3`3!`3!.!`1/%*#``/05(!`+&!0`0+`(+ `((`0$!`(//!/`+"`0$!`L`*
!1/!` 2.%,0` +!/`*+0`/1,,+.0`$5,$!*0! `00.%10!/L`3!`.!`"+.! `0+`1/!`
)!(/! `(//`*)!K
(/+L`%"`3!`.!`.!"!.!*%*#``(//`*)!`0$0` +!/`*+0`!4%/0`%*`0$!``"%(!L`0$!.!`%/`*+`35`0+
'*+3`%0L`* `undefined`%/` ! `0+`0$!`(%/0`+"`(//!/K
+.`0$!/!`* `+0$!.`1/!"1(`"!01.!/L`3!`)5`3*0`0+`0.5``,'#!`0$0`)'!/`3+.'%*#`3%0$
`)+ 1(!/`!2!*`/)++0$!.K
!0W/`(++'`0`3$0`%0`)!*/`0+`#+`'`0+`0$!`index.js`3!`3!.!`1/%*#`,.!2%+1/(5`%*`0$%/
/!0%+*`3%0$`,(%*``)+ 1(!/L`* `$*#!`%0`0+`1/!`!0``)+ 1(!/`%*/0! K
S`8?9`T
'!`+1.`+),+*!*0/`++'`!10%"1( $,0!.`>
+3L`3!`$2!`0+`$*#!`0$!`%),(!)!*00%+*`+"`0$!`100+*`0+`2+% `1/%*#`0$!`styles
+&!0K`%0$`!0``)+ 1(!/L`3!`1/!`0$!`styleName`,.+,!.05L`3$%$`%/`0.*/"+.)!
%*0+``.!#1(.`(//K
$!`#.!0`0$%*#`+10`0$%/`%/`0$0`3!`*`1/!`0$!`(//`*)!`/``/0.%*#`Q"+.
!4),(!L`"button"RM
FRQVW Button = () => EXWWRQVW\OH1DPH="button"!Click me!EXWWRQ!;
"`3!`*+3`.!* !.`0$!`EnhancedButton`%*0+`0$!`L`3!`3%((`/!!`0$0`*+0$%*#`$/`.!((5
$*#! `".+)`!"+.!L`3$%$`)!*/`0$0`0$!`(%..5`3+.'/K
!0W/`/5`3!`0.5`0+`$*#!`0$!`styleName`,.+,!.05`0+`.!"!.!*!``*+*!4%/0%*#`(//`*)!L`/
"+((+3/M
LPSRUW React IURP 'react';
LPSRUW { render } IURP 'react-dom';
LPSRUW styles IURP './index.css';
LPSRUW cssModules IURP 'react-css-modules';
UHQGHU((QKDQFHG%XWWRQ!, document.ERG\);
!`3%((`/!!`0$!`"+((+3%*#`!..+.`%*`0$!`+*/+(!`+"`0$!`.+3/!.`5` +%*#`/+M
Uncaught Error: "button1" CSS module is undefined.
S`8?:`T
'!`+1.`+),+*!*0/`++'`!10%"1( $,0!.`>
6W\OHGFRPSRQHQWV
$!.!`%/``(%..5`0$0`%/`2!.5`,.+)%/%*#`!1/!`%0`0'!/`%*0+`+1*0`((`0$!`,.+(!)/`0$!
+0$!.`(%..%!/`$2!`!*+1*0!.! `%*`/05(%*#`+),+*!*0/K
!0W/`(++'`0`$+3`%0`%/`,+//%(!`0+`.!0!`0$!`/)!`100+*`3!`/3`%*`0$!`,.!2%+1/`/!0%+*/L
* `$!'`%"`((`0$!``"!01.!/`3!`.!`%*0!.!/0! `%*`Q"+.`!4),(!L`,/!1 +_(//!/`*
)! %`-1!.%!/R`3+.'`3%0$`/05(! `+),+*!*0/K
%./0L`3!`$2!`0+`%*/0((`0$!`(%..5`5`.1**%*#`0$!`"+((+3%*#`+))* M
QSPLQVWDOOVW\OHGFRPSRQHQWV
0`0$0`,+%*0L`3!`*`1/!`0$!`styled`"1*0%+*`0+`.!0!`*5`!(!)!*0`5
1/%*#`styled.elementNameL`3$!.!`elementName`*`!``divL``100+*L`+.`*5`+0$!.
2(% ``!(!)!*0K
$%/`)!*/`0$0`0$!`"1*0%+*`.!!%2!/`0$!`01(`0!),(0!`3%0$`((`0$!` 2.%,0
!4,.!//%+*/L`* `0$%/`)'!/`0$!`(%..5`(!`0+`1/!`0$!`"1((`,+3!.`+"` 2.%,0`0+`,,(5`0$!
/05(!/`0+`0$!`!(!)!*0/K
!0W/`/0.0`5`.!0%*#``/%),(!`100+*`3%0$``/%`/05(%*#M
FRQVW Button = styled.EXWWRQC
backgroundColor: #ff0000;
width: 320px;
S`8?;`T
'!`+1.`+),+*!*0/`++'`!10%"1( $,0!.`>
padding: 20px;
borderRadius: 5px;
border: none;
outline: none;
C;
$!`"+((+3%*#`%/`0$!`+),+*!*0`0$0`#!0/`.!* !.! M
EXWWRQFODVV="kYvFOg"!Click me!EXWWRQ!
$!`/05(!`0$0`#!0/` ! `0+`0$!`,#!`%/`/`"+((+3/M
N<Y)2J {
background-color: #ff0000;
width: 320px;
padding: 20px;
border-radius: 5px;
border: none;
outline: none;
}
+.`!4),(!L`%0`/1,,+.0/`,/!1 +_(//!/`1/%*#``_(%'!`/5*04M
FRQVW Button = styled.EXWWRQ`
background-color: #ff0000;
width: 320px;
padding: 20px;
border-radius: 5px;
border: none;
outline: none;
&:hover {
color: #fff;
}
&:active {
position: relative;
top: 2px;
}
`;
S`8?<`T
'!`+1.`+),+*!*0/`++'`!10%"1( $,0!.`>
0`(/+`/1,,+.0/`)! %`-1!.%!/M
FRQVW Button = styled.EXWWRQ`
background-color: #ff0000;
width: 320px;
padding: 20px;
border-radius: 5px;
border: none;
outline: none;
&:hover {
color: #fff;
}
&:active {
position: relative;
top: 2px;
}
@media (max-width: 480px) {
width: 160px;
}
`;
$!.!`.!`)*5`+0$!.`"!01.!/`0$0`0$%/`(%..5`*`.%*#`0+`5+1.`,.+&!0K
*+0$!.`#.!0`"!01.!`%/`0$!)%*#K`.,,%*#`5+1.`+),+*!*0/`%*0+``ThemeProvider
+),+*!*0L`5+1`*`%*&!0``0$!)!`,.+,!.05` +3*`0+`0$!`0$.!!L`3$%$`)'!/`%0`!40.!)!(5
!/5`0+`.!0!` /`3$!.!`,.0`+"`0$!`/05(!`%/`/$.! `!03!!*`+),+*!*0/`* `/+)!`+0$!.
,.+,!.0%!/` !,!* `+*`0$!`1..!*0(5`/!(!0! `0$!)!K
S`8?=`T
'!`+1.`+),+*!*0/`++'`!10%"1( $,0!.`>
6XPPDU\
*`0$%/`$,0!.L`3!`(++'! `0``(+0`+"`%*0!.!/0%*#`0+,%/K`!`/0.0! `5`#+%*#`0$.+1#$`0$!
,.+(!)/`+"``0`/(!L`/,!%"%((5L`0$!`,.+(!)/`0$0`0$!5`$ `0`!++'`3$%(!` !(%*#
3%0$`K
%*((5L`3!`$ ``-1%'`(++'`0`styled`+),+*!*0/L`3$%$`%/``2!.5`,.+)%/%*#`(%..5`*
%/`)!*0`0+`$*#!`0$!`35`3!`,,.+$`0$!`/05(%*#`+"`+),+*!*0/`+),(!0!(5K
S`8?>`T
6HUYHU6LGH5HQGHULQJIRU)XQ
DQG3URILW
$!`*!40`/0!,`0+`1%( %*#`!0`,,(%0%+*/`%/`+10`(!.*%*#`$+3`0$!`/!.2!._/% !
.!* !.%*#`3+.'/`* `3$0`!*!"%0/`%0`*`#%2!`1/K`$!`1*%2!./(`,,(%0%+*/`.!`!00!.`"+.
L`* `0$!5`!*(!`'*+3(! #!`/$.%*#`!03!!*`0$!`".+*0!* `* `0$!`'!* K`$!5`*
(/+`%),.+2!`0$!`,!.!%2! `/,!! `+"``3!`,,(%0%+*L`3$%$`1/1((5`(! /`0+`%*.!/!
+*2!./%+*/K` +3!2!.L`,,(5%*#`/!.2!._/% !`.!* !.%*#`0+``!0`,,(%0%+*`+)!/`3%0$`
+/0L`* `3!`/$+1( `0$%*'`.!"1((5`+10`3$!0$!.`3!`*!! `%0`+.`*+0K
*`0$%/`$,0!.L`3!`3%((`+2!.`0$!`"+((+3%*#M
* !./0* %*#`3$0``1*%2!./(`,,(%0%+*`%/
%#1.%*#`+10`0$!`.!/+*/`3$5`3!`)5`3*0`0+`!*(!`/!.2!._/% !`.!* !.%*#
.!0%*#``/%),(!`/00%`/!.2!._/% !`.!* !.! `,,(%0%+*`3%0$`!0
%*#` 0`"!0$%*#`0+`/!.2!._/% !`.!* !.%*#`* `1* !./0* %*#`+*!,0/`/1$
/` !$5 .0%+*\$5 .0%+*
/%*#`!40K&/`5`!%0$`0+`!/%(5`.!0!``!0`,,(%0%+*`0$0`.1*/`+*`+0$`0$!
/!.2!.`* `0$!`(%!*0
!.2!._% !`!* !.%*#`"+.`1*`* `.+"%0 $,0!.`?
8QLYHUVDODSSOLFDWLRQV
$!*`3!`0('`+10` 2.%,0`3!`,,(%0%+*/L`3!`1/1((5`0$%*'`+"`(%!*0_/% !`+ !`0$0
(%2!/`%*`0$!`.+3/!.K
$!`35`0$!5`1/1((5`3+.'`%/`0$0`0$!`/!.2!.`.!01.*/`*`!),05` `,#!`3%0$``/.%,0`0#
0+`(+ `0$!`,,(%0%+*K`$!*`0$!`,,(%0%+*`%/`.! 5L`%0`)*%,1(0!/`0$!``%*/% !`0$!
.+3/!.`0+`/$+3`0$!` `* `0+`%*0!.0`3%0$`1/!./K`$%/`$/`!!*`0$!`/!`"+.`0$!`(/0`"!3
5!./L`* `%0`%/`/0%((`0$!`35`0+`#+`"+.``$1#!`*1)!.`+"`,,(%0%+*/K
*`0$%/`++'L`3!`$2!`/!!*`$+3`!/5`%0`%/`0+`.!0!`,,(%0%+*/`1/%*#`!0`+),+*!*0/`*
$+3`0$!5`3+.'`3%0$%*`0$!`.+3/!.K`$0`3!`$2!`*+0`/!!*`5!0`%/`$+3`!0`*`.!* !.`0$!
/)!`+),+*!*0/`+*`0$!`/!.2!.L`#%2%*#`1/``,+3!."1(`"!01.!`((! `/!.2!._/% !
.!* !.%*#`QRK
%0$`!0L`%*`,.0%1(.L`0$!`+*!,0`+"`%/+)+.,$%`3!`,,(%0%+*/`!)!`2!.5`,+,1(.
3%0$%*`0$!` 2.%,0`+))1*%05K`.%0%*#`*`%/+)+.,$%`,,(%0%+*`)!*/`1%( %*#`*
,,(%0%+*`0$0`(++'/`0$!`/)!`+*`0$!`/!.2!.`* `0$!`(%!*0K
$!`"0`0$0`0$!`/)!`(*#1#!`%/`1/! `0+`3.%0!`0$!`03+`,,(%0%+*/`)!*/`0$0``%#`,.0
+"`0$!`(+#%`*`!`/$.! L`3$%$`+,!*/`)*5`,+//%%(%0%!/K`$%/`)'!/`0$!`+ !`/!`!/%!.
0+`.!/+*`+10`* `2+% /`1**!!//.5` 1,(%0%+*K
S`8?@`T
!.2!._% !`!* !.%*#`"+.`1*`* `.+"%0 $,0!.`?
$!`0!.)`%/+)+.,$%` +!/`*+0`"%0`%*`0$%/`/!*.%+L`!1/!L`%*`0$!`/!`+"`!0L`0$!
,,(%0%+*/`.!`0$!`/)!L`* `0$0`%/`3$5`+*!`+"`0$!`.!0+./`+"`!0`+10!.L`%$!(
'/+*L`,.+,+/! ``)+.!`)!*%*#"1(`*)!`"+.`0$%/`,00!.*M`1*%2!./(K
`*%2!./(`,,(%0%+*`%/`*`,,(%0%+*`0$0`*`.1*`+0$`+*`0$!`/!.2!._`* `0$!`(%!*0_
/% !`3%0$`0$!`/)!`+ !K
5HDVRQVWRLPSOHPHQW665
`%/``#.!0`"!01.!L`10`3!`/$+1( `*+0`&1),`%*0+`%0`&1/0`"+.`0$!`/'!`+"`%0N`3!`/$+1( `$2!
`.!(`* `/+(% `.!/+*`0+`/0.0`1/%*#`%0K` *`0$%/`/!0%+*L`3!`3%((`(++'`0`$+3`/!.2!._/% !
.!* !.%*#`*`$!(,`+1.`,,(%0%+*`* `3$0`,.+(!)/`%0`*`/+(2!`"+.`1/K
6(2
*!`+"`0$!`)%*`.!/+*/`3!`)5`3*0`0+`.!* !.`+1.`,,(%0%+*/`+*`0$!`/!.2!._/% !
%/`/!.$`!*#%*!`+,0%)%60%+*`QRK
"`3!`/!.2!`*`!),05` `/'!(!0+*`0+`0$!`.3(!./`+"`0$!`)%*`/!.$`!*#%*!/L`0$!5`.!
*+0`(!`0+`!40.0`*5`)!*%*#"1(`%*"+.)0%+*`".+)`%0K`+3 5/L` ++#(!`/!!)/`0+`!`(!
0+`.1*` 2.%,0L`10`0$!.!`.!`/+)!`(%)%00%+*/L`* ``%/`+"0!*``.%0%(`/,!0`+"`+1.
1/%*!//!/K
S`8@7`T
!.2!._% !`!* !.%*#`"+.`1*`* `.+"%0 $,0!.`?
$%/`%/`#.!0L`*+0`+*(5`"+.`L`10`(/+`"+.`/+%(`/$.%*#`/!.2%!/K`(0"+.)/`/1$`/
!++'`+.`3%00!.`#%2!`1/``35`+"` !"%*%*#`0$!`+*0!*0`+"`0$!`/*%,,!0/`0$0`.!`/$+3*
3$!*`+1.`,#!/`.!`/$.! K
+.`!4),(!L`1/%*#`,!*` .,$L`3!`*`0!((`!++'`0$0L`"+.``,.0%1(.`,#!L`3!`3*0`
!.0%*`%)#!`0+`!`/$+3*`* ``,.0%1(.`0%0(!`0+`!`1/! `/`0$!`0%0(!`+"`0$!`,+/0K
"`+1.`/!.2!.`.!01.*/`*`!),05` `/0.101.!`"+.`((`0$!`/L`0$!`.!/1(0`%/`0$0`3$!*`0$!
,#!/`.!`/$.! `+*`0$!`/+%(`*!03+.'/L`0$!`/*%,,!0/`+"`+1.`3!`,,(%0%+*`.!`!),05`/
3!((L`3$%$`""!0/`0$!%.`2%.(%05K
$FRPPRQFRGHEDVH
!` +`*+0`$2!`)*5`+,0%+*/`+*`0$!`(%!*0`/% !N`+1.`,,(%0%+*/`$2!`0+`!`3.%00!*`%*
2.%,0K`$!.!`.!`/+)!`(*#1#!/`0$0`*`!`+*2!.0! `%*0+` 2.%,0`0`1%( `0%)!L
10`0$!`+*!,0` +!/`*+0`$*#!K
$!`%(%05`0+`1/!`0$!`/)!`(*#1#!`+*`0$!`/!.2!.`.!,.!/!*0/``/%#*%"%*0`3%*`.!#. %*#
)%*0%*%(%05`* `'*+3(! #!`/$.%*#`.+//`0$!`+),*5K
!%*#`(!`0+`/$.!`0$!`(+#%`!03!!*`0$!`(%!*0`* `0$!`/!.2!.`)'!/`%0`!/5`0+`,,(5`*5
$*#!/`+*`+0$`/% !/`3%0$+10` +%*#`0$!`3+.'`03%!L`3$%$`)+/0`+"`0$!`0%)!`(! /`0+`"!3!.
!..+./`* `"!3!.`,.+(!)/K
S`8@8`T
!.2!._% !`!* !.%*#`"+.`1*`* `.+"%0 $,0!.`?
%HWWHUSHUIRUPDQFH
/0L`10`*+0`(!/0L`3!`((`(+2!`(%!*0_/% !`,,(%0%+*/L`!1/!`0$!5`.!`"/0`* `.!/,+*/%2!L
10`0$!.!`%/``,.+(!)—0$!`1* (!`$/`0+`!`(+ ! `* `.1*`!"+.!`1/!./`*`0'!`*5
0%+*`+*`0$!`,,(%0%+*K
$%/`,!.!%2! `,!."+.)*!`%/`/+)!0$%*#`3!`*`#.!0(5`%),.+2!`1/%*#`/!.2!._/% !
.!* !.%*#`!1/!`3!`*`+10,10`+1.`+),+*!*0/`+*`0$!`/!.2!.`* `.!01.*`/+)!
%*"+.)0%+*`0+`0$!`1/!./`/0.%#$0_35K
'RQ WXQGHUHVWLPDWHWKHFRPSOH[LW\
2!*`%"`!0`,.+2% !/`*`!/5` `0+`.!* !.`+),+*!*0/`+*`0$!`/!.2!.L`.!0%*#`
*%2!./(`,,(%0%+*`$/``+/0K`+L`3!`/$+1( `+*/% !.`.!"1((5`!"+.!`!*(%*#`%0`"+.`+*!
+"`0$!`,.!! %*#`.!/+*/`* `$!'`%"`+1.`0!)`%/`.! 5`0+`/1,,+.0`* `)%*0%*`
*%2!./(`,,(%0%+*K
/`3!`3%((`/!!`%*`0$!`+)%*#`/!0%+*/L`.!* !.%*#`+),+*!*0/`%0`%/`*+0`0$!`+*(5`0/'`0$0
*!! /`0+`!` +*!`0+`.!0!`/!.2!._/% !`.!* !.! `,,(%0%+*/K
S`8@9`T
!.2!._% !`!* !.%*#`"+.`1*`* `.+"%0 $,0!.`?
$EDVLFH[DPSOH
!`3%((`*+3`.!0!``2!.5`/%),(!`/!.2!._/% !`,,(%0%+*`0+`(++'`0`0$!`/0!,/`0$0`.!
*!! ! `0+`1%( ``/%`*%2!./(`/!01,K
0`%/`#+%*#`0+`!``)%*%)(`* `/%),(!`/!01,`+*`,1.,+/!`!1/!`0$!`#+(`$!.!`%/`0+`/$+3
$+3``3+.'/`.0$!.`0$*`,.+2% %*#``+),.!$!*/%2!`/+(10%+*`+.``+%(!.,(0!L`!2!*
0$+1#$`5+1`+1( `1/!`0$!`!4),(!`,,(%0%+*`/``/0.0%*#`,+%*0`"+.``.!(_3+.(
,,(%0%+*K
$!`,,(%0%+*`3%((`+*/%/0`+"`03+`,.0/M
S`8@:`T
!.2!._% !`!* !.%*#`"+.`1*`* `.+"%0 $,0!.`?
.!0L`%0`%/`*+3`0%)!`0+`.!0!`*`!*0.5`%*`0$!`*,)`scripts`/!0%+*`+"`package.json`/+
0$0`3!`*`!/%(5`.1*`0$!`1%( `+))* `".+)`0$!`0!.)%*(M
"VFULSWV": {
"EXLOG": "webpack"
}
!`*+3`$2!`0+`.!0!`0$!`+*"%#1.0%+*`"%(!L`((! `webpack.config.jsL`0+`0!((`3!,'
$+3`3!`3*0`+1.`"%(!/`0+`!`1* (! K
FRQVW rules = [
{
WHVW: /\.(js|jsx)$/,
H[FOXGH: /node_modules/,
XVH: {
ORDGHU: 'babel-loader',
RSWLRQV: {
S`8@;`T
!.2!._% !`!* !.%*#`"+.`1*`* `.+"%0 $,0!.`?
SUHVHWV: [
'@babel/preset-env',
'@babel/preset-react'
]
}
}
}
];
$!`(%!*0`+*"%#1.0%+*`/$+1( `!`2!.5`")%(%.M
FRQVW client = {
HQWU\: './src/client.js',
RXWSXW: {
SDWK: './dist/public',
ILOHQDPH: 'bundle.js'
},
PRGXOH: {
UXOHV
}
};
!`.!`0!((%*#`3!,'`0$0`0$!`/+1.!`+ !`+"`0$!`(%!*0`,,(%0%+*`%/`%*/% !
0$!`src`"+( !.L`* `3!`3*0`0$!`+10,10`1* (!`0+`!`#!*!.0! `%*`0$!`dist`"+( !.K
S`8@<`T
!.2!._% !`!* !.%*#`"+.`1*`* `.+"%0 $,0!.`?
WDUJHW: 'node',
H[WHUQDOV: [QRGH([WHUQDOV()]
};
$!`*!3`,.)!0!./`.!`0$!`0.#!0L`3$!.!`3!`/,!%"5`0$!`*+ !`0+`0!((`3!,'`0+`%#*+.!`((
0$!`1%(0_%*`/5/0!)`,'#!/`+"`+ !K&/L`/1$`/`fs`* `externalsL`3$!.!`3!`1/!`0$!
(%..5`3!`%),+.0! `!.(%!.`0+`0!((`3!,'`0+`%#*+.!`0$!` !,!* !*%!/K
/0L`10`*+0`(!/0L`3!`$2!`0+`!4,+.0`0$!`+*"%#1.0%+*/`/`*`..5M
PRGXOHH[SRUWV = [client, server];
$!`app.js`"%(!`/$+1( `$2!`0$!`"+((+3%*#`+*0!*0M
LPSRUW React IURP 'react';
H[SRUWGHIDXOW App;
+0$%*#`+),(!4`$!.!M`3!`%),+.0`!0L`3!`.!0!`*`App`+),+*!*0L`3$%$`.!* !./
0$!` !((+`!0`)!//#!L`* `3!`!4,+.0`%0K
!0W/`*+3`.!0!`client.jsL`3$%$`%/`.!/,+*/%(!`"+.`.!* !.%*#`0$!`App`+),+*!*0`%*/% !
0$!`M
LPSRUW React IURP 'react';
LPSRUW { render } IURP 'react-dom';
LPSRUW App IURP './app';
!0W/`*+3`)+2!`0+`0$!`/!.2!.K
S`8@=`T
!.2!._% !`!* !.%*#`"+.`1*`* `.+"%0 $,0!.`?
$!`"%./0`0$%*#`0+` +`%/`.!0!``template.js`"%(!L`3$%$`!4,+.0/``"1*0%+*`0$0`3!`3%((`1/!
0+`.!01.*`0$!`).'1,`+"`0$!`,#!`0$0`+1.`/!.2!.`3%((`#%2!`'`0+`0$!`.+3/!.M
H[SRUW GHIDXOW body => `
'2&7<3(KWPO!
KWPO!
KHDG!
PHWDFKDUVHW="UTF-8"!
KHDG!
ERG\!
GLYLG="app"!^body`GLY!
VFULSWVUF="/bundle.js"!VFULSW!
ERG\!
KWPO!`;
$!`"%./0`0$%*#`0$0`3!`%),+.0`%/`expressL`0$!`(%..5`0$0`((+3/`1/`0+`.!0!``3!`/!.2!.
3%0$`/+)!`.+10!/`!/%(5L`* `3$%$`%/`(/+`(!`0+`/!.2!`/00%`"%(!/K
+3`3!`.!0!`*`4,.!//`,,(%0%+*M
FRQVW app = H[SUHVV();
S`8@>`T
!.2!._% !`!* !.%*#`"+.`1*`* `.+"%0 $,0!.`?
!`0!((`0$!`,,(%0%+*`3$!.!`+1.`/00%`//!0/`.!`/0+.! M
app.XVH(express.VWDWLF(path.UHVROYH(BBGLUQDPH, './dist/public')));
$!*L`$!.!`+)!/`0$!`(+#%`+"``3%0$`!0M
app.JHW('/', (req, res) => {
FRQVW body = UHQGHU7R6WULQJ(<App />);
FRQVW html = WHPSODWH(body);
res.VHQG(html);
});
!`.!`0!((%*#`4,.!//`0$0`3!`3*0`0+`(%/0!*`0+`0$!`.+10!L`/L`* `3$!*`%0`#!0/`$%0`5``(%!*0L
3!`.!* !.`App`0+``/0.%*#`1/%*#`0$!`!0`(%..5K` !.!`+)!`0$!`)#%`* `0$!
/%),(%%05`+"`0$!`/!.2!._/% !`.!* !.%*#`+"`!0K
$0`renderToString` +!/`%/`%0`.!01.*/``/0.%*#`.!,.!/!*00%+*`+"`0$!``!(!)!*0/
#!*!.0! `5`+1.`App`+),+*!*0N`0$!`/)!`0.!!`0$0`%0`3+1( `.!* !.`%*`0$!``%"`3!
3!.!`1/%*#`0$!`!0`.!* !.`)!0$+ K
$!`2(1!`+"`0$!`+ 5`2.%(!`%/`/+)!0$%*#`(%'!`0$!`"+((+3%*#M
GLYGDWDUHDFWURRW="" GDWDUHDFWLG="1" GDWDUHDFW
FKHFNVXP="982061917"!Hello ReactGLY!
+3`0$0`3!`$2!`0$!``.!,.!/!*00%+*`+"`+1.`,,L`3!`*`1/!`0$!`template`"1*0%+*`0+
,,(5`%0`0+`0$!` `0!),(0!`* `/!* `%0`'`0+`0$!`.+3/!.`3%0$%*`0$!`4,.!//`.!/,+*/!K
/0L`10`*+0`(!/0L`3!`$2!`0+`/0.0`0$!`4,.!//`,,(%0%+*M
app.OLVWHQ(3000, () => {
console.ORJ('Listening on port 3000');
});
!`.!`*+3`.! 5`0+`#+N`0$!.!`.!`+*(5``"!3`+,!.0%+*/`(!"0K
S`8@?`T
!.2!._% !`!* !.%*#`"+.`1*`* `.+"%0 $,0!.`?
+%*0`0$!`.+3/!.`0+`http://localhost:3000`* `/!!`0$!`.!/1(0K
$!.!`.!`03+`%),+.0*0`0$%*#/`0+`*+0!`$!.!K`%./0L`3!`1/!`0$!`%!3`#!`+1.!`"!01.!`+"
0$!`.+3/!.L`3!`*`/!!`0$!`/+1.!`+ !`+"`0$!`,,(%0%+*`!%*#`.!* !.! `* `.!01.*!
".+)`0$!`/!.2!.L`3$%$`3!`3+1( `*+0`/!!`%"``3/`*+0`!*(! K
$!`"+((+3%*#`/.!!*/$+0`/$+3/`0$!`/+1.!`+"`0$!`,#!M
$GDWDIHWFKLQJH[DPSOH
$!`!4),(!`%*`0$!`,.!2%+1/`/!0%+*`/$+1( `!4,(%*`(!.(5`$+3`0+`/!0`1,``1*%2!./(
,,(%0%+*`%*`!0K
S`8@@`T
!.2!._% !`!* !.%*#`"+.`1*`* `.+"%0 $,0!.`?
/%*#`$++'/`0$0`.!`!4!10! `!.(%!.L`/1$`/`componentWillMountL`3%((`*+0`3+.'`!%0$!.L
!1/!`0$!` 0`"!0$%*#`+,!.0%+*`%/`async`3$%(!`renderToString`%/`*+0K`+.`0$0
.!/+*L`3!`$2!`0+`"%* ``35`0+`(+ `0$!` 0`!"+.!$* `* `,//`%0`0+`0$!`+),+*!*0`/
,.+,/K
!0W/`(++'`0`$+3`3!`*`0'!`0$!`,,(%0%+*`".+)`0$!`,.!2%+1/`/!0%+*`* `$*#!`%0``%0
0+`)'!`%0`(+ `0$!`#%/0/` 1.%*#`0$!`/!.2!._/% !`.!* !.%*#`,$/!K
H[SRUWGHIDXOW App;
+3L`3!`$2!`0+`$*#!`0$!`/!.2!.`0+`.!0.%!2!`gists`* `,//`0$!)`0+`0$!`+),+*!*0K
S`977`T
!.2!._% !`!* !.%*#`"+.`1*`* `.+"%0 $,0!.`?
QSPLQVWDOOLVRPRUSKLFIHWFK
!`"%./0`%),+.0`0$!`(%..5`%*`server.jsM
LPSRUW fetch IURP 'isomorphic-fetch';
$!` `((`3!`3*0`0+`)'!`(++'/`/`"+((+3/M
IHWFK('https://api.github.com/users/gaearon/gists')
.WKHQ(response => response.MVRQ())
.WKHQ(gists => {
});
+L`3!`*`$*#!`0$!`/`.+10!`/`"+((+3/M
app.JHW('/', (req, res) => {
IHWFK('https://api.github.com/users/gaearon/gists')
.WKHQ(response => response.MVRQ())
.WKHQ(gists => {
FRQVW body = UHQGHU7R6WULQJ($SS JLVWV={gists} !);
FRQVW html = WHPSODWH(body);
res.VHQG(html);
});
});
S`978`T
!.2!._% !`!* !.%*#`"+.`1*`* `.+"%0 $,0!.`?
$0`%/`#.!0L`* `%0`(++'/`!/5L`10`%"`3!`$!'`0$!`!2++(/`+*/+(!L`3!`*`/!!`0$!
"+((+3%*#`!..+.M
$!`.!/+*`3!`/!!`0$!`!..+.`%/`0$0L`+*`0$!`(%!*0L`3!`.!`.!* !.%*#`App`#%*`10`3%0$+10
,//%*#`*5`gists`0+`%0K
$%/`/!!)/`(%'!``+),(!4`+*!,0L`10`%0`%/`*+0K`!`3%((`(++'`0`$+3`!/5`%0`%/`0+`%),(!)!*0
*+3K
$!`template`"1*0%+*`*+3`!,0/`03+`,.)!0!./—0$!`body`+"`0$!`,,`* `0$!
+((!0%+*`+"`gistsK
S`979`T
!.2!._% !`!* !.%*#`"+.`1*`* `.+"%0 $,0!.`?
*/% !`0$!`Express`.+10!`Qserver.jsRL`3!`&1/0`$2!`0+`$*#!`0$!`(%*!`3$!.!`3!`#!*!.0!
0$!`0!),(0!`,//%*#`0$!`+ 5L`/`"+((+3/M
FRQVW html = WHPSODWH(body, gists);
+3L`.1*`0$!`"+((+3%*#`+))* `#%*M
QSPUXQEXLOG QSPVWDUW
1H[WMV
+1`$2!`(++'! `0`0$!`/%/`+"`/!.2!._/% !`.!* !.%*#`3%0$`!0L`* `5+1`*`1/!`0$!
,.+&!0`3!`.!0! `/``/0.0%*#`,+%*0`"+.``.!(`,,K
S`97:`T
!.2!._% !`!* !.%*#`"+.`1*`* `.+"%0 $,0!.`?
!."!0L`%0`%/`*+3`0%)!`0+`#!*!.0!`+1.`App`+),+*!*0K
!40K&/`%/`/! `+*`+*2!*0%+*/L`3%0$`0$!`)+/0`%),+.0*0`+*!`!%*#`0$0`5+1`*`.!0!
,#!/`0+`)0$`0$!`.+3/!.`/K`$!` !"1(0`,#!`%/`indexL`/+`3!`*`.!0!``"+( !.
((! `pages`* `,10`*`index.js`"%(!`%*/% !`%0K
S`97;`T
!.2!._% !`!* !.%*#`"+.`1*`* `.+"%0 $,0!.`?
#%*L`3!`%),+.0`isomorphic-fetch`!1/!`3!`3*0`0+`!`(!`0+`1/!`0$!`fetch
"1*0%+*`+*`0$!`/!.2!.`/% !K
!`.!`0!((%*#`0$!`"1*0%+*`0+`"%.!`0$!`"!0$`* `3%0`"+.`0$!`.!/,+*/!N`0$!*`3!`.!
0.*/"+.)%*#`0$!`.!/,+*/!`%*0+` L`3$%$`.!01.*/``,.+)%/!K`$!*`0$!`,.+)%/!`%/
.!/+(2! L`3!`*`.!01.*`0$!`props`+&!0`3%0$`0$!`gistsK
S`97<`T
!.2!._% !`!* !.%*#`"+.`1*`* `.+"%0 $,0!.`?
OLNH\={gist.id}!{gist.GHVFULSWLRQ}OL!
))}
XO!
);
}
+3!2!.L`%0`1/!/`this.props.gists`!1/!`3!`.!`%*/% !``(//`%*/0*!K
$!*`3!`!4,+.0`0$!`+),+*!*0M
H[SRUWGHIDXOW App;
+3L`+,!*`0$!`+*/+(!`* `.1*`0$!`"+((+3%*#M
QSPUXQGHY
!`3%((`/!!`0$!`"+((+3%*#`+10,10M
!5HDG\RQKWWSORFDOKRVW
"`3!`,+%*0`0$!`.+3/!.`0+`0$0`L`3!`*`/!!`0$!`*%2!./(`,,(%0%+*`%*`0%+*K
0`%/`.!((5`%),.!//%2!`$+3`!/5`%0`%/`0+`/!0`1,``*%2!./(`,,(%0%+*`3%0$``"!3`(%*!/`+"
+ !`* `6!.+`+*"%#1.0%+*L`0$*'/`0+`!40K&/K
S`97=`T
!.2!._% !`!* !.%*#`"+.`1*`* `.+"%0 $,0!.`?
6XPPDU\
$!`&+1.*!5`0$.+1#$`/!.2!._/% !`.!* !.%*#`$/`+)!`0+`*`!* K`+1`.!`*+3`(!`0+`.!0!`
/!.2!._/% !`.!* !.! `,,(%0%+*`3%0$`!0L`* `%0`/$+1( `!`(!.`3$5`%0`*`!`1/!"1(`"+.
5+1K``%/`!.0%*(5`+*!`+"`0$!`)%*`.!/+*/L`10`/+%(`/$.%*#`* `,!."+.)*!`.!
%),+.0*0`"0+./`/`3!((K
*`0$!`*!40`$,0!.L`3!`3%((`0('`+10`$+3`0+`%),.+2!`0$!`,!."+.)*!`%*`+1.`!0
,,(%0%+*/K
S`97>`T
,PSURYHWKH3HUIRUPDQFHRI
<RXU$SSOLFDWLRQV
$!`!""!0%2!`,!."+.)*!`+"``3!`,,(%0%+*`%/`.%0%(`0+`,.+2% %*#``#++ `1/!.
!4,!.%!*!`* `%),.+2%*#`+*2!./%+*/K`$!`!0`(%..5`%),(!)!*0/` %""!.!*0`0!$*%-1!/
0+`.!* !.`+1.`+),+*!*0/`"/0`* `0+`0+1$`0$!`+1)!*0`&!0`+ !(`QR`/`(%00(!`/
,+//%(!K`,,(5%*#`$*#!/`0+`0$!``%/`1/1((5`!4,!*/%2!`* `/+`)%*%)%6%*#`0$!
*1)!.`+"`+,!.0%+*/`%/`.1%(K
+3!2!.L`0$!.!`.!`/+)!`,.0%1(.`/!*.%+/`3$!.!`!0`**+0`+,0%)%6!`0$!`,.+!//L`*
%0W/`1,`0+`0$!` !2!(+,!.`0+`%),(!)!*0`/,!%"%`/+(10%+*/`0+`)'!`0$!`,,(%0%+*`.1*
/)++0$(5K
*`0$%/`$,0!.L`3!`3%((`#+`0$.+1#$`0$!`/%`+*!,0/`+"`!0`* `3!`3%((`(!.*`$+3`0+`1/!
/+)!` /`0+`$!(,`0$!`(%..5`"%* `0$!`+,0%)(`,0$`0+`1, 0!`0$!``3%0$+10
!#. %*#`0$!`1/!.`!4,!.%!*!K`!`3%((`(/+`/!!`/+)!`+))+*`)%/0'!/`0$0`*`$.)`+1.
,,(%0%+*/`* `)'!`0$!)`/(+3!.K
$.+1#$`0$!`/%),(!`!4),(!/`%*`0$%/`$,0!.L`5+1`3%((`(!.*`+10`0$!`0++(/`0$0`3!`*
%),+.0`%*0+`+1.`+ !`/!`0+`)+*%0+.`,!."+.)*!`* `"%* `+00(!*!'/K`!`3%((`(/+`/!!
$+3`%))10%(%05`* `PureComponent`.!`0$!`,!."!0`0++(/`0+`1%( `"/0`!0
,,(%0%+*/K
*`0$%/`$,0!.L`3!`3%((`+2!.`0$!`"+((+3%*#`0+,%/M
5HFRQFLOLDWLRQ
+/0`+"`0$!`0%)!L`!0`%/`"/0`!*+1#$`5` !"1(0`* `5+1` +`*+0`*!! `0+` +`*50$%*#`)+.!
0+`%),.+2!`0$!`,!."+.)*!`+"`5+1.`,,(%0%+*K`!0`10%(%6!/` %""!.!*0`0!$*%-1!/`0+
+,0%)%6!`0$!`.!* !.%*#`+"`0$!`+),+*!*0/`+*`0$!`/.!!*K
!0`0.%!/`0+`,,(5`0$!`/)((!/0`,+//%(!`*1)!.`+"`+,!.0%+*/`+*`0$!``!1/!
0+1$%*#`0$!``%/`*`!4,!*/%2!`+,!.0%+*K
+3!2!.L`+),.%*#`03+`0.!!/`+"`!(!)!*0/`%/`*+0`".!!`!%0$!.L`* `!0`)'!/`03+
//1),0%+*/`0+`.! 1!`%0/`+),(!4%05M
S`97@`T
),.+2!`0$!`!."+.)*!`+"`+1.`,,(%0%+*/ $,0!.`@
!0W/`/!!`/+)!`!4),(!/K`+*2!.0%*#`!03!!*`0$!`"+((+3%*#`03+`0.!!/`3%((`3+.'`3!((L`3$!*
%*#`*`!(!)!*0`0`0$!`!* `+"`0$!`$%( .!*K
XO!
OL!CarlosOL!
OL!JavierOL!
XO!
XO!
OL!CarlosOL!
OL!JavierOL!
OL!JonaOL!
XO!
$!`03+`<li>Carlos</li>`0.!!/L`)0$`0$!`03+`<li>Javier</li>`0.!!/L`5`!0`*
0$!*`%0`3%((`%*/!.0`0$!`<li>Jona</li>`0.!!K
XO!
OL!JonaOL!
OL!CarlosOL!
OL!JavierOL!
XO!
.H\V
$%/`,.+(!)`*`+"`+1./!`!`/+(2! `* `0$!`35`"+.`0$%/`%/`0$!`key`00.%10!`3$%$`%/
/1,,+.0! `5`!0K`$%( .!*`,+//!/`'!5/`* `0$!/!`'!5/`.!`1/! `5`!0`0+`)0$
$%( .!*`!03!!*`0$!`/1/!-1!*0`0.!!`* `0$!`+.%#%*(`0.!!K`$!`0.!!`+*2!./%+*`*`!
) !`!""%%!*0`5` %*#``'!5`0+`+1.`,.!2%+1/`!4),(!M
XO!
OLNH\ !CarlosOL!
OLNH\ !JavierOL!
XO!
S`987`T
),.+2!`0$!`!."+.)*!`+"`+1.`,,(%0%+*/ $,0!.`@
XO!
OLNH\ !JonaOL!
OLNH\ !CarlosOL!
OLNH\ !JavierOL!
XO!
2SWLPL]DWLRQWHFKQLTXHV
0`%/`%),+.0*0`0+`*+0%!`0$0L`%*`((`0$!`!4),(!/`%*`0$%/`++'L`3!`.!`1/%*#`,,/`0$0`$2!
!%0$!.`!!*`.!0! `3%0$`create-react-app`+.`$2!`!!*`.!0! `".+)`/.0$L`10`(35/
3%0$`0$!` !2!(+,)!*0`2!./%+*`+"`!0K
S`988`T
),.+2!`0$!`!."+.)*!`+"`+1.`,,(%0%+*/ $,0!.`@
}
})
+`$%!2!`0$!`!/0`,!."+.)*!L`3!`*+0`+*(5`3*0`0+`.!0!`0$!`1* (!`3%0$`0$!
,.+ 10%+*`"(#`0%20! L`10`3!`(/+`3*0`0+`/,(%0`+1.`1* (!/M`+*!`"+.`+1.`,,(%0%+*
* `+*!`"+.`+1.`node_modulesK`+` +`/+L`5+1`*!! `0+`1/!`0$!`*!3`+,0%)%60%+*`*+ !`%*
3!,'`;M
RSWLPL]DWLRQ: {
VSOLW&KXQNV: {
FDFKH*URXSV: {
GHIDXOW: false,
FRPPRQV: {
WHVW: /node_modules/,
QDPH: 'vendor',
FKXQNV: 'all'
}
}
}
}
+1.`webpack.config.js`"%(!`/$+1( `(++'`(%'!`0$%/M
PRGXOH.exports = {
HQWU\: './index.js',
RSWLPL]DWLRQ: {
VSOLW&KXQNV: {
FDFKH*URXSV: {
GHIDXOW: false,
FRPPRQV: {
WHVW: /node_modules/,
QDPH: 'vendor',
FKXQNV: 'all'
}
}
}
},
SOXJLQV: [
QHZ webpack.'HILQH3OXJLQ({
S`989`T
),.+2!`0$!`!."+.)*!`+"`+1.`,,(%0%+*/ $,0!.`@
SURFHVVHQY : {
12'(B(19: JSON.VWULQJLI\('production')
}
})
],
PRGH: process.env.12'(B(19 === 'production' 'production' :
'development'
}
VKRXOG&RPSRQHQW8SGDWH
+.`)*5` !2!(+,!./L`0$!`35`0$!`.!+*%(!.`(#+.%0$)`3+.'/`%/`+*"1/%*#K`$!5`+"0!*
0$%*'`0$0`/%*!`!0`%/`/).0`!*+1#$`0+`"%* `+10`0$!`/$+.0!/0`,0$`0+`,,(5`0$!`$*#!/`0+
0$!`L`0$!`render`)!0$+ /`+"`0$!`+),+*!*0/`0$0`.!`*+0`$*#! ` +`*+0`!2!.`#!0
((! K`$0W/`1*"+.01*0!(5`".`".+)`!%*#`0.1!K
"`*+0$%*#`$*#!/L`*+`$*#!/`3%((`!`) !`%*`0$!`L`3$%$`%/`#.!0K`10`%"`+1.`render
)!0$+ /` +`+),(!4`+,!.0%+*/L`!0`3%((`0'!`/+)!`0%)!`0+`"%#1.!`+10`0$0`*+`+,!.0%+*/
$2!`0+`!` +*!L`3$%$`%/`*+0`+,0%)(K
S`98:`T
),.+2!`0$!`!."+.)*!`+"`+1.`,,(%0%+*/ $,0!.`@
};
this.KDQGOH&OLFN = this.handleClick.ELQG(this);
}
EXWWRQRQ&OLFN={this.handleClick}!+EXWWRQ!
GLY!
);
}
+1`*`/!!`0$0`(%'%*#`+*`0$!`B`100+*`$/`*+`!""!0`3$0/+!2!.`+*`0$!`,,(%0%+*`%*/% !
0$!`.+3/!.L`!2!*`0$+1#$`0$!`/00!`$*#!/K`$0`%/`!1/!`3!`.!`0!((%*#`!0`0$0`0$!
+),+*!*0` +!/`*+0`*!! `0+`!`1, 0! K
S`98;`T
),.+2!`0$!`!."+.)*!`+"`+1.`,,(%0%+*/ $,0!.`@
$!`shouldComponentUpdate`)!0$+ `,//!/`03+`,.)!0!./`0$0`3!`*`1/!`0+
%),(!)!*0`0$+/!`$!'/L`0$!`"%./0`,.)!0!.`.!,.!/!*0/`nextProps`3$%(!`0$!`/!+*
,.)!0!.`.!,.!/!*0/``nextStateK
*`+1.`/!L`3!`+1( ` +`/+)!0$%*#`(%'!`0$%/M
VKRXOG&RPSRQHQW8SGDWH(nextProps, nextState) {
UHWXUQ this.state.LWHPV !== nextState.LWHPV;
}
+.`0$0`.!/+*L`!0`#%2!/`1/``/,!%(`+),+*!*0`".+)`3$%$`3!`*`%*$!.%0`* `3$%$
%),(!)!*0/``/$((+3`+),.%/+*`+"`((`0$!`,.+,/`* `0$!`/00!`00.%10!/`"+.`1/K
0`%/`%),+.0*0`0+`*+0%!`0$0`0$!`/$((+3`+),.%/+*L`/`0$!`*)!`/1##!/0/L` +!/`*+0`$!'
"+.` !!,`* `*!/0! `,.+,!.0%!/`%*`+&!0/L`* `%0`*`/+)!0%)!/`#%2!`1*!4,!0! `.!/1(0/K
S`98<`T
),.+2!`0$!`!."+.)*!`+"`+1.`,,(%0%+*/ $,0!.`@
6WDWHOHVVIXQFWLRQDOFRPSRQHQWV
*+0$!.`+*!,0`0$0`%/`/+)!0%)!/`+1*0!.%*01%0%2!`"+.`!#%**!./`%/`0$!`"0`0$0`/00!(!//
+),+*!*0/` +`*+0`#%2!`1/`*5`!*!"%0/`.!#. %*#`,!."+.)*!K
$!5`.!`#.!0`"+.`0$!`)*5`.!/+*/`0$0`3!`/3`%*`Chapter 3L`.!0!`.1(5`!1/(!
+),+*!*0/L`* `"+.`0$!`35`0$!5`)'!`+1.`,,(%0%+*/`/%),(!.`* `!/%!.`0+`.!/+*`+10L
10`0$!5` +`*+0`$2!`Q/`5!0R`*5`%*0!.*(`%),(!)!*00%+*`0$0`)'!/`0$!)`"/0!.K
&RPPRQVROXWLRQV
!`$2!`/!!*`$+3`1/%*#`PureComponent`*`$!(,`1/`0+`0!((`!0`3$!0$!.``/10.!!`$/`0+
!`.!* !.! `+.`*+0K` "`10%(%6! `%*`0$!`.%#$0`35L`%0`+1( `%),.+2!`0$!`,!."+.)*!`+"`+1.
,,(%0%+*/``(+0K` 0`%/`(/+`%),+.0*0`0+`/0.!//`0$0`%0`/$+1( `!`1/! `+*(5`"0!.`0$!
,,(%0%+*`$/`!!*`)+*%0+.! `* `0$!`+00(!*!'`$/`!!*`"+1* K
+/0`+"`0$!`0%)!L`.!"0+.%*#`0$!`+),+*!*0/`* `,100%*#`0$!`/00!`%*`0$!`.%#$0`,(!`*
#.!0(5`//%/0`0$!`+,0%)%60%+*`+"`0$!`,,(%0%+*K
S`98=`T
),.+2!`0$!`!."+.)*!`+"`+1.`,,(%0%+*/ $,0!.`@
:K\GLG\RXXSGDWH"
$!.!`.!` %""!.!*0`0$%*#/`3!`*` +`0+`"%* `+10`3$%$`+),+*!*0/` +`*+0`*!! `0+`!
1, 0! K`*!`+"`0$!`!/%!/0`%/`0+`%*/0((``0$%. _,.05`(%..5`0$0`*`,.+2% !`0$!
%*"+.)0%+*`10+)0%((5K
%./0`+"`((L`3!`$2!`0+`05,!`0$!`"+((+3%*#`+))* `%*`0$!`0!.)%*(M
QSPLQVWDOOVDYHGHYZK\GLG\RXXSGDWH
* ` `0$!`"+((+3%*#`/*%,,!0`"0!.`0$!`import`/00!)!*0`+"`!0`%*`5+1.`,,K&/M
LPSRUW React IURP 'react';
LI (process.env.12'(B(19 !== 'production') {
FRQVW { whyDidYouUpdate } = UHTXLUH('why-did-you-update');
ZK\'LG<RX8SGDWH(React);
}
"`3!`*+3`#+`'`0+`0$!`List`!4),(!`+"`0$!`,.!2%+1/`/!0%+*`* `3!`$*#!`%0``(%00(!`%0L
3!`*`/!!`0$!`(%..5`%*`0%+*K
S`98>`T
),.+2!`0$!`!."+.)*!`+"`+1.`,,(%0%+*/ $,0!.`@
!`*`*+3`%),(!)!*0`0$!`%0!)`+),+*!*0L`!40!* %*#`React.ComponentM
FODVV Item H[WHQGV Component
*`0$!`.+3/!.`+*/+(!L`5+1`*`/!!`0$!`+10,10`".+)`0$!`whyDidYouUpdate`"1*0%+*L`3$%$
0!((/`1/`0$0`3!`*`2+% `.!_.!* !.%*#`/+)!`+),+*!*0/M
,WHPSURSV
Value did not change. Avoidable re-render!
before Object {item: "foo"}
after Object {item: "foo"}
,WHPSURSV
Value did not change. Avoidable re-render!
before Object {item: "bar"}
after Object {item: "bar"}
+3L`3!`*`!/%(5`"%4`0$!`%//1!`5`)+ %"5%*#`0$!`extends`/00!)!*0`+"`0$!`Item
+),+*!*0`".+)`extends`* `React.Component`0+M
FODVV Item H[WHQGV PureComponent
"`3!`*+3`+,!*`0$!`.+3/!.`* `.1*`0$!`,,(%0%+*`#%*L`(%'%*#`0$!`B`100+*L`3!`/!!
0$0`*+0$%*#`%/`(+##! `%*0+`0$!`+*/+(!L`3$%$`)!*/`0$0`3!`.!`*+0`.!* !.%*#
*5`Item`"+.`3$%$`0$!`,.+,/`.!`*+0`$*#! K
S`98?`T
),.+2!`0$!`!."+.)*!`+"`+1.`,,(%0%+*/ $,0!.`@
&UHDWLQJIXQFWLRQVLQVLGHWKHUHQGHUPHWKRG
+3L`(!0W/`'!!,`+*` %*#`"!01.!/`0+`List`/`3!`3+1( ` +`%*``.!(_3+.( `,,(%0%+*`*
/!!`3$!0$!.L`0`/+)!`,+%*0L`3!`)*#!`0+`.!'`0$!`!*!"%0/`#%2!*`5`PureComponentK
$%/`%/`".`".+)`!%*#``1/!"1(`"!01.!`%*``.!(`,,(%0%+*L`10`5+1`*`!/%(5
"%#1.!`+10`$+3L`3%0$``/)((`)+1*0`+"`!""+.0L`5+1`*`.!0!``)+.!`+),(!4`+,!.0%+*`Q"+.
!4),(!L`/$+3%*#``*!3`3%* +3`3%0$`0$!`%0!)W/` 0RK
!0W/`/0.0`3%0$`0$!`"%./0`+*!M
UHQGHU() {
UHWXUQ (
GLY!
XO!
{this.state.items.PDS(item => (
,WHP
NH\={item}
LWHP={item}
RQ&OLFN={() => console.ORJ(item)}
!
))}
XO!
EXWWRQRQ&OLFN={this.KDQGOH&OLFN}!+EXWWRQ!
GLY!
);
}
S`98@`T
),.+2!`0$!`!."+.)*!`+"`+1.`,,(%0%+*/ $,0!.`@
OL!
);
}
*"+.01*0!(5L`%"`3!`.1*`0$!`+),+*!*0`%*`0$!`.+3/!.L`3!`*+0%!`/+)!`*!3`(+#/`%*
!2++(/K`%./0`+"`((L`0$!`whyDidYouUpdate`(%..5`%/`0!((%*#`1/`0$0`0$!.!`%/``,+//%(5
2+% (!`.!_.!* !.`!1/!`0$!`onClick`"1*0%+*`%/`(35/`0$!`/)!M
,WHPSURSVRQ&OLFN
Value is a function. Possibly avoidable re-render
before onClick() {
return console.log(item);
}
after onClick() {
return console.log(item);
}
,WHPSURSVRQ&OLFN
Value is a function. Possibly avoidable re-render
before onClick() {
return console.log(item);
}
after onClick() {
return console.log(item);
}
$!`.!/+*`!0`0$%*'/`0$0`3!`.!`,//%*#``*!3`"1*0%+*`+*`!2!.5`.!* !.`%/`!1/!`0$!
..+3`"1*0%+*`.!01.*/``*!3(5`.!0! `"1*0%+*`!2!.5`0%)!`%0`%/`%*2+'! L`!2!*`%"`0$!
%),(!)!*00%+*`.!)%*/`0$!`/)!K`$%/`%/``,.!005`+))+*`)%/0'!`3$!*`1/%*#`!0L`*
%0`*`!`!/%(5`"%4! `5`.!"0+.%*#`0$!`+),+*!*0/``%0K
!0W/`/!!`0$!`"1((`%),(!)!*00%+*`+"`ItemL`3$%$`!40!* /`PureComponentM
FODVV Item H[WHQGV PureComponent
S`997`T
),.+2!`0$!`!."+.)*!`+"`+1.`,,(%0%+*/ $,0!.`@
/`5+1`*`/!!L`3!`.!`,//%*#`0$!`"1*0%+*`3!`3*0! `0+`1/!L`%*`0$%/`/!`console.logL
3$%$`3%((`!`((! `%*/% !`0$!`$%( .!*`3%0$`0$!`.%#$0`,.)!0!.K`+%*#`/+L`0$!`%*/0*!`+"
0$!`"1*0%+*`%*`List`%/`(35/`0$!`/)!`* `%0` +!/`*+0`"%.!`*5`.!_.!* !.%*#K
S`998`T
),.+2!`0$!`!."+.)*!`+"`+1.`,,(%0%+*/ $,0!.`@
(/+L`%"`3!`(%'`+*`*5`%0!)`%*`0$!`(%/0L`3!`3%((`/!!`%0/`2(1!`%*`0$!`+*/+(!`/`3!((K
/`*`.)+2`/5/L`%0`%/`*+0``,.+(!)`5`%0/!("`0+`1/!`..+3`"1*0%+*/`%*/% !`0$!
render`)!0$+ `Q+.`!2!*`0+`1/!`bind`0+`2+% `%* %*#`%*`0$!`+*/0.10+.RN`3!`&1/0`$2!`0+
!`.!"1(`* `)'!`/1.!`0$0`%0` +!/`*+0`"+.!`*5`1**!!//.5`.!_.!* !.%*#
3$!*`PureComponent`%/`%*`0%+*K
&RQVWDQWVSURSV
!0W/`'!!,`+*`%),.+2%*#`+1.`(%/0`!4),(!L`* `/!!`3$0`$,,!*/`3$!*`3!` `*!3
"!01.!/K
*`0$%/`/!L`3!`3%((`(!.*`$+3`0+`2+% ``+))+*`!..+.`3$!*`1/%*#`PureComponentL
3$%$`)'!/`%0`(!//`!""!0%2!K
1,,+/!`3!`3*0`0+` ``,.+,`0+`+1.`Item`+),+*!*0L`3$%$`.!,.!/!*0/``(%/0`+"`/001/!/
0$0`0$!`%0!)`*`$2!K`$!.!`.!`)*5`35/`+"`%),(!)!*0%*#`%0L`10`+1.`"+1/`%/`)+.!`+*
0$!`35`3!`,//` +3*`0$!` !"1(0`2(1!/K
$*#!`0$!`render`)!0$+ `+"`0$!`List`+),+*!*0`/`"+((+3/M
UHQGHU() {
UHWXUQ (
GLY!
XO!
{this.state.items.PDS(item => (
,WHP
NH\={item}
LWHP={item}
RQ&OLFN={console.ORJ}
VWDWXVHV={['open', 'close']}
/>
))}
XO!
EXWWRQRQ&OLFN={this.handleClick}!+EXWWRQ!
GLY!
);
}
S`999`T
),.+2!`0$!`!."+.)*!`+"`+1.`,,(%0%+*/ $,0!.`@
$!`)!//#!`%/`0!((%*#`1/`0$0`!2!*`%"`0$!`2(1!/`%*/% !`0$!`..5`/05`0$!`/)!L`+*`!2!.5
.!* !.`3!`.!`,//%*#``*!3`%*/0*!`+"`0$!`..5`0+`ItemK
$!`.!/+*`!$%* `0$%/`!$2%+.`%/`0$0`((`0$!`+&!0/`.!01.*``*!3`%*/0*!`3$!*`.!0!
* ``*!3`..5`%/`*!2!.`!-1(`0+`*+0$!.L`!2!*`%"`0$!5`+*0%*`0$!`/)!`2(1!/M
[] === []
false
$!.!`%/`(/+``0(!`,.%*0! `+*`0$!`+*/+(!L`3$%$`/$+3/`0$!`0%)!`0$0`!0`%/`3/0%*#
.!* !.%*#`0$!`%0!)/`3%0$`1*$*#! `,.+,/`3$!*`0$!.!`%/`*+`*!! `0+`0+1$`0$!`K
this.VWDWH = {
LWHPV: ['foo', 'bar']
};
this.KDQGOH&OLFN = this.handleClick.ELQG(this);
}
S`99:`T
),.+2!`0$!`!."+.)*!`+"`+1.`,,(%0%+*/ $,0!.`@
KDQGOH&OLFN() {
FRQVW items = this.state.items.VOLFH();
items.XQVKLIW('baz');
this.VHW6WDWH({
items
});
}
UHQGHU() {
UHWXUQ (
GLY!
XO!
{this.state.items.PDS(item => (
,WHP
NH\={item}
LWHP={item}
RQ&OLFN={console.ORJ}
VWDWXVHV={statuses}
/>
))}
XO!
EXWWRQRQ&OLFN={this.KDQGOH&OLFN}!+EXWWRQ!
GLY!
);
}
}
H[SRUWGHIDXOW List;
"`3!`0.5`0$!`+),+*!*0`#%*`%*`0$!`.+3/!.L`3!`/!!`0$0`0$!`+*/+(!`*+3`+*0%*/`*+
)!//#!L`3$%$`)!*/`0$0`0$!`%0!)/` +`*+0`.!_.!* !.`0$!)/!(2!/`1**!!//.%(5`3$!*`0$!
*!3`!(!)!*0`%/` ! K
5HIDFWRULQJDQGJRRGGHVLJQ
*`0$!`(/0`,.0`+"`0$%/`/!0%+*L`3!`3%((`/!!`$+3`3!`*`.!"0+.`*`!4%/0%*#`+),+*!*0`Q+.
!/%#*``*!3`+*!`%*``!00!.`35R`0+`%),.+2!`0$!`,!."+.)*!`+"`+1.`,,(%0%+*K
S`99;`T
),.+2!`0$!`!."+.)*!`+"`+1.`,,(%0%+*/ $,0!.`@
$!`+),+*!*0`0$0`3!`.!`#+%*#`0+`.!0!`%/`/%)%(.`0+`0$!`,.!2%+1/`+*!L``0+_ +`(%/0_(%'!
+),+*!*0`3%0$``"+.)`0+`(!0`0$!`1/!./`!*0!.``*!3`%0!)K
/`1/1(L`3!`3%((`/0.0`3%0$``/%`2!./%+*L`* `3!`3%((`+,0%)%6!`%0`/0!,`5`/0!,K
$!`state`$/`03+`00.%10!/M
S`99<`T
),.+2!`0$!`!."+.)*!`+"`+1.`,,(%0%+*/ $,0!.`@
items
});
}
$!`(%'`$* (!.`%/`,.!005`/%)%(.`0+`0$!`,.!2%+1/`+*!`!4!,0`0$0`%0`1/!/`0$!`2(1!`".+)`0$!
/00!`%*/0! `+"``+*/0*0`/0.%*#L`* `%0` /`%0`/`0$!`"%./0`!(!)!*0`+*``+,5`+"`0$!`1..!*0
..5K
%*((5L`3!` !/.%!`+1.`2%!3`%*`0$!`render`)!0$+ M
UHQGHU() {
UHWXUQ (
GLY!
XO!
{this.state.items.PDS(item => OLNH\={item}!{item}OL!)}
XO!
GLY!
LQSXW
W\SH="text"
YDOXH={this.state.value}
RQ&KDQJH={this.handleChange}
!
EXWWRQRQ&OLFN={this.handleClick}!+EXWWRQ!
GLY!
GLY!
);
}
S`99=`T
),.+2!`0$!`!."+.)*!`+"`+1.`,,(%0%+*/ $,0!.`@
$!`+*(5`$*#!`%/`0$!`2(1!`+"`0$!`input`!(!)!*0L`* `0$0`%/`#+%*#`0+`!`0$!`+*(5
)100%+*`,,(%! `0+`0$!`N`10L`0+`"%#1.!`+10`3$%$`+,!.0%+*/`.!`*!! ! L`!0`$/`0+
.!* !.`0$!`!*0%.!`+),+*!*0`* `((`%0/`$%( .!*L`* `.!* !.%*#``%#`(%/0`+"`%0!)/`)*5
0%)!/`+2!.`%/`!4,!*/%2!K
+3L`%"`3!`(++'`0`0$!`/00!`+&!0`+"`0$!`+),+*!*0L`%0W/`,.!005`(!.`0$0`%0`%/`*+0`3!((
/0.101.! K` *`"0L`3!`.!`/0+.%*#`0$!`%0!)/`/`3!((`/`0$!`2(1!`+"`0$!`"+.)`"%!( L`3$%$`.!
03+`!*0%.!(5` %""!.!*0`0$%*#/K
1.`#+(`%/`(35/`0+`$2!`+),+*!*0/`0$0` +`+*!`0$%*#`2!.5`3!((L`.0$!.`0$*
+),+*!*0/`3%0$`)1(0%,(!`,1.,+/!/K
$!`/+(10%+*`$!.!`%/`0+`/,(%0`0$!`+),+*!*0`%*0+`/)((!.`+*!/L`!$`+*!`3%0$``(!.
.!/,+*/%%(%05`* `/00!K
+` +`/+L`3!`$*#!`0$!`Todos`+),+*!*0`0+`/0+.!`+*(5`0$!`(%/0`+"`%0!)/L`3$%$`%/`0$!`,.0
+"`0$!`/0+.!`0$0`%/`/$.! `!03!!*`0$!`(%/0`* `0$!`"+.)K
$!*`3!`.!0!``/!,.0!`(%/0`0$0`+*(5`.!!%2!/`0$!`%0!)/`* ``"+.)`0$0`$/`%0/`/00!`"+.
+*0.+((%*#`0$!`%*,10`"%!( K`$!`"%!( `"%.!/``(('`+*`0$!`+))+*`,.!*0`0+`1, 0!`0$!`(%/0
3$!*`0$!`"+.)`%/`/1)%00! K
!0W/`/0.0`$*#%*#`0$!`Todos`+),+*!*0M
FODVV Todos H[WHQGV Component
$!`%),(!)!*00%+*`+"`0$!`/1)%0`$* (!.`%/`0$!`/)!`/`3!W2!`/!!*`!"+.!`+*`0$!`(%'
$* (!.M
KDQGOH6XEPLW(value) {
FRQVW items = this.state.items.VOLFH();
S`99>`T
),.+2!`0$!`!."+.)*!`+"`+1.`,,(%0%+*/ $,0!.`@
items.XQVKLIW(value);
this.VHW6WDWH({
items
});
}
$!`!4!,0%+*`%/`0$0`%0`.!!%2!/`0$!`2(1!`+"`0$!`*!3`%0!)`/``,.)!0!.`+"`0$!`(('K` 0
0$!*`(+*!/`0$!`..5`* ` /`0$!`2(1!`/`%0/`"%./0`!(!)!*0K`$!*`0$!`..5`%/`1, 0! L`%0
#!0/` ! `'`0+`0$!`/00!K
$!`List`+),+*!*0`.!!%2!/`0$!`%0!)/`".+)`0$!`/00!L`* `0$!`Form`.!!%2!/
0$!`handleSubmit`"1*0%+*`/``(('L`* `%0`"%.!/`onSubmit`3$!*`0$!`1/!.`(%'/`0$!`B
100+*K
0`%/`*+3`0%)!`0+`.!0!`0$!`/1+),+*!*0/L`* `3!`3%((`/0.0`".+)`List`&1/0`5`!40.0%*#
0$!`,.0`+"`0$!`+ !`".+)`0$!`,.!2%+1/`render`)!0$+ K
S`99?`T
),.+2!`0$!`!."+.)*!`+"`+1.`,,(%0%+*/ $,0!.`@
$!*L`3!`$2!`0$!`Form`+),+*!*0L`3$%$`%/``%0`)+.!`+),(!4`!1/!`%0`$* (!/`0$!
/00!`+"`0$!`+*0.+((! `%*,10`!(!)!*0K` 0`!40!* /`PureComponent`/`3!((`/+`0$0`%0`*!2!.
#!0/`.!_.!* !.! `".+)`0$!`,.!*0`/%*!`0$!`(('`*!2!.`$*#!/M
FODVV Form H[WHQGV PureComponent
0`.!!%2!/`0$!`0.#!0`!(!)!*0L`3$%$`%/`+1.`%*,10L`* `/2!/`%0/`2(1!`%*0+`0$!`/00!K
S`99@`T
),.+2!`0$!`!."+.)*!`+"`+1.`,,(%0%+*/ $,0!.`@
7RROVDQGOLEUDULHV
*`0$!`*!40`/!0%+*L`3!`3%((`#+`0$.+1#$`/+)!`0!$*%-1!/L`0++(/L`* `(%..%!/`0$0`3!
*`,,(5`0+`+1.`+ !`/!`0+`)+*%0+.`* `%),.+2!`0$!`,!."+.)*!K
,PPXWDELOLW\
/`3!`$2!`/!!*L`0$!`)+/0`,+3!."1(`0++(`3!`*`1/!`0+`%),.+2!`0$!`,!."+.)*!`+"`+1.
!0`,,(%0%+*`%/`shouldComponentUpdate`1/%*#`PureComponentK
$!`+*(5`,.+(!)`%/`0$0`PureComponent`1/!/``/$((+3`+),.%/+*`)!0$+ `#%*/0`0$!
,.+,/`* `/00!L`3$%$`)!*/`0$0`%"`3!`,//`*`+&!0`/``,.+,`* `3!`)100!`+*!`+"`%0/
2(1!/L`3!` +`*+0`#!0`0$!`!4,!0! `!$2%+.K
+.`!4),(!L`3!`*`/!0`0$!`/00!`%*`0$!`"+((+3%*#`)+ !M
FRQVW obj = this.state.REM;
obj.IRR = 'bar';
2!*`%"`0$!`2(1!`+"`0$!`foo`00.%10!`+"`0$!`+&!0`%/`$*#! L`0$!`.!"!.!*!`0+`0$!`+&!0`%/
/0%((`0$!`/)!`* `0$!`/$((+3`+),.%/+*` +!/`*+0`.!+#*%6!`%0K
S`9:7`T
),.+2!`0$!`!."+.)*!`+"`+1.`,,(%0%+*/ $,0!.`@
*`0$%/`/!L`3!`#!0``*!3`+&!0`3%0$`0$!`foo`,.+,!.05`/!0`0+`bar`L`* `0$!`/$((+3
+),.%/+*`3+1( `!`(!`0+`"%* `0$!` %""!.!*!K
%0$`=`* `!(L`0$!.!`%/`*+0$!.`35`0+`!4,.!//`0$!`/)!`+*!,0`%*``)+.!`!(!#*0
35L`* `%0`%/`5`1/%*#`0$!`+&!0`/,.! `+,!.0+.M
FRQVW obj = {
...this.state.REM,
IRR: 'bar'
};
this.VHW6WDWH({ obj });
!0`,.+2% !/`/+)!`%))10%(%05`$!(,!./`0+`)'!`%0`!/5`0+`3+.'`3%0$`%))10(!`+&!0/L
* `0$!.!`%/`(/+``,+,1(.`(%..5`((! `immutable.js`L`3$%$`$/`)+.!`,+3!."1(
"!01.!/`10`%0`.!-1%.!/`5+1`0+`(!.*`*!3` /K
%DEHOSOXJLQV
$!.!`.!`(/+``+1,(!`+"`%*0!.!/0%*#`!(`,(1#%*/`0$0`3!`*`%*/0((`* `1/!`0+`%),.+2!
0$!`,!."+.)*!`+"`+1.`!0`,,(%0%+*/K`$!5`)'!`0$!`,,(%0%+*/`"/0!.L`+,0%)%6%*#
,.0/`+"`0$!`+ !`0`1%( _0%)!K
$!`"%./0`+*!`%/`0$!`!0`+*/0*0`!(!)!*0/`0.*/"+.)!.`0$0`"%* /`((`0$!`/00%`!(!)!*0/
0$0` +`*+0`$*#!` !,!* %*#`+*`0$!`,.+,/`* `!40.0/`0$!)`".+)`0$!`render`)!0$+ `Q+.
0$!`"1*0%+*(`/00!(!//`+),+*!*0/R`0+`2+% `((%*#`createElement`1**!!//.%(5K
/%*#``!(`,(1#%*`%/`,.!005`/0.%#$0"+.3. K`!`"%./0`%*/0((`%0`3%0$`npmM
QSPLQVWDOOVDYHGHYEDEHOSOXJLQWUDQVIRUPUHDFWFRQVWDQWHOHPHQWV
S`9:8`T
),.+2!`0$!`!."+.)*!`+"`+1.`,,(%0%+*/ $,0!.`@
$!`/!+* `!(`,(1#%*`3!`*`$++/!`0+`1/!`0+`%),.+2!`,!."+.)*!`%/`0$!`!0`%*(%*!
!(!)!*0/`0.*/"+.)L`3$%$`.!,(!/`((`0$!` ` !(.0%+*/`Q+.`0$!`createElement`((/R
3%0$``)+.!`+,0%)%6! `2!./%+*`+"`0$!)`0+`)'!`!4!10%+*`"/0!.K
*/0((`0$!`,(1#%*`3%0$M
QSPLQVWDOOVDYHGHYEDEHOSOXJLQWUDQVIRUPUHDFWLQOLQHHOHPHQWV
!40L`5+1`*`!/%(5` `0$!`,(1#%*`0+`0$!`..5`+"`,(1#%*/`%*`0$!`.babelrc`"%(!L`/`"+((+3/M
{
"SOXJLQV": ["transform-react-inline-elements"]
}
6XPPDU\
1.`&+1.*!5`0$.+1#$`,!."+.)*!`%/`"%*%/$! L`* `3!`*`*+3`+,0%)%6!`+1.`,,(%0%+*/`0+
#%2!`1/!./``!00!.`K
*!`5+1W2!`"+1* `5+1.`+00(!*!'/L`5+1`*`,,(5`+*!`+"`0$!`0!$*%-1!/`3!`$2!`/!!*`%*
0$%/`$,0!.`0+`"%4`0$!`%//1!K`*!`+"`0$!`"%./0`0++(/`5+1`*`1/!`%/`0+
!40!* `PureComponent`* `1/!`%))10(!` 0`0+`)'!`5+1.`+),+*!*0`.!_.!* !.`+*(5
3$!*`/0.%0(5`*!! ! K
+*W0`"+.#!0`0+`2+% `0$!`+))+*`)%/0'!/`0$0`)'!`PureComponent`(!//`!""!0%2!L`/1$
/`#!*!.0%*#`*!3`"1*0%+*/`%*/% !`0$!`render`)!0$+ `+.`1/%*#`constant`/`,.+,/K
S`9:9`T
),.+2!`0$!`!."+.)*!`+"`+1.`,,(%0%+*/ $,0!.`@
S`9::`T
$ERXW7HVWLQJDQG'HEXJJLQJ
!0L`0$*'/`0+`%0/`+),+*!*0/L`)'!/`%0`!/5`0+`0!/0`+1.`,,(%0%+*/K`$!.!`.!`)*5
%""!.!*0`0++(/`0$0`3!`*`1/!`0+`.!0!`0!/0/`3%0$`!0L`* `$!.!`3!W((`+2!.`0$!`)+/0
,+,1(.`+*!/`0+`1* !./0* `0$!`!*!"%0/`0$!5`,.+2% !K
!/0`%/`*`((_%*_+*!`0!/0%*#`".)!3+.'`/+(10%+*L`)%*0%*! `5`$.%/0+,$!.`+&!.`".+)
!++'`* `+*0.%10+./`3%0$%*`0$!`+))1*%05L`* `%)/`0+`#%2!`5+1`0$!`!/0` !2!(+,!.
!4,!.%!*!K`!`3%((`(++'`0`+0$`35/`+"`1%( %*#`0$!`!/0`0!/0`!*2%.+*)!*0K
*`0$%/`$,0!.L`3!`3%((`(++'`0`0$!`"+((+3%*#`0+,%/M
7KHEHQHILWVRIWHVWLQJ
!/0%*#`3!` /`$/`(35/`!!*`` %""%1(0`&+K`.+)`1*%0`0+`!* _0+_!* `0!/0/K`$!`"0`0$0
0$!`%*0!."!/` !,!* `+*`.+3/!./L`1/!.`%*0!.0%+*/L`* `)*5`+0$!.`2.%(!/`)'!/`%0
%""%1(0`0+`%),(!)!*0`*`!""!0%2!`0!/0%*#`/0.0!#5K
"`+),+*!*0/`.!`1%(0`%*`0$!`.%#$0`35L`%"`0$!5`.!`,1.!`* `%)`"+.`+),+/%(%05`*
.!1/%(%05L`0$!5`*`!`0!/0! `/`/%),(!`"1*0%+*/K
!/0%*#`+),+*!*0/`+*(5`%*`0$!`+*/+(!`*`/+)!0%)!/`#%2!`1*!4,!0! `!$2%+./`3$!*
0$!5`.!`.!* !.! `%*``.!(`.+3/!.L`10`%*`)5`!4,!.%!*!`0$%/`%/`..!K
$!*`3!`0!/0`!0`+),+*!*0/L`3!`3*0`0+`)'!`/1.!`0$0`0$!5`3+.'`,.+,!.(5`* `0$0L
#%2!*` %""!.!*0`/!0/`+"`,.+,/L`0$!%.`+10,10`%/`(35/`+..!0K
S`9:<`T
+10`!/0%*#`* `!1##%*# $,0!.`87
!`)5`(/+`3*0`0+`+2!.`((`0$!`2.%+1/`/00!/`0$0``+),+*!*0`*`$2!K`$!`/00!
)%#$0`$*#!`5`(%'%*#``100+*L`/+`3!`3.%0!`0!/0/`0+`$!'`%"`((`0$!`!2!*0`$* (!./`.!
+%*#`3$0`0$!5`.!`/1,,+/! `0+` +K
3DLQOHVV-DYD6FULSWWHVWLQJZLWK-HVW
$!`)+/0`%),+.0*0`35`0+`(!.*`$+3`0+`0!/0`!0`+),+*!*0/`%*`0$!`.%#$0`35`%/`5`
3.%0%*#`/+)!`+ !L`* `0$0`%/`3$0`3!`.!`#+%*#`0+` +`%*`0$%/`/!0%+*K
+`/!!` !/0`%*`0%+*L`3!`.!`#+%*#`0+`.!0!``,.+&!0`".+)`/.0$L`%*/0((%*#`((`0$!
!,!* !*%!/`* `3.%0%*#``+),+*!*0`3%0$`/+)!`0!/0/K` 0W((`!`"1*P
S`9:=`T
+10`!/0%*#`* `!1##%*# $,0!.`87
/`5+1`)5`'*+3L`3!`*+3`$2!`0+`.!0!``.babelrc`"%(!L`3$%$`%/`1/! `5`!(`0+`'*+3
0$!`,.!/!0/`* `0$!`,(1#%*/`0$0`3!`3+1( `(%'!`0+`1/!`%*/% !`0$!`,.+&!0K
$!`.babelrc`"%(!`(++'/`(%'!`0$!`"+((+3%*#M
{
"SUHVHWV": ["@babel/preset-env", "@babel/preset-react"]
}
S`9:>`T
+10`!/0%*#`* `!1##%*# $,0!.`87
"src/**/*.{js,jsx}"
]
}
$!*L`(!0W/`.!0!`0$!`jest/setupTestFramework.js`"%(!M
LPSRUW { configure } IURP 'enzyme';
LPSRUW Adapter IURP 'enzyme-adapter-react-16.3';
+3L`(!0W/`%)#%*!`3!`$2!``Hello`+),+*!*0M
LPSRUW React IURP 'react';
H[SRUWGHIDXOW Hello;
'HSHQGHQFLHV
LPSRUW React IURP 'react';
LPSRUW { shallow } IURP 'enzyme';
&RPSRQHQWWRWHVW
LPSRUW Hello IURP './index';
GHVFULEH('Hello', () => {
FRQVW wrapper = VKDOORZ(+HOOR!);
FRQVW wrapperWithProps = VKDOORZ(+HOOR QDPH="Carlos" !);
S`9:?`T
+10`!/0%*#`* `!1##%*# $,0!.`87
H[SHFW(wrapper.ILQG('h1').KDV&ODVV('Hello')).WR%H(true);
});
});
+1`/$+1( `/!!`0$%/`.!/1(0M
S`9:@`T
+10`!/0%*#`* `!1##%*# $,0!.`87
$%/`%/`0$!`.!/1(0M
"`5+1`3*0`0+`/!!`0$!`+2!.#!`,!.!*0#!`+"`((`5+1.`1*%0`0!/0/L`5+1`*`!4!10!`0$!
"+((+3%*#`+))* M
QSPUXQWHVWFRYHUDJH
S`9;7`T
+10`!/0%*#`* `!1##%*# $,0!.`87
$!`.!/1(0`%/`0$!`"+((+3%*#M
S`9;8`T
+10`!/0%*#`* `!1##%*# $,0!.`87
7HVWLQJHYHQWV
$!`!2!*0/`.!`2!.5`+))+*`%*`*5`3!`,,(%0%+*`* `3!`*!! `0+`0!/0`0$!)`/`3!((L`/+
(!0W/`(!.*`$+3`0+`0!/0`!2!*0/K`+.`0$%/L`(!0W/`.!0!``*!3`ShowInformation`+),+*!*0M
LPSRUW React, { Component } IURP 'react';
KDQGOH6KRZ,QIRUPDWLRQ = () => {
this.VHW6WDWH({
VKRZ: true
});
}
UHQGHU() {
LI (this.state.VKRZ) {
UHWXUQ (
GLYFODVV1DPH="ShowInformation"!
K!Personal InformationK!
GLYFODVV1DPH="personalInformation"!
S!VWURQJ!Name:<VWURQJ! {this.state.QDPH}S!
S!VWURQJ!Age:VWURQJ! {this.state.DJH}S!
GLY!
GLY!
);
}
UHWXUQ (
GLYFODVV1DPH="ShowInformation"!
K!Personal InformationK!
S!VWURQJ!Name:VWURQJ!S!
<S!
LQSXW
S`9;9`T
+10`!/0%*#`* `!1##%*# $,0!.`87
QDPH="name"
W\SH="text"
YDOXH={this.state.QDPH}
RQ&KDQJH={this.KDQGOH2Q&KDQJH}
!
S!
S!
LQSXW
QDPH="age"
W\SH="number"
YDOXH={this.state.DJH}
RQ&KDQJH={this.KDQGOH2Q&KDQJH}
!
S!
S!
EXWWRQRQ&OLFN={this.KDQGOH6KRZ,QIRUPDWLRQ}!
Show Information
EXWWRQ!
S!
GLY!
);
}
}
H[SRUWGHIDXOW ShowInformation;
+1`3%((`,.+(5`#!0`0$!`"+((+3%*#`!..+.`3$!*`5+1`0.5`0+`.1*`0$%/`+ !M
+`"%4`0$%/`%//1!L`5+1`*!! `0+`%*/0((`0$!`"+((+3%*#`,'#!M
QSPLQVWDOO#EDEHOSOXJLQSURSRVDOFODVVSURSHUWLHV
S`9;:`T
+10`!/0%*#`* `!1##%*# $,0!.`87
"SOXJLQV": ["@babel/plugin-proposal-class-properties"]
}
+3L`(!0W/`.!0!`0$!`0!/0`"%(!`0`src/components/ShowInformation/index.test.jsM
'HSHQGHQFLHV
LPSRUW React IURP 'react';
LPSRUW { shallow } IURP 'enzyme';
&RPSRQHQWWRWHVW
LPSRUW ShowInformation IURP './index';
GHVFULEH('ShowInformation', () => {
FRQVW wrapper = VKDOORZ(<ShowInformation />);
wrapper.ILQG('input[name="age"]').VLPXODWH('change', {
WDUJHW: {
QDPH: 'age',
YDOXH: 31
}
});
*HWWLQJWKHYDOXHVRIWKHQDPHDQGDJHVWDWHV
H[SHFW(wrapper.VWDWH('name')).WR%H('Carlos');
H[SHFW(wrapper.VWDWH('age')).WR%H(31);
});
7KHVKRZVWDWHVKRXOGEHWUXH
H[SHFW(wrapper.VWDWH('show')).WR%H(true);
});
});
S`9;;`T
+10`!/0%*#`* `!1##%*# $,0!.`87
5HDFW'HY7RROV
$!*`0!/0%*#`%*`0$!`+*/+(!`%/`*+0`!*+1#$L`* `3!`3*0`0+`%*/,!0`+1.`,,(%0%+*`3$%(!`%0
%/`.1**%*#`%*/% !`0$!`.+3/!.L`3!`*`1/!`0$!`!0`!2!(+,!.`++(/K
+1`*`%*/0((`0$!)`/``$.+)!`!40!*/%+*`0`0$!`"+((+3%*#`M`https:/b/bchrome.
google.bcom/bwebstore/bdetail/breact-bdeveloper-btools/
fmkadmapgofadopljbjfkapdkoienihibhl=ben.b
$%/`%/``)1/0_$2!`0++(L`* `%*`0$!`)+/0`.!!*0`2!./%+*/`%0`$/``*!3`"!01.!`0$0`*`!
!*(! `5`0%'%*#`0$!`.!`!0`, 0!/`$!'+4K
S`9;<`T
+10`!/0%*#`* `!1##%*# $,0!.`87
5HGX['HY7RROV
"`5+1`.!`1/%*#`! 14`%*`5+1.`,,(%0%+*`,.+(5L`5+1`3*0`0+`1/!`! 14`!2++(/`0+`!
(!`0+` !1#`5+1.`! 14`"(+3K`+1`*`%*/0((`%0`0`0$!`"+((+3%*#`M`https:/b/bchrome.
google.bcom/bwebstore/bdetail/bredux-bdevtools/blmhkpmbekcpmknklioeibfkpmmfibljdbhl=
es.b
(/+L`5+1`*!! `0+`%*/0((`0$!`redux-devtools-extension`,'#!M
QSPLQVWDOOVDYHGHYUHGX[GHYWRROVH[WHQVLRQ
'HSHQGHQFLHV
LPSRUW { createStore, applyMiddleware } IURP 'redux';
LPSRUW thunk IURP 'redux-thunk';
LPSRUW { composeWithDevTools } IURP 'redux-devtools-extension';
5RRW5HGXFHU
LPSRUW rootReducer IURP '@reducers';
H[SRUWGHIDXOWIXQFWLRQ configureStore({
initialState,
reducer
}) {
FRQVW middleware = [
thunk
];
UHWXUQ FUHDWH6WRUH(
rootReducer,
initialState,
FRPSRVH:LWK'HY7RROV(DSSO\0LGGOHZDUH(...middleware))
);
}
S`9;=`T
+10`!/0%*#`* `!1##%*# $,0!.`87
6XPPDU\
*`0$%/`$,0!.L`5+1`(!.*! `+10`0$!`!*!"%0/`+"`0!/0%*#L`* `0$!`".)!3+.'/`5+1`*`1/!
0+`+2!.`5+1.`!0`+),+*!*0/`3%0$`0!/0/K
0`%/`%),+.0*0`0+`!.`%*`)%* `+))+*`/+(10%+*/`3$!*`%0`+)!/`0+`0!/0%*#`+),(!4
+),+*!*0/L`/1$`/`$%#$!._+. !.`+),+*!*0/`+.`"+.)/`3%0$`)1(0%,(!/`*!/0! `"%!( /K
*`0$!`*!40`$,0!.L`5+1`3%((`(!.*`+10`$+3`0+`%),(!)!*0`.+10!/`%*`5+1.`,,(%0%+*`1/%*#
!0`+10!.K
S`9;>`T
5HDFW5RXWHU
!0L`1*(%'!`*#1(.L`%/``(%..5`%*/0! `+"``".)!3+.'L`)!*%*#`/,!%"%`"1*0%+*(%0%!/
Q"+.`!4),(!L`.+10%*#`propTypesR`.!`*+0`,.0`+"`0$!`!0`+.!K` */0! L`.+10%*#`%/`$* (!
5``0$%. _,.05`(%..5`((! `!0`+10!.K
*`0$%/`$,0!.L`5+1`3%((`/!!`$+3`0+`%),(!)!*0`!0`+10!.`%*`5+1.`,,(%0%+*L`* `5`0$!
!* `+"`0$!`.!(!2*0`/!0%+*/L`5+1`3%((`!`(!`0+` ` 5*)%`.+10!/`* `1* !./0* `$+3
!0`+10!.`3+.'/K
*`0$%/`$,0!.L`3!`3%((`+2!.`0$!`"+((+3%*#`0+,%/M
,QVWDOODWLRQDQGFRQILJXUDWLRQ
"0!.`5+1`.!0!``*!3`!0`,,(%0%+*`1/%*#`create-react-appL`0$!`"%./0`0$%*#`5+1
*!! `0+` +`%/`0+`%*/0((`!0`+10!.`2;K4L`1/%*#`0$%/`+))* M
QSPLQVWDOOUHDFWURXWHUGRP
&UHDWLQJRXUVHFWLRQV
!0W/`.!0!`/+)!`/!0%+*/`0+`0!/0`/+)!`/%`.+10!/K`!`*!! `0+`.!0!`"+1.`/00!(!//
+),+*!*0/`QAboutL`ContactL`HomeL`* `Error404R`* `*)!`0$!)`/`index.jsx`%*
0$!%.` %.!0+.%!/K
+1`*` `0$!`"+((+3%*#`0+`0$!`src/components/Home.jsx`+),+*!*0M
LPSRUW React IURP 'react';
H[SRUWGHIDXOW Home;
S`9;@`T
!0`+10!. $,0!.`88
$!`src/components/About.jsx`+),+*!*0`*`!`.!0! `3%0$`0$!`"+((+3%*#M
LPSRUW React IURP 'react';
H[SRUWGHIDXOW About;
$!`"+((+3%*#`.!0!/`0$!`src/components/Contact.jsx`+),+*!*0M
LPSRUW React IURP 'react';
H[SRUWGHIDXOW Contact;
%*((5L`0$!`src/components/Error404/index.jsx`+),+*!*0`%/`.!0! `/`"+((+3/M
LPSRUW React IURP 'react';
H[SRUWGHIDXOW Error404;
6W\OHV
LPSRUW './index.css';
5RXWHV
S`9<7`T
!0`+10!. $,0!.`88
UHQGHU(
5RXWHU!
$SS5RXWHV!
5RXWHU!,
document.JHW(OHPHQW%\,G('root')
);
&RPSRQHQWV
LPSRUW App IURP './components/App';
LPSRUW Home IURP './components/Home';
H[SRUWGHIDXOW AppRoutes;
App.SURS7\SHV = {
FKLOGUHQ: element
};
H[SRUWGHIDXOW App;
"`5+1`.1*`0$!`,,(%0%+*L`5+1`3%((`/!!`0$!`Home`+),+*!*0`%*`0$!`.++0`Q\RM
S`9<8`T
!0`+10!. $,0!.`88
+3L`(!0W/` `Error404`3$!*`0$!`1/!.`0.%!/`0+`!//`*5`+0$!.`.+10!M
'HSHQGHQFLHV
LPSRUW React IURP 'react';
LPSRUW { Route } IURP 'react-router-dom';
&RPSRQHQWV
LPSRUW App IURP './components/App';
LPSRUW Home IURP './components/Home';
LPSRUW Error404 IURP './components/Error404';
H[SRUWGHIDXOW AppRoutes;
!0W/`.1*`0$!`,,(%0%+*`#%*K`+1`3%((`/!!`0$0`+0$`0$!`Home`* `Error404`+),+*!*0/
.!`!%*#`.!* !.! M
S`9<9`T
!0`+10!. $,0!.`88
&RPSRQHQWV
LPSRUW App IURP './components/App';
LPSRUW Home IURP './components/Home';
LPSRUW Error404 IURP './components/Error404';
H[SRUWGHIDXOW AppRoutes;
+3L`%"`5+1`#+0`0+`0$!`.++0`Q/RL`5+1`3%((`/!!`0$!`Home`+),+*!*0`* `Error404`3+*W0`!`
!4!10! `0`0$!`/)!`0%)!`Q%0`3%((`&1/0`!`!4!10! `%*`0$!`Home`+),+*!*0RL`10`%"`3!`#+`0+
/somefakeurlL`3!`3%((`/!!`0$0`0$!`Home`+),+*!*0`%/`!4!10! `/`3!((L`* `0$%/`%/`
,.+(!)M
S`9<:`T
!0`+10!. $,0!.`88
+3L`%"`5+1`#+`0+`/somefakeurl`+*!`)+.!`0%)!L`5+1`3%((`!`(!`0+`/!!`0$!`..+.;7;
+),+*!*0M
&RPSRQHQWV
LPSRUW App IURP './components/App';
LPSRUW About IURP './components/About';
LPSRUW Contact IURP './components/Contact';
LPSRUW Home IURP './components/Home';
LPSRUW Error404 IURP './components/Error404';
S`9<;`T
!0`+10!. $,0!.`88
H[SRUWGHIDXOW AppRoutes;
+3L`5+1`*`2%/%0`/aboutM
(0!.*0%2!(5L`5+1`*`*+3`2%/%0`/contactM
$GGLQJSDUDPHWHUVWRWKHURXWHV
+`".L`5+1`$2!`(!.*! `$+3`0+`1/!`!0`+10!.`"+.`/%`.+10!/`Q+*!_(!2!(`.+10!/RK`+3L`
3%((`/$+3`5+1`$+3`0+` `/+)!`,.)!0!./`0+`0$!`.+10!/`* `#!0`0$!)`%*0+`+1.
+),+*!*0/K
+.`0$%/`!4),(!L`3!`3%((`.!0!``Contacts`+),+*!*0`0+` %/,(5``(%/0`+"`+*00/`3$!*
3!`2%/%0`/contacts`.+10!L`10`3!`3%((`/$+3`0$!`+*00`%*"+.)0%+*`QnameL`phoneL`*
emailR`3$!*`0$!`1/!.`2%/%0/`/contacts/:contactIdK
S`9<<`T
!0`+10!. $,0!.`88
UHQGHU() {
UHWXUQ (
GLYFODVV1DPH="Contacts"!
K!ContactsK!
GLY!
);
}
}
H[SRUWGHIDXOW Contacts;
!0W/`1/!`0$!/!``/05(!/M
.&RQWDFWV ul {
list-style: none;
margin: 0;
S`9<=`T
!0`+10!. $,0!.`88
margin-bottom: 20px;
padding: 0;
}
.&RQWDFWV ul li {
padding: 10px;
}
.&RQWDFWV a {
color: #555;
text-decoration: none;
}
.&RQWDFWV a:hover {
color: #ccc;
text-decoration: none;
}
// Components
import App from './components/App';
import About from './components/About';
import Contact from './components/Contact';
import Home from './components/Home';
import Error404 from './components/Error404';
LPSRUW Contacts IURP './components/Contacts';
S`9<>`T
!0`+10!. $,0!.`88
+3L`5+1`3%((`!`(!`0+`/!!`0$!`+*00/`+),+*!*0`%"`5+1`#+`0+`0$!`/contacts`M
S`9<?`T
!0`+10!. $,0!.`88
SKRQH: '664-291-4477'
}
]
};
UHQGHU() {
FRQVW { contacts } = this.VWDWH;
UHWXUQ (
GLYFODVV1DPH="Contacts"!
K!ContactsK!
{this.UHQGHU&RQWDFWV(contacts)}
GLY!
);
}
}
H[SRUWGHIDXOW Contacts;
/`5+1`*`/!!L`3!`.!`1/%*#`0$!`<Link>`+),+*!*0L`3$%$`3%((`#!*!.0!`*`<a>`0#`0$0
,+%*0/`0+`/contacts/contact.idL`* `0$%/`%/`!1/!`3!`3%((` ``*!3`*!/0! `.+10!`%*0+
+1.`.+10!`"%(!`0+`)0$`0$!` `+"`0$!`+*00M
FRQVW AppRoutes = () => (
$SS!
6ZLWFK!
<Route path="/" component={Home} exact />
<Route path="/about" component={About} exact />
<Route path="/contact" component={Contact} exact />
<Route path="/contacts" component={Contacts} exact />
5RXWHSDWK="/contacts/:contactId" FRPSRQHQW={Contacts} H[DFW!
<Route component={Error404} />
6ZLWFK!
$SS!
);
S`9<@`T
!0`+10!. $,0!.`88
UHQGHU&RQWDFWV = () => (
XO!
{this.state.contacts.PDS((contact, key) => (
OLNH\={key}!
/LQNWR={`/contacts/${contact.LG}`}!{contact.QDPH}/LQN!
S`9=7`T
!0`+10!. $,0!.`88
OL!
))}
XO!
);
UHQGHU() {
/HW VVHHZKDWFRQWDLQVWKHSURSVREMHFW
console.ORJ(this.props);
:HJRWWKHQRWH,GSDUDPIURPPDWFKREMHFW
FRQVW { PDWFK: { SDUDPV: { FRQWDFW,G } } } = this.SURSV;
FRQVW { contacts } = this.VWDWH;
%\GHIDXOWRXUVHOHFWHG1RWHLVIDOVH
OHW selectedContact = IDOVH;
LI (FRQWDFW,G > 0) {
,IWKHFRQWDFWLGLVKLJKHUWKDQWKHQZHILOWHULWIURPRXU
FRQWDFWVDUUD\
selectedContact = contacts.ILOWHU(
contact => contact.id === 1XPEHU(contactId)
)>@;
}
UHWXUQ (
GLYFODVV1DPH="Contacts"!
K!ContactsK!
^ :HUHQGHURXUVHOHFWHG&RQWDFWRUDOOWKHFRQWDFWV `
{VHOHFWHG&RQWDFW
this.UHQGHU6LQJOH&RQWDFW(selectedContact)
: this.UHQGHU&RQWDFWV()}
GLY!
);
}
}
H[SRUWGHIDXOW Contacts;
S`9=8`T
!0`+10!. $,0!.`88
$!`match`,.+,`(++'/`(%'!`0$%/M
/`5+1`*`/!!L`0$!`match`,.+,/`+*0%*/``(+0`+"`1/!"1(`%*"+.)0%+*K`!0`+10!.`(/+`
%*(1 !/`0$!`+&!0W/`$%/0+.5`* `(+0%+*K`(/+L`3!`*`#!0`((`0$!`,.)!0!./`3!`,//
3%0$%*`0$!`.+10!/N`%*`0$%/`/!L`3!`.!`.!!%2%*#`0$!`contactId`,.)!0!.K
"`5+1`.1*`0$!`,,(%0%+*`#%*L`5+1`/$+1( `/!!`5+1.`+*00/`(%'!`0$%/M
S`9=9`T
!0`+10!. $,0!.`88
"`5+1`(%'`+*` +$*`)%0$`Q3$+/!`contactId`%/`2RL`5+1`3%((`/!!`0$!`+*00`%*"+.)0%+*M
"0!.`0$%/L`5+1`*` ``*2.`%*`0$!`App`+),+*!*0`0+`!//`0+`((`0$!`.+10!/M
LPSRUW React IURP 'react';
LPSRUW { element } IURP 'prop-types';
LPSRUW { Link } IURP 'react-router-dom';
LPSRUW './App.css';
{children}
GLY!
);
App.SURS7\SHV = {
FKLOGUHQ: element
};
H[SRUWGHIDXOW App;
S`9=:`T
!0`+10!. $,0!.`88
+3L`(!0W/`)+ %"5`+1.`App`/05(!/M
.$SS {
text-align: center;
}
$SSXOPHQX {
margin: 50px;
padding: 0;
list-style: none;
}
$SSXOPHQXOL {
display: inline-block;
padding: 0 10px;
}
$SSXOPHQXOLD {
color: #333;
text-decoration: none;
}
$SSXOPHQXOLDKRYHU {
color: #ccc;
}
%*((5L`5+1`3%((`/!!`/+)!0$%*#`(%'!`0$%/M
S`9=;`T
!0`+10!. $,0!.`88
6XPPDU\
$!`&+1.*!5`0$.+1#$`!0`+10!.`$/`+)!`0+`*`!* L`* `*+3`5+1`'*+3`$+3`0+`%*/0((
* `+*"%#1.!`!0`+10!.L`$+3`0+`.!0!`/%`.+10!/`* `$+3`0+` `,.)!0!./`0+`0$!
*!/0! `.+10!/K
*`0$!`*!40`$,0!.L`3!`3%((`/!!`$+3`0+`2+% `/+)!`+"`0$!`)+/0`+))+*`*0%_,00!.*/`%*
!0K
S`9=<`T
$QWL3DWWHUQVWREH$YRLGHG
*`0$%/`++'L`5+1W2!`(!.*! `$+3`0+`,,(5`!/0`,.0%!/`3$!*`3.%0%*#``!0`,,(%0%+*K
*`0$!`"%./0`"!3`$,0!./L`3!`.!2%/%0! `0$!`/%`+*!,0/`0+`1%( ``/+(% `1* !./0* %*#L`*
0$!*`3!`0++'``(!,`%*0+`)+.!` 2*! `0!$*%-1!/`%*`0$!`"+((+3%*#`$,0!./K
*`0$%/`$,0!.L`3!`3%((`+2!.`0$!`"+((+3%*#`0+,%/M
*%0%(%6%*#`0$!`/00!`1/%*#`,.+,!.0%!/
100%*#`0$!`/00!`
/%*#`%* !4!/`/``'!5
,.! %*#`,.+,!.0%!/`+*``!(!)!*0/
,QLWLDOL]LQJWKHVWDWHXVLQJSURSHUWLHV
*`0$%/`/!0%+*L`3!`3%((`/!!`$+3`%*%0%(%6%*#`0$!`/00!`1/%*#`,.+,!.0%!/`.!!%2! `".+)`0$!
,.!*0`%/`1/1((5`*`*0%_,00!.*K` `$2!`1/! `0$!`3+. `1/1((5`!1/!L`/`3!`3%((`/!!L`+*!
3!`$2!`%0`(!.`%*`+1.`)%* `3$0`0$!`,.+(!)/`3%0$`0$%/`,,.+$`.!L`3!`)%#$0`/0%((
!% !`0+`1/!`%0K
*!`+"`0$!`!/0`35/`0+`(!.*`/+)!0$%*#`%/`5`(++'%*#`0`0$!`+ !L`/+`3!`3%((`/0.0`5
.!0%*#``/%),(!`+),+*!*0`3%0$``B`100+*`0+`%*.!)!*0``+1*0!.K
*0%_00!.*/`0+`!`2+% ! $,0!.`89
$!`+),+*!*0`%/`%),(!)!*0! `1/%*#``classL`/`/$+3*`%*`0$!`"+((+3%*#`/*%,,!0`+"`+ !M
FODVV Counter H[WHQGV Component
0`$/``constructorL`3$!.!`3!`%*%0%(%6!`0$!`state`1/%*#`0$!`count`,.+,!.05L`* `3!
%* `0$!`!2!*0`$* (!.M
FRQVWUXFWRU(props) {
VXSHU(props);
this.VWDWH = {
FRXQW: props.FRXQW
};
this.KDQGOH&OLFN = this.handleClick.ELQG(this);
}
+3L`(!0W/`.!* !.`0$%/`+),+*!*0L`,//%*#`1`/`0$!`count`,.+,!.05M
&RXQWHU FRXQW={1} !
0`3+.'/`/`!4,!0! —!$`(%'`+*`0$!`B`100+*`%*.!)!*0/`0$!`1..!*0`2(1!K`+L`3$0W/
0$!`,.+(!)O
S`9=>`T
*0%_00!.*/`0+`!`2+% ! $,0!.`89
$!.!`.!`03+`)%*`!..+./L`3$%$`.!`+10(%*! `/`"+((+3/M
"`3!`%*/,!0`0$!`Counter`!(!)!*0`1/%*#`0$!`!0`!2++(/L`3!`*+0%!
0$0`Props`* `State`$+( ``/%)%(.`2(1!M
&RXQWHU!
Props
count: 1
State
count: 1
0`0$%/`,+%*0L`3!`*`//1)!`0$0`0$!`/!+* `2(1!`.!,.!/!*0/`0$!`1..!*0`+1*0L`10`0$%/`%/
*+0`!4,(%%0`* `*`(! `0+`1*!4,!0! `!$2%+./L`+.`3.+*#`2(1!/` +3*`%*`0$!`0.!!K
$0`%"`3!`.!((5`3*0`0+`1/!`0$!`,.+,W/`2(1!`0+`%*%0%(%6!`0$!`+),+*!*0L`* `3!`'*+3`"+.
/1.!`0$0`0$!`2(1!` +!/`*+0`$*#!`%*`0$!`"101.!O
S`9=?`T
*0%_00!.*/`0+`!`2+% ! $,0!.`89
*`0$0`/!L`%0W/``!/0`,.0%!`0+`)'!`%0`!4,(%%0`* `#%2!`0$!`,.+,!.05``*)!`0$0`)'!/
5+1.`%*0!*0%+*/`(!.L`/1$`/`initialCountK`+.`!4),(!L`(!0W/`/5`3!`$*#!`0$!
constructor`+"`0$!`Counter`+),+*!*0`%*`0$!`"+((+3%*#`35M
FRQVWUXFWRU(props) {
VXSHU(props);
this.VWDWH = {
FRXQW: props.LQLWLDO&RXQW
};
this.KDQGOH&OLFN = this.handleClick.ELQG(this);
}
"`3!`1/!`%0`(%'!`/+L`%0`%/`(!.`0$0`0$!`,.!*0`+*(5`$/``35`0+`%*%0%(%6!`0$!`+1*0!.L`10`*5
"101.!`2(1!/`+"`0$!`initialCount`,.+,!.05`3%((`!`%#*+.! M
&RXQWHU LQLWLDO&RXQW={1} !
0XWDWLQJWKHVWDWH
!0`+)!/`3%0$``2!.5`(!.`* `/0.%#$0"+.3. ` `0+`)100!`0$!`%*0!.*(`/00!`+"
+),+*!*0/K`/%*#`0$!`setState`"1*0%+*L`3!`*`0!((`0$!`(%..5`$+3`3!`3*0`0$!`/00!`0+
!`$*#! K`/`/++*`/`0$!`/00!`%/`1, 0! L`!0`.!_.!* !./`0$!`+),+*!*0L`* `3!`*
!//`0$!`*!3`/00!`0$.+1#$`0$!`this.state`,.+,!.05—0$0W/`%0K
%./0`+"`((L`%"`3!`)100!`0$!`/00!`3%0$+10`1/%*#`setStateL`03+` `0$%*#/`*`$,,!*M
$!`/00!`$*#!/`3%0$+10`)'%*#`0$!`+),+*!*0`.!_.!* !.
$!*!2!.`setState`#!0/`((! `%*`0$!`"101.!L`0$!`)100! `/00!`#!0/`,,(%!
S`9=@`T
*0%_00!.*/`0+`!`2+% ! $,0!.`89
/`3!`/3`%*`Chapter 3L`.!0!`.1(5`!1/(!`+),+*!*0/L`+*!`+"`0$!`.!/+*/`3$5`3!`1/!
0$!`/00!`+&!0`%/`0+`/0+.!`2(1!/`0$0`.!`*!! ! `%*/% !`0$!`render`)!0$+ K
/0`10`*+0`(!/0L`)100%*#`0$!`/00!`$/``/!2!.!`%),0`+*`,!."+.)*!K`+`/$+3`0$%/
!$2%+.L`3!`.!`#+%*#`0+`.!0!``*!3`+),+*!*0L`/%)%(.`0+`0$!`(%/0`3!`1/! `%*`Chapter
9L` ),.+2!`0$!`!."+.)*!`+"`+1.`,,(%0%+*/L`3$!*`3!`(!.*! `$+3`0+`1/!`keys
* `PureComponentK
$*#%*#`0$!`2(1!`+"`0$!`/00!`$/``*!#0%2!`%),0`3$!*`1/%*#`PureComponentK`+
1* !./0* `0$!`,.+(!)L`3!`.!`#+%*#`0+`.!0!`0$!`"+((+3%*#`ListM
FODVV List H[WHQGV PureComponent
S`9>7`T
*0%_00!.*/`0+`!`2+% ! $,0!.`89
$!`(%'`$* (!.`%/`,.!005`/%),(!—%0`&1/0`,1/$!/``*!3`!(!)!*0`%*0+`0$!`..5`Q3!`3%((`/!!
(0!.`3$5`0$0`%/`3.+*#R`* `0$!*`%0`/!0/`0$!`..5`'`%*0+`0$!`stateM
KDQGOH&OLFN() {
this.state.items.SXVK('baz');
this.VHW6WDWH({
LWHPV: this.state.LWHPV
});
}
++'%*#`0`0$!`+ !L`3!`)%#$0`0$%*'`0$0`0$!.!`.!`*+`%//1!/N`$+3!2!.L`%"`3!`.1*`0$!
+),+*!*0`%*/% !`0$!`.+3/!.L`3!W((`*+0%!`0$0`0$!`2(1!` +!/*W0`#!0`1, 0! `3$!*`3!
(%'`BK
2!*`%*`0$%/`/!L`5`$!'%*#`0$!`/00!`+"`0$!`+),+*!*0`1/%*#`0$!`!0`!2++(L`3!`*
/!!`$+3`0$!`/00!`$/`!!*`1, 0! `%*0!.*((5L`3%0$+10`1/%*#``.!_.!* !.M
<List>
State
items: Array[3]
0: "foo"
1: "bar"
2: "baz"
1/$%*#``*!3`%0!)`%*0+`0$!`..5L`%*`"0L` +!/`*+0`.!0!``*!3`..5K
$!`PureComponent` !% !/`%"`0$!`+),+*!*0`/$+1( `!`1, 0! `5`$!'%*#`3$!0$!.`0$!
2(1!/`+"`%0/`,.+,!.0%!/`* `/00!`.!`$*#! `10L`%*`0$%/`/!L`3!`,//! `0$!`/)!`..5
#%*K`$%/`*`!`+1*0!._%*01%0%2!`%*`0$!`!#%**%*#L`!/,!%((5`%"`5+1`.!`*+0`1/! `0+
3+.'%*#`3%0$`%))10(!` 0`/0.101.!/K
S`9>8`T
*0%_00!.*/`0+`!`2+% ! $,0!.`89
$!`,+%*0`$!.!`%/`0+`(35/`/!0``*!3`2(1!`+"`0$!`state`,.+,!.05L`3$%$`)!*/`3!`*
!/%(5`"%4`0$!`%//1!`5`$*#%*#`0$!`(%'`$* (!.`+"`0$!`List`+),+*!*0`%*`0$!`"+((+3%*#
35M
KDQGOH&OLFN() {
this.VHW6WDWH({
LWHPV: this.state.items.FRQFDW('baz')
});
}
$!`concat`"1*0%+*`+"`0$!`..5`.!01.*/``*!3`..5L`0$1/`,,!* %*#`0$!`*!3`%0!)`0+`0$!
,.!2%+1/`+*!/K` *`0$%/`35L`PureComponent`"%* /``*!3`..5`%*`0$!`/00!`* `.!_.!* !./
%0/!("`+..!0(5K
8VLQJLQGH[HVDVDNH\
*`Chapter 9L` ),.+2!`0$!`!."+.)*!`+"`+1.`,,(%0%+*/L`3$%$`0('/`+10`,!."+.)*!
* `0$!`.!+*%(!.L`3!`/3`$+3`3!`*`$!(,`!0`"%#1.!`+10`0$!`/$+.0!/0`,0$`0+`1, 0!`0$!
`5`1/%*#`0$!`key`,.+,K
!0W/L`#%*L`.!0!``List`+),+*!*0L`/`/$+3*`$!.!M
FODVV List H[WHQGV PureComponent
S`9>9`T
*0%_00!.*/`0+`!`2+% ! $,0!.`89
EXWWRQRQ&OLFN={this.KDQGOH&OLFN}!+EXWWRQ!
GLY!
);
}
"`5+1`.1*`0$!`+),+*!*0`%*/% !`0$!`.+3/!.L`5+1`3%((`*+0`/!!`*5`,.+(!)/N`(%'%*#
0$!`B`100+*`%*/!.0/``*!3`%0!)`0`0$!`0+,`+"`0$!`(%/0K`10`(!0W/` +`*`!4,!.%)!*0K
S`9>:`T
*0%_00!.*/`0+`!`2+% ! $,0!.`89
GLY!
);
}
"`3!`.1*`0$%/`+),+*!*0`#%*`%*`0$!`.+3/!.L`+,5`0$!`2(1!/`+"`0$!`%0!)/`%*`0$!`%*,10
"%!( /L`* `0$!*`(%'`BL`3!`3%((`#!0`1*!4,!0! `!$2%+.K
/`/$+3*`%*`0$!`"+((+3%*#`/.!!*/$+0L`0$!`%0!)/`/$%"0` +3*`3$%(!`0$!`%*,10`!(!)!*0/
.!)%*`%*`0$!`/)!`,+/%0%+*L`%*`/1$``35`0$0`0$!%.`2(1!` +!/`*+0`)0$`0$!`2(1!`+"`0$!
%0!)/`*5)+.!M
$0`3!`*`/!!`%/`0$0`!0L`%*/0! `+"`%*/!.0%*#`0$!`*!3`!(!)!*0`+*`0+,L`/3,/`0$!`0!40`+"
0$!`03+`!4%/0%*#`!(!)!*0/L`* `%*/!.0/`0$!`(/0`%0!)`0`0$!`+00+)`/`%"`%0`3/`*!3K`$!
.!/+*`%0` +!/`0$0`%/`!1/!`3!`.!`1/%*#`0$!`%* !4`+"`0$!`map`"1*0%+*`/`0$!`'!5K
*`"0L`0$!`%* !4`(35/`/0.0/`".+)`0L`!2!*`%"`3!`,1/$``*!3`%0!)`0+`0$!`0+,`+"`0$!`(%/0L`/+
!0`0$%*'/`0$0`3!`$*#! `0$!`2(1!/`+"`0$!`!4%/0%*#`03+L`* ` ! ``*!3`!(!)!*0`0
%* !4`2K`$!`!$2%+.`%/`0$!`/)!`/`%0`3+1( `$2!`!!*`3%0$+10`1/%*#`0$!`'!5`,.+,!.05`0
((K
S`9>;`T
*0%_00!.*/`0+`!`2+% ! $,0!.`89
$%/`%/``2!.5`+))+*`,00!.*`!1/!L`3!`)5`0$%*'`0$0`,.+2% %*#`*5`'!5`%/`(35/`0$!
!/0`/+(10%+*L`10`%0`%/`*+0`(%'!`0$0`0`((K`$!`'!5`$/`0+`!`1*%-1!`* `/0(!L`% !*0%"5%*#
+*!L`* `+*(5`+*!L`%0!)K
+`/+(2!`0$%/`,.+(!)`3!`*L`"+.`!4),(!L`1/!`0$!`2(1!`+"`0$!`%0!)`%"`3!`!4,!0`%0`*+0`0+`!
.!,!0! `3%0$%*`0$!`(%/0L`+.`.!0!``1*%-1!`% !*0%"%!.K
6SUHDGLQJSURSHUWLHVRQ'20HOHPHQWV
$!.!`%/``+))+*`,.0%!`0$0`$/`.!!*0(5`!!*` !/.%! `/`*`*0%_,00!.*`5`*
.)+2N`%0`(/+`0.%##!./``3.*%*#`%*`0$!`+*/+(!`3$!*`5+1` +`%0`%*`5+1.`!0
,,(%0%+*K
$!`)!//#!`3!`#!0`(++'/`(%'!`0$!`"+((+3%*#`!1/!`0$!`foo`,.+,!.05`%/`*+0`2(% `"+.
`div`!(!)!*0M
*'*+3*`,.+,`a"++a`+*`D %2E`0#K`!)+2!`0$%/`,.+,`".+)`0$!`!(!)!*0
S`9><`T
*0%_00!.*/`0+`!`2+% ! $,0!.`89
"`3!`1/!`0$!`+),+*!*0`%*`0$!`"+((+3%*#`35L`0$!.!`.!`*+`%//1!/M
6SUHDGFODVV1DPH="foo" !
`$%/L`$+3!2!.L`%/`*+0`0$!`/!`%"`3!` +`/+)!0$%*#`(%'!`0$!`"+((+3%*#K`!0`+),(%*/
!1/!`3!`.!`,,(5%*#``*+*_/0* . `00.%10!`0+`0$!``!(!)!*0M
6SUHDGIRR="bar" FODVV1DPH="baz"!
*!`/+(10%+*`3!`*`1/!`0+`/+(2!`0$%/`,.+(!)`%/`.!0!``,.+,!.05`((! `domProps`0$0`3!
*`/,.! `/"!(5`0+`0$!`+),+*!*0`!1/!`3!`.!`!4,(%%0(5`/5%*#`0$0`%0`+*0%*/`2(%
`,.+,!.0%!/K
+.`!4),(!L`3!`*`$*#!`0$!`Spread`+),+*!*0`%*`0$!`"+((+3%*#`35M
FRQVW Spread = props => GLY {...props.GRP3URSV} !;
!`*`0$!*`1/!`%0`/`"+((+3/M
6SUHDGIRR="bar" GRP3URSV={{ FODVV1DPH: 'baz' }}!
/`3!`$2!`/!!*`)*5`0%)!/`3%0$`!0L`%0W/`(35/`#++ `,.0%!`0+`!`!4,(%%0K
6XPPDU\
*+3%*#`((`0$!`!/0`,.0%!/`%/`(35/``#++ `0$%*#L`10`/+)!0%)!/`!%*#`3.!`+"`*0%_
,00!.*/`$!(,/`1/`2+% `0'%*#`0$!`3.+*#`,0$K`+/0`%),+.0*0(5L`(!.*%*#`0$!`.!/+*/`3$5
/+)!`0!$*%-1!/`.!`+*/% !.! ` `,.0%!`$!(,/`1/`1* !./0* `$+3`!0`3+.'/L`*
$+3`3!`*`1/!`%0`!""!0%2!(5K
!`(!.*! `3$5`1/%*#`,.+,!.0%!/`0+`%*%0%(%6!`0$!`/00!`*`.!/1(0`%*`%*+*/%/0!*%!/`!03!!*
0$!`/00!`* `0$!`,.+,!.0%!/L`* `3!` %/+2!.! `3$5`)100%*#`0$!`/00!`%/` `"+.
,!."+.)*!K`!`(/+`/3`$+3`1/%*#`0$!`3.+*#`'!5`00.%10!`*`,.+ 1!` `!""!0/`+*
0$!`.!+*%(%0%+*`(#+.%0$)K`%*((5L`3!`(!.*! `3$5`/,.! %*#`*+*_/0* . `,.+,!.0%!/`0+
`!(!)!*0/`%/`+*/% !.! `*`*0%_,00!.*K
S`9>=`T
'HSOR\LQJWR3URGXFWLRQ
+3`0$0`5+1`$2!`+),(!0! `5+1.`"%./0`!0`,,(%0%+*L`%0`%/`0%)!`0+`(!.*`$+3`0+` !,(+5
%0`0+`0$!`3+.( K`+.`0$%/`,1.,+/!L`3!`3%((`1/!`0$!`(+1 `/!.2%!`((! `%#%0(`!*K
*`0$%/`$,0!.L`3!`3%((`+2!.`0$!`"+((+3%*#`0+,%/M
.!0%*#``%#%0(`!*`.+,(!0`* `+*"%#1.%*#`%0
!,(+5%*#`+1.`!0`,,(%0%+*`0+`,.+ 10%+*
+*"%#1.%*#`*#%*4L`9L`* `` +)%*
),(!)!*0%*#`%.(! `"+.`+*0%*1+1/` *0!#.0%+*
&UHDWLQJRXUILUVW'LJLWDO2FHDQ'URSOHW
`$2!`1/! `%#%0(`!*`"+.`0$!`(/0`"+1.`5!./`* ` `*`/5`0$0`%0`%/`+*!`+"`0$!`!/0`(+1
/!.2%!/` `$2!`0.%! L`*+0`&1/0`!1/!`+"`0$!`$!,`+/0/L`10`(/+`!1/!`%0`%/`/1,!.`!/5
* `"/0`0+`+*"%#1.!L`* `0$!`+))1*%05`$/``(+0`+"`1, 0! ` +1)!*00%+*`0+`"%4`)+/0`+"
0$!`+))+*`%//1!/`.!(0! `0+`0$!`/!.2!.`+*"%#1.0%+*K
$!`(0!/0``2!./%+*`+"`1*01`%/`8?K7;N`5+1`3%((`*!! `0+`'*+3`/+)!`/%`%*14
+))* /`0+`!`(!`0+`+*"%#1.!`5+1.`.+,(!0K` "`5+1W.!``!#%**!.`1/%*#`%*14L` +*W0
3+..5— W((`0.5`0+`/$+3`5+1`!$`/0!,`%*``2!.5`!/5`35K
!,(+5%*#`0+`.+ 10%+* $,0!.`8:
6LJQLQJXSWR'LJLWDO2FHDQ
"`5+1` +*W0`$2!``%#%0(`!*`+1*0L`5+1`*`/%#*`1,`0`https:/b/bcloud.
digitalocean.bcom/bregistrations/bnewK
+1`*`/%#*`1,`3%0$`5+1.` ++#(!`+1*0L`+.`5`.!#%/0!.%*#`)*1((5K`*!`5+1`.!#%/0!.
3%0$` ++#(!L`5+1`3%((`/!!`0$!`%((%*#`%*"+`2%!3L`/`"+((+3/M
S`9>?`T
!,(+5%*#`0+`.+ 10%+* $,0!.`8:
S`9>@`T
!,(+5%*#`0+`.+ 10%+* $,0!.`8:
&UHDWLQJRXUILUVW'URSOHW
!2!.0$!(!//L`3!`3%((`.!0!``*!3`.+,(!0`".+)`/.0$N`"+((+3`0$!/!`/0!,/`0+` +`/+M
8K !(!0`0$!`!3`.+,(!0`+,0%+*L`/`/$+3*`%*`0$!`"+((+3%*#`/.!!*/$+0M
S`9?7`T
!,(+5%*#`0+`.+ 10%+* $,0!.`8:
9K $++/!`1*01`8?K7;K9`4=;L`/`"+((+3/M
:K $!*L`$++/!`0$!`0* . `,(*L`/`/$+3*`$!.!M
;K +1`*`0$!*`$++/!`I<\)+`%*`0$!`,5)!*0`+,0%+*M
S`9?8`T
!,(+5%*#`0+`.+ 10%+* $,0!.`8:
=K `0$!`*)!`+"`5+1.`.+,(!0`* `0$!*`(%'`+*`0$!`.!0!`100+*L`/`"+((+3/M
S`9?9`T
!,(+5%*#`0+`.+ 10%+* $,0!.`8:
@K +3L`%*`5+1.`!.)%*(L`5+1`*`!//`0+`0$!` .+,(!0`5`1/%*#`0$!`"+((+3%*#
+))* M
VVKURRW#7+(B'523/(7B,3
S`9?:`T
!,(+5%*#`0+`.+ 10%+* $,0!.`8:
S`9?;`T
!,(+5%*#`0+`.+ 10%+* $,0!.`8:
,QVWDOOLQJ1RGHMV
+3`0$0`5+1W.!`+**!0! `0+`5+1.` .+,(!0L`(!0W/`+*"%#1.!`%0K`%./0L`3!`*!! `0+`%*/0((`0$!
(0!/0`2!./%+*`+"`+ !K&/`1/%*#``K`$!`1..!*0`2!./%+*`+"`+ !`/`0`0$!`0%)!`+"`3.%0%*#
0$%/`++'`%/`88K88K4K`+((+3`0$!/!`#%2!*`/0!,/`0+`%*/0((`+ !K&/M
9K *!`5+1`#!0`0$!`nodesource_setup.sh`"%(!L`.1*`0$!`"+((+3%*#`+))* M
VXGREDVKQRGHVRXUFHBVHWXSVK
:K $!*L`%*/0((`+ !`5`.1**%*#`0$!`"+((+3%*#`+))* M
VXGRDSWLQVWDOOQRGHMV\
&RQILJXULQJ*LWDQG*LW+XE
`.!0! ``/,!%(`.!,+/%0+.5`"+.`$!(,%*#`5+1`0+` !,(+5`5+1.`"%./0`!0`,,(%0%+*`0+
,.+ 10%+*`Qhttps:/b/bgithub.bcom/bD3vEducation/bproductionRK
S`9?<`T
!,(+5%*#`0+`.+ 10%+* $,0!.`8:
"`5+1`(!"0`5+1.`!.)%*(`%*0%2!`"+.`)+.!`0$*`"%2!`)%*10!/L`5+1.
.+,(!0`+**!0%+*`3%((`,.+(5`!`(+/! L`* `5+1`3%((`*!! `0+`+**!0
#%*K`
S`9?=`T
!,(+5%*#`0+`.+ 10%+* $,0!.`8:
+1`3%((`/!!`/+)!0$%*#`(%'!`0$%/M
S`9?>`T
!,(+5%*#`0+`.+ 10%+* $,0!.`8:
<K +3`5+1`*`(+*!`+1.`.!,+/%0+.5`Q+.`5+1./R`1/%*#`0$!`"+((+3%*#`+))* M
JLWFORQHJLW#JLWKXEFRP'Y(GXFDWLRQSURGXFWLRQJLW
=K *!`5+1`(+*!`%0`"+.`0$!`"%./0`0%)!L`5+1`3%((`#!0``)!//#!L`/'%*#`5+1`0+`((+3
0$!``'!5`"%*#!.,.%*0M
S`9??`T
!,(+5%*#`0+`.+ 10%+* $,0!.`8:
@K "`5+1`3*0`0+`0!/0`0$!`,,(%0%+*L`&1/0`.1*`0$!`start`/.%,0M
QSPVWDUW
S`9?@`T
!,(+5%*#`0+`.+ 10%+* $,0!.`8:
+1`/$+1( `/!!`9`.1**%*#L`/`/$+3*`%*`0$!`"+((+3%*#`/.!!*/$+0M
S`9@7`T
!,(+5%*#`0+`.+ 10%+* $,0!.`8:
7XUQLQJRIIRXUGURSOHW
+`01.*`+""`0$!` .+,(!0L`"+((+3`0$!/!`/0!,/M
8K "`5+1`3*0`0+`01.*`+""`5+1.` .+,(!0L`5+1`*`#+`0+`0$!`+3!.`/!0%+*L`+.`5+1`*
1/!`0$!`\`/3%0$M
S`9@8`T
!,(+5%*#`0+`.+ 10%+* $,0!.`8:
&RQILJXULQJQJLQ[30DQGDGRPDLQ
1.`.+,(!0`%/`.! 5`0+`!`1/! `"+.`,.+ 10%+*L`10`/`5+1`*`/!!L`3!`.!`/0%((`1/%*#`,+.0
:777K`!`*!! `0+`+*"%#1.!`*#%*4`* `%),(!)!*0``,.+45`0+`.! %.!0`0$!`0.""%`".+)`,+.0`?7
0+`:777N`0$%/`)!*/`3!`3+*W0`*!! `0+`/,!%"5`0$!`,+.0` %.!0(5`*5)+.!K`+ !`.+ 10%+*
.+!//`*#!.`Q9R`3%((`$!(,`1/`.1*`0$!`+ !`/!.2!.`%*`,.+ 10%+*`/!1.!(5K
!*!.((5L`%"`3!`.1*`+ !` %.!0(5`3%0$`0$!`node`+.`babel-node`+))* L`* `0$!.!`%/`*
!..+.`%*`0$!`,,L`0$!*`%0`3%((`./$`* `3%((`/0+,`3+.'%*#N`9`.!/0.0/`0$!`*+ !`/!.2!.`%"`*
!..+.`+1./K
S`9@9`T
!,(+5%*#`0+`.+ 10%+* $,0!.`8:
,QVWDOOLQJDQGFRQILJXULQJQJLQ[
+`%*/0((`*#%*4L`5+1`*!! `0+`!4!10!`0$!`"+((+3%*#`+))* M
VXGRDSWJHWXSGDWH
VXGRDSWJHWLQVWDOOQJLQ[
"0!.`5+1`$2!`%*/0((! `*#%*4L`0$!*`5+1`*`/0.0`0$!`+*"%#1.0%+*M
S`9@:`T
!,(+5%*#`0+`.+ 10%+* $,0!.`8:
:K +1`*`)*#!`0$!`*#%*4`,.+!//`3%0$`0$!/!`+))* /M
6WDUWVHUYHUVXGRV\VWHPFWOVWDUWQJLQ[
6WRSVHUYHUVXGRV\VWHPFWOVWRSQJLQ[
5HVWDUWVHUYHUVXGRV\VWHPFWOUHVWDUWQJLQ[
6HWWLQJXSDUHYHUVHSUR[\VHUYHU
/` `)!*0%+*! `,.!2%+1/(5L`3!`*!! `0+`/!0`1,``.!2!./!`,.+45`/!.2!.`0+`/!* `0$!`0.""%`".+)
,+.0`?7`Q R`0+`,+.0`:777`Q!0`,,RK`+` +`0$%/L`5+1`*!! `0+`+,!*`0$!`"+((+3%*#`"%(!M
VXGRYLHWFQJLQ[VLWHVDYDLODEOHGHIDXOW
$!`/0!,/`.!`/`"+((+3/M
9K *!`5+1`$2!`/2! `0$!`"%(!L`5+1`*`2!.%"5`3$!0$!.`0$!.!`%/``/5*04`!..+.`%*
0$!`*#%*4`+*"%#1.0%+*`3%0$`0$!`"+((+3%*#`+))* M
VXGRQJLQ[W
:K "`!2!.50$%*#`%/`"%*!L`0$!*`5+1`/$+1( `/!!`0$%/M
;K %*((5L`5+1`*!! `0+`.!/0.0`0$!`*#%*4`/!.2!.M
VXGRV\VWHPFWOUHVWDUWQJLQ[
+3L`5+1`/$+1( `!`(!`0+`!//`0$!`!0`,,(%0%+*`3%0$+10`0$!`,+.0L`/`/$+3*`%*`0$!
"+((+3%*#`/.!!*/$+0M
S`9@;`T
!,(+5%*#`0+`.+ 10%+* $,0!.`8:
$GGLQJDGRPDLQWRRXUGURSOHW
/%*#`*` `"+.``3!/%0!`%/`*+0`*%!N`3!`(35/`*!! `0+`1/!`` +)%*`0+`$!(,`1/!./`"%* `+1.
3!/%0!`!/%!.K` "`5+1`3*0`0+`1/!`` +)%*`+*`5+1.` .+,(!0L`5+1`*!! `0+`$*#!`0$!
*)!/!.2!./`+"`5+1.` +)%*`0+`,+%*0`0+`%#%0(`!*`K` `*+.)((5`1/!` + 5`0+
.!#%/0!.`)5` +)%*/K`+` +`/+`1/%*#` + 5L`"+((+3`0$!/!`/0!,/M
8K ` +`0+`https:/b/bdcc.bgodaddy.bcom/bmanage/bYOURDOMAIN.bCOM/bdnsL`* `0$!*`#+`0+
0$!`)!/!.2!./`/!0%+*M
S`9@<`T
!,(+5%*#`0+`.+ 10%+* $,0!.`8:
9K (%'`+*`0$!`$*#!`100+*L`/!(!0`1/0+)L`* `0$!*`/,!%"5`0$!`%#%0(`!*
M
S`9@=`T
!,(+5%*#`0+`.+ 10%+* $,0!.`8:
:K +.)((5L`0$%/`0'!/`!03!!*`8<`* `:7`)%*10!/`"+.`0$!``$*#!/`0+`!
.!"(!0! N`"+.`*+3L`"0!.`5+1`$2!`1, 0! `5+1.`)!/!.2!./L`#+`0+`5+1.` .+,(!0
/$+. L`* `0$!*`$++/!`0$!` `` +)%*`+,0%+*M
S`9@>`T
!,(+5%*#`0+`.+ 10%+* $,0!.`8:
+3L`5+1`$2!`0+`.!0!``*!3`.!+. `"+.`K`!(!0`0$!``0L`%*`0$!
`3.%0!`wwwL`%*`0$!`(%/`"%!( `3.%0!`@L`* `5` !"1(0L`0$!``%/`43200N`0$%/`%/
0+`!*(!`!//`0+`5+1.` +)%*`1/%*#`0$!`www`,.!"%4M
S`9@?`T
!,(+5%*#`0+`.+ 10%+* $,0!.`8:
,PSOHPHQWLQJ&LUFOH&,IRUFRQWLQXRXV
LQWHJUDWLRQ
W2!`!!*`1/%*#`%.(! `"+.``3$%(!`* ` `*`0!((`5+1`0$0`%0`%/`+*!`+"`0$!`!/0` `/+(10%+*/M`%0
%/`".!!`"+.`,!./+*(`1/!L`#%2%*#`5+1`1*(%)%0! `.!,+/%0+.%!/`* `1/!./L`5+1`$2!`8L777`1%( /
)%*10!/`,!.`)+*0$L`+*!`+*0%*!.L`* `+*!`+*1..!*0`&+N`%"`5+1`*!! `)+.!L`5+1`*
1,#. !`0$!`,(*`3%0$`*`%*%0%(`,.%!`+"`I<7`,!.`)+*0$K
S`9@@`T
!,(+5%*#`0+`.+ 10%+* $,0!.`8:
S`:77`T
!,(+5%*#`0+`.+ 10%+* $,0!.`8:
$GGLQJDQ66+NH\WR&LUFOH&,
+3`0$0`5+1`$2!`.!0! `5+1.`+1*0L`%.(! `*!! /``35`0+`(+#`%*`0+`5+1.`%#%0(
!*` .+,(!0`0+`.1*`0$!` !,(+5`/.%,0K`+((+3`0$!/!`/0!,/`0+`+),(!0!`0$%/`0/'M
9K "0!.`0$0L`(!0W/` `0$!`'!5`0+`+1.`autorhized_keysM
FDWLGBUVDBGURSOHWSXE!!DXWKRUL]HGBNH\V
8K +,5`0$!`+*0!*0`+"`5+1.`id_rsa_droplet.pub`'!5`* `0$!*`#+`0+`5+1.
.!,+/%0+.5`/!00%*#/`Q0$!`#!.`%+*`*!40`0+`0$!`*)!`+"`5+1.`.!,+/%0+.5RM
S`:78`T
!,(+5%*#`0+`.+ 10%+* $,0!.`8:
9K $!*L`#+`0+` `!.)%//%+*/L`/`"+((+3/M
:K +1`*`(/+`!//`+*`0$!
`https://circleci.com/gh/<285B*,7B86(5/<285B5(326,725</edit#sshL
* `0$!*`(%'`+*`0$!` ` ` !5`100+*M
;K /0!`5+1.`,.%20!`'!5L`* `0$!*`,10``*)!`0+`0$!`$+/0*)!N`3!`3%((`*)!`%0
%#%0(`!*`.+,(!0K
S`:79`T
!,(+5%*#`0+`.+ 10%+* $,0!.`8:
&RQILJXULQJ&LUFOH&,
+3`0$0`5+1`$2!`+*"%#1.! `0$!`%.(! `!//`0+`5+1.` .+,(!0L`5+1`*!! `0+` `
config`"%(!`0+`5+1.`,.+&!0`0+`/,!%"5`0$!`&+/`5+1`3*0`0+`!4!10!`"+.`0$!` !,(+5)!*0
,.+!//K`$%/`,.+!//`%/`/$+3*`%*`0$!`"+((+3%*#`/0!,/M
S`:7:`T
!,(+5%*#`0+`.+ 10%+* $,0!.`8:
<K *`0$%/`(+'L`3!`.!`/,!%"5%*#`0$0`3!`3%((`1/!`+*(5`0$!`master`.*$`+"`0$!
.!,+/%0+.5K`"`+1./!L`5+1`*`$*#!`%0`"+.`*5`.*$`5+1`3*0`0+` !,(+5M
ZRUNLQJBGLUHFWRU\: ~/tmp
=K $!`working_directory`3%((`!`0$!`0!),+.(` %.!0+.5`3!`3%((`1/!`0+`%*/0((
0$!``,'#!/`* `.1*`+1.` !,(+5`/.%,0/K` *`0$%/`/!L` ` !% ! `0+`1/!`0$!
tmp` %.!0+.5L`/`"+((+3/M
GRFNHU:
- LPDJH: circleci/node:10
VWHSV:
- FKHFNRXW
- UXQ: npm install
- UXQ: npm run lint
- UXQ: npm test
- UXQ: ssh -o 6WULFW+RVW.H\&KHFNLQJ=no '523/(7B86(5@'523/(7B,3
'cd production; git checkout master; git pull; npm install; npm run
start:production;'
+.`+ !`/!L`0$!`$!'+10`%/``/%),(!`#%0`$!'+10`0+`)/0!.L`0$!*`+*`!$`.1*`/!*0!*!L
5+1`*!! `0+`/,!%"5`0$!`/.%,0/`5+1`3*0`0+`.1*K`+((+3`0$!/!`/0!,/M
S`:7;`T
!,(+5%*#`0+`.+ 10%+* $,0!.`8:
&UHDWLQJ(19YDULDEOHVLQ&LUFOH&,
/`5+1`/3`,.!2%+1/(5L`3!`.!`1/%*#`0$!`$DROPLET_USER`* `$DROPLET_IP`2.%(!/L`10
+`3!` !"%*!`0$+/!O`+((+3`0$!/!`/0!,/M
S`:7<`T
!,(+5%*#`0+`.+ 10%+* $,0!.`8:
S`:7=`T
!,(+5%*#`0+`.+ 10%+* $,0!.`8:
S`:7>`T
!,(+5%*#`0+`.+ 10%+* $,0!.`8:
S`:7?`T
!,(+5%*#`0+`.+ 10%+* $,0!.`8:
?K +3L`(!0W/`/1,,+/!`5+1`$2!`*`!..+.`+*`5+1.`(%*0!.`2(% 0%+*`+.`%*`/+)!`1*%0
0!/0/K`!0W/`/!!`3$0`$,,!*`%*`0$0`/!L`/`"+((+3/M
S`:7@`T
!,(+5%*#`0+`.+ 10%+* $,0!.`8:
S`:87`T
!,(+5%*#`0+`.+ 10%+* $,0!.`8:
6XPPDU\
$!`&+1.*!5`0$.+1#$`0$!` !,(+5)!*0`,.+!//`$/`+)!`0+`*`!* L`* `*+3`5+1`'*+3`$+3
0+` !,(+5`5+1.`!0`,,(%0%+*`0+`0$!`3+.( `Q,.+ 10%+*RL`* `(/+`$+3`0+`%),(!)!*0
%.(! `"+.`+*0%*1+1/`%*0!#.0%+*K
*`0$!`*!40`$,0!.L`3!`3%((`(!.*`$+3`0+`,1(%/$`*,)`,'#!/K
S`:88`T
1H[W6WHSV
!0`%/`+*!`+"`0$!`)+/0`)6%*#`(%..%!/`0$0`$/`!!*`.!(!/! `%*`0$!`(/0`"!3`5!./L`*+0
+*(5`!1/!`+"`0$!`(%..5`%0/!("`* `%0/`#.!0`"!01.!/`10L`)+/0`%),+.0*0(5L` 1!`0+`0$!
!+/5/0!)`0$0`$/`!!*`1%(0`.+1* `%0K
+((+3%*#`0$!`!0`+))1*%05`%/`2!.5`!4%0%*#`* `%*/,%.%*#N`0$!.!`.!`*!3`,.+&!0/`*
0++(/`0+`(!.*`* `,(5`3%0$`!2!.5`/%*#(!` 5K`+0`&1/0`0$0L`0$!.!`.!`+*"!.!*!/`*
)!!01,/`3$!.!`5+1`*`0('`0+`,!+,(!`%*`.!(`(%"!`* `1%( `*!3`.!(0%+*/$%,/L`(+#`,+/0/
0$0`5+1`*`.! `0+`%),.+2!`5+1.`/'%((/`* `(!.*`)+.!L`* `)*5`+0$!.`35/`0+`!+)!`
!00!.` !2!(+,!.K
*`0$%/`$,0!.L`3!`3%((`+2!.`0$!`"+((+3%*#``0+,%/M
+3`0+`+*0.%10!`0+`0$!`!0`(%..5`5`+,!*%*#`%//1!/`* `,1((`.!-1!/0/
$5`%0`%/`%),+.0*0`0+`#%2!`'`0+`0$!`+))1*%05`* `/$.!`5+1.`+ !
$!`)+/0`%),+.0*0`/,!0/`0+`'!!,`%*`)%* `3$!*`,1/$%*#`+,!*`/+1.!`+ !
+3`0+`,1(%/$`*`*,)`,'#!`* `$+3`0+`1/!`/!)*0%`2!./%+*%*#
&RQWULEXWLQJWR5HDFW
*!`0$%*#`0$0`,!+,(!`+"0!*`3*0`0+` +`3$!*`0$!5W2!`1/! `!0`"+.``3$%(!`%/`+*0.%10!`0+
0$!`(%..5K`!0`%/`+,!*`/+1.!L`3$%$`)!*/`0$0`%0/`/+1.!`+ !`%/`,1(%`* `*5+*!
3$+W/`/%#*! `0$!`+*0.%10+.`%!*/!`#.!!)!*0`QR`*`$!(,`0+`"%4`1#/L`3.%0!
+1)!*00%+*L`+.`!2!*` `*!3`"!01.!/K
+1`*`.! `0$!`"1((`0!.)/`+"`0$!``0`0$!`"+((+3%*#`M`https:/b/bcode.bfacebook.bcom/
claK
!40`0!,/ $,0!.`8;
/`5+1W((`/!!L`0$!`%//1!`+)!/`3%0$`/+)!`,.!_"%((! `%*/0.10%+*/L`3%0$`+*!`+"`0$+/!`!%*#`0+
/!0`1,`0$!`)%*%)(` !)+K`$!`+0$!.`-1!/0%+*/`$!(,`5+1`0+`!4,(%*`0$!`,.+(!)L`* `0+
!/.%!`1..!*0`* `!4,!0! `!$2%+./K
*!`0$!`%//1!`%/`"%(! L`5+1`$2!`0+`3%0`"+.`+*!`+"`0$!`+.!`+*0.%10+./`0+`!4)%*!`%0`*
0!((`5+1`3$0`0$!5W2!` !% ! `0+` +`3%0$`0$!`1#K`!,!* %*#`+*`0$!`/!2!.%05`+"`%0L`0$!5
)%#$0`"%4`%0L`+.`/'`5+1`0+`"%4`%0K
$%/`%/``#.!0`35`0+`/0.0`+*0.%10%*#`* `%0`%/`"*0/0%`0$0`0$!`!0`0!)`#%2!/
!2!.5+*!L`!/,!%((5`*!3`+*0.%10+./L`0$!`,+//%%(%05`+"`!%*#`,.0`+"`0$!`,.+&!0K
S`:8:`T
!40`0!,/ $,0!.`8;
'LVWULEXWLQJ\RXUFRGH
+*0.%10%*#`0+`0$!`!0`!+/5/0!)` +!/`*+0`+*(5`)!*`,1/$%*#`+ !`%*0+`0$!`!0
.!,+/%0+.5K`+`#%2!`'`0+`0$!`+))1*%05`* `$!(,` !2!(+,!./L`5+1`*`.!0!`,'#!/L
(+#`,+/0/L`*/3!.`-1!/0%+*/`+*`0'`2!."(+3L`* `,!."+.)`)*5`+0$!.`0%2%0%!/K
1,,+/!L`"+.`!4),(!L`5+1`.!0! ``!0`+),+*!*0`0$0`/+(2!/``+),(!4`,.+(!)L`*
5+1`0$%*'`0$0`+0$!.` !2!(+,!./`3+1( `!*!"%0`".+)`1/%*#`%0`%*/0! `+"`%*2!/0%*#`0%)!`%*
1%( %*#`0$!%.`/+(10%+*/K`$!`!/0`0$%*#`0+` +`%/`0+`,1(%/$`%0` %0 1`* `)'!`%0`2%((!
"+.`!2!.5+*!`0+`.! `* `1/!K` +3!2!.L`,1/$%*#`0$!`+ !`0+` %0 1`%/`+*(5``/)((`0%+*
3%0$%*``%#`,.+!//L`* `%0`+)!/`3%0$`/+)!`.!/,+*/%%(%0%!/K`+L`5+1`/$+1( `$2!``(!.
% !`%*`)%* `+10`0$!`.!/+*/`!$%* `5+1.`$+%!K
S`:8;`T
!40`0!,/ $,0!.`8;
*+0$!.`/%#*%"%*0`+,,+.01*%05`0$0`+,!*`/+1.!`*`#%2!`5+1`%/`(!00%*#`5+1`#!0`%*`0+1$
3%0$`/).0`* `,//%+*0!` !2!(+,!./`".+)`((`.+1* `0$!`3+.( K`+.'%*#`(+/!(5`3%0$
*!3`,!+,(!`3$+`$2!` %""!.!*0`'#.+1* /`* `/'%((`/!0/`%/`+*!`+"`0$!`!/0`35/`0+`'!!,
+1.`)%* /`+,!*`* `%),.+2!`+1./!(2!/K
%*0%*%*#``.!,+/%0+.5`.!-1%.!/`+))%0)!*0`!1/!`0$!`)+.!`,+,1(.`%0`#!0/`* `0$!
)+.!`,!+,(!`1/!`%0L`0$!`$%#$!.`0$!`*1)!.`+"`-1!/0%+*/`* `%//1!/K`+.`!4),(!L` !2!(+,!./
)5`!*+1*0!.`1#/`* `+,!*`%//1!/L`/+`5+1`$2!`0+`#+`0$.+1#$`((`+"`0$!)`* `0.5`0+
.!,.+ 1!`0$!`,.+(!)/K` "`0$!`,.+(!)/`!4%/0L`0$!*`5+1`$2!`0+`3.%0!`0$!`"%4`* `,1(%/$`
*!3`2!./%+*`+"`0$!`(%..5K`+1`+1( `.!!%2!`,1((`.!-1!/0/`".+)` !2!(+,!./L`3$%$`+1( `!
(+*#`* `+),(!4L`* `0$!5`*!! `0+`!`.!2%!3! K
%./0`+"`((L`%"`5+1`3*0`0+`,1(%/$`5+1.`!0`+),+*!*0L`5+1`$2!`0+`3.%0!`
+),.!$!*/%2!`/!0`+"`0!/0/K`%0$`,1(%`+ !`* `)*5`,!+,(!`+*0.%10%*#`0+`%0L`0!/0/`.!
2!.5`$!(,"1(`"+.`)*5`.!/+*/M
$!5`)'!`0$!`+ !`)+.!`.+1/0
$!5`$!(,`+0$!.` !2!(+,!./`1* !./0* `3$0`0$!`+ !` +!/
$!5`)'!`%0`!/%!.`0+`"%* `.!#.!//%+*`3$!*`*!3`+ !`%/` !
$!5`)'!`+0$!.`+*0.%10+./`)+.!`+*"% !*0`%*`3.%0%*#`0$!`+ !
S`:8<`T
!40`0!,/ $,0!.`8;
0`%/`(/+`!//!*0%(`0+` ``LICENSE`"%(!`0+`5+1.`.!,+/%0+.5`0+`)'!`,!+,(!`3.!`+"`3$0
0$!5`*`* `**+0` +`3%0$`5+1.`+ !K` %0 1`$/``(+0`+"`.! 5_) !`0!),(0!/`0+
$++/!`".+)K
+`/$+3`0$0`5+1.`+),+*!*0`%/`$%#$(5`1/0+)%6(!L`5+1`*` `+*!`+.`)+.!`!4),(!/`0+
0$!`.!,+/%0+.5`0+`)'!`%0`!/5`"+.`!2!.5+*!`0+`1* !./0* `$+3`%0`3+.'/`* `3$%$`,.+,/`%0
!,0/K`4),(!/`.!`(/+`1/!"1(`/+`0$0`5+1`*`0!/0`*!3`2!./%+*/`+"`0$!`+),+*!*0`*
/!!`%"`0$!.!`.!`1*!4,!0! `.!'%*#`$*#!/K
/`3!`/3`%*`Chapter 3L`.!0!`.1(5`!1/(!`+),+*!*0/L`0++(/`/1$`/`!0
0+.5++'`*`$!(,`5+1`.!0!`(%2%*#`/05(!`#1% !/L`3$%$`.!`!/%!.`"+.`5+1`0+`)%*0%*L`*
"+.`0$!`+*/1)!.`+"`5+1.`,'#!`0+`*2%#0!`* `1/!K
*`!4!((!*0`!4),(!`+"``$%#$(5`1/0+)%6(!`(%..5`0$0`1/!/`0+.5++'`0+`/$+3`((`0$!/!
2.%0%+*/`%/`react-dates`".+)`%.*K`+1`/$+1( `0'!`0$0`.!,+/%0+.5`/`0$!`,!."!0
!4),(!`+"`$+3`0+`,1(%/$`!0`+),+*!*0/`0+` %0 1K
S`:8=`T
!40`0!,/ $,0!.`8;
/`5+1`*`/!!L`0$!5`1/!`0+.5++'`0+`/$+3`0$!` %""!.!*0`+,0%+*/`+"`0$!`+),+*!*0M
/0`10`*+0`(!/0L`5+1`)%#$0`*+0`+*(5`3*0`0+`/$.!`5+1.`+ !—5+1`)5`(/+`3*0`0+
%/0.%10!`5+1.`,'#!K`$!`)+/0`,+,1(.`,'#!`)*#!.`"+.` 2.%,0`%/`npmL`3$%$
3!W2!`1/! `0$.+1#$+10`0$%/`++'`0+`%*/0((`,'#!/`* ` !,!* !*%!/K
*`0$!`*!40`/!0%+*L`3!`3%((`/!!`$+3`!/5`%0`%/`0+`,1(%/$``*!3`,'#!`3%0$`npmK
/`3!`/3`%*`Chapter 1L`'%*#`+1.`%./0`0!,/`3%0$`!0L`5+1`*`!/%(5`1/!`!0`5`&1/0
%*#``/.%,0`0#`,+%*0%*#`0+`unpkg.comK` 0`%/`%),+.0*0`0+`#%2!`0$!`1/!./`+"`5+1.`(%..5
0$!`/)!`+,0%+*K
S`:8>`T
!40`0!,/ $,0!.`8;
3XEOLVKLQJDQQSPSDFNDJH
$!`)+/0`,+,1(.`35`+"`)'%*#``,'#!`2%((!`0+` !2!(+,!./`%/`5`,1(%/$%*#`%0
0+`npmL`0$!`,'#!`)*#!.`"+.`+ !K&/K
%*((5L`0$!`"%./0`*1)!.`+*`0$!`(!"0`.!,.!/!*0/`0$!`)&+.`2!./%+*L`* `%0`$/`0+`!`%*.!/!
3$!*``2!./%+*`+*0%*%*#`.!'%*#`$*#!/`%/`.!(!/! `0+`0$!`,1(%K
$!`"%./0`2!./%+*`+"``,'#!`%/`1/1((5`0.1.0K
+`,1(%/$`*`npm`,'#!L`5+1`)1/0`$2!`*`npm`+1*0L`3$%$`5+1`*`!/%(5`.!0!`5
.1**%*#`0$!`"+((+3%*#`+))* `%*`0$!`+*/+(!L`3$!.!`$username`%/`0$!`*)!`+"`5+1.
$+%!M
QSPDGGXVHUXVHUQDPH
*!`0$!`1/!.`%/`.!0! L`5+1`*`.1*`0$!`"+((+3%*#`+))* M
QSPSXEOLVK
S`:8?`T
!40`0!,/ $,0!.`8;
$!*!2!.`5+1`$*#!`/+)!0$%*#`%*`5+1.`(%..5`* `5+1`3*0`0+`,1/$``*!3`2!./%+*L`5+1
&1/0`$2!`0+`.1*`$typeL`3$!.!`+*!`,0$`%/`)%*+.`+.`)&+.M
QSPYHUVLRQW\SH
6XPPDU\
*`0$!`(/0`/0+,`+*`0$%/`0.%,`.+1* `0$!`!0`3+.( L`3!`$2!`/!!*`/+)!`+"`0$!`/,!0/`0$0
)'!`!0`#.!0—%0/`+))1*%05`* `%0/`!+/5/0!)L`* `$+3`0+`+*0.%10!`0+`0$!)K
%*((5L`5+1`/3`$+3`!/5`%0`%/`0+`,1(%/$`,'#!/`+*`0$!`npm`.!#%/0.5L`* `$+3`0+`$++/!
0$!`.%#$0`2!./%+*`*1)!.`0+`2+% `.!'%*#`+0$!.`,!+,(!W/`+ !K
S`:8@`T
2WKHU%RRNV<RX0D\(QMR\
"`5+1`!*&+5! `0$%/`++'L`5+1`)5`!`%*0!.!/0! `%*`0$!/!`+0$!.`++'/`5`'0M
1((_0'`!0`.+&!0/
$)` +-1!
M`@>?8>???:<<:;
!0`1,`5+1.` !2!(+,)!*0`!*2%.+*)!*0`* ` !2!(+,```,,(%0%+*
),(!)!*0`1/!.`10$!*0%0%+*`* `10$+.%60%+*`1/%*#` `!`+'!*/
1%( ``/+%(`)! %`,,(%0%+*`5`!40!* %*#`0$!`/%``,,(%0%+*
.!0!`*`+*(%*!`).'!0,(!`,,(%0%+*`3%0$`/$+,,%*#`.0`* `0.%,!
,5)!*0/
!2!(+,``)! %`/0.!)%*#`,,(%0%+*`1/%*#`+*#+` .%
),(!)!*0`/!.2!._/% !`.!* !.%*#`3%0$` 0`0+`%),.+2!`
!0`1,`* `1/!`!0`:=7`0+` !2!(+,`1/!.`%*0!."!/`3%0$``,%(%0%!/
!.*`%* 1/0.5`!/0`,.0%!/`0+`)'!``/0'`,,(%0%+*/`.!(%(!`*
/((!
0$!.`++'/`+1`5`*&+5
S`:98`T
0$!.`++'/`+1`5`*&+5
/HDYHDUHYLHZOHWRWKHUUHDGHUVNQRZZKDW
\RXWKLQN
(!/!`/$.!`5+1.`0$+1#$0/`+*`0$%/`++'`3%0$`+0$!./`5`(!2%*#``.!2%!3`+*`0$!`/%0!`0$0`5+1
+1#$0`%0`".+)K` "`5+1`,1.$/! `0$!`++'`".+)`)6+*L`,(!/!`(!2!`1/`*`$+*!/0`.!2%!3
+*`0$%/`++'W/`)6+*`,#!K`$%/`%/`2%0(`/+`0$0`+0$!.`,+0!*0%(`.! !./`*`/!!`* `1/!
5+1.`1*%/! `+,%*%+*`0+`)'!`,1.$/%*#` !%/%+*/L`3!`*`1* !./0* `3$0`+1.
1/0+)!./`0$%*'`+10`+1.`,.+ 10/L`* `+1.`10$+./`*`/!!`5+1.`"!! '`+*`0$!`0%0(!`0$0
0$!5`$2!`3+.'! `3%0$`'0`0+`.!0!K` 0`3%((`+*(5`0'!``"!3`)%*10!/`+"`5+1.`0%)!L`10`%/
2(1(!`0+`+0$!.`,+0!*0%(`1/0+)!./L`+1.`10$+./L`* `'0K`$*'`5+1P
S`:99`T
,QGH[
FRPPXQLFDWLQJ90
$ FRPSRVLWLRQ52179
$LUEQE5HDFW-6;VW\OHJXLGH FRQGLWLRQDOV32
LPSOHPHQWLQJ4748 FRQWDLQHUFRPSRQHQWV98
DQLPDWLRQV FRQWDLQHUSDWWHUQ9397
DERXW151 FRQWH[W108109
FUHDWLQJ151152 &RQWH[W$3,
5HDFWPRWLRQ153 XVLQJ129130131132
$WRPLF&66PRGXOHV180181 FRQWLQXRXVLQWHJUDWLRQ
&LUFOH&,LPSOHPHQWLQJIRU300
% &RQWULEXWRU/LFHQVH$JUHHPHQW &/$
%DEHO21 DERXW312
%DEHO21 UHIHUHQFH312
%DEHOSOXJLQV231 FRQWUROOHGFRPSRQHQWV140141142
%LJ3LFWXUH*LW+XE FUHDWH&ODVVIDFWRU\56
UHIHUHQFH314 &66PRGXOHV
%ORFN(OHPHQW0RGLILHU %(0 PHWKRGRORJ\160 DERXW170
$WRPLF&66PRGXOHV180181
& ORFDOO\VFRSHG&66175177179180
FDPHO&DVHG26 SURMHFWVHWWLQJXS171172174
FKLOGSDUHQWFRPPXQLFDWLRQ 5HDFW&66PRGXOHV182183
ZLWKFDOOEDFNV115116 &66
FKLOGUHQ LQ-DYD6FULSW160161
DERXW91 FXUU\LQJ51
XVHGIRUFRPPXQLFDWLRQEHWZHHQFRPSRQHQWV
919293 '
&LUFOH&, GDWDIHWFKLQJ
FRQILJXULQJ303304 DERXW118119120121122123
(19YDULDEOHVFUHDWLQJLQ305306308309 H[DPSOH200201203
LPSOHPHQWLQJIRUFRQWLQXRXVLQWHJUDWLRQ299 GDWDIORZ
66+NH\DGGLQJWR301302 DERXW114115
FODVVHV FKLOGSDUHQWFRPPXQLFDWLRQ FDOOEDFNV 115116
FUHDWLQJ56 WKURXJKFRPPRQSDUHQW117
FRGHVW\OH40 GHDGFRGHHOLPLQDWLRQ161
FRGH GHFODUDWLYHSURJUDPPLQJ1011
GLVWULEXWLQJ314315316317 'HYHORSHU([SHULHQFH '; 17
FRPSRQHQWV 'LJLWDO2FHDQ'URSOHW
FUHDWLQJ277 ILUVWFODVVREMHFWV49
'LJLWDO2FHDQ IRUPV
DERXW277 DERXW135
UHIHUHQFHIRUUHJLVWUDWLRQ278 FRQWUROOHGFRPSRQHQWV140141
VLJQLQJXSRQ278279 -621VFKHPD142143144
'RFXPHQW2EMHFW0RGHO '20 9 XQFRQWUROOHGFRPSRQHQWV135136137139
'20HOHPHQWV IUDJPHQWV8687
SURSHUWLHVVSUHDGLQJRQ275276 )XQFWLRQDO&66180
'RPDLQ6SHFLILF/DQJXDJH '6/ 14 IXQFWLRQDOSURJUDPPLQJ )3
GRPDLQ EDVLFV49
DGGLQJWRGURSOHW295297298 FRPSRVLWLRQ52
'RQ W5HSHDW<RXUVHOI '5< 84 FXUU\LQJ51
GURSOHW ILUVWFODVVREMHFWV49
FUHDWLQJ280281282283 LPPXWDELOLW\50
GRPDLQDGGLQJWR295297298299 SXULW\50
WXUQLQJRII291 XVHULQWHUIDFHV52
)XQFWLRQ$V&KLOGFRPSRQHQW110111
(
HGJHFDVHV236 *
(GLWRU&RQILJ JLVWV118
DERXW40 *LW
FRQILJXULQJ40 FRQILJXULQJ285
UHIHUHQFH40 *LW+XE
(19YDULDEOHV FRQILJXULQJ287
FUHDWLQJLQ&LUFOH&,305306308309310
(6/LQWUXOHV +
UHIHUHQFH48 KLJKHURUGHUFRPSRQHQWV +R&V 36102103
(6/LQW 105
DERXW41 KLJKHURUGHUIXQFWLRQV +R)V 49102
FRQILJXULQJ4243 +70/YHUVXV-6;
*LWKRRNV4445 DERXW25
LQVWDOOLQJ41 DWWULEXWHV26
5HDFWSOXJLQ454647 %RROHDQDWWULEXWHV29
HYHQWEXEEOLQJ147 URRW2627
HYHQWGHOHJDWLRQ147 VSDFHV28
HYHQWVZLWFK VW\OH26
UHIHUHQFH146
HYHQWV ,
KDQGOLQJ144145146 LPPXWDELOLW\50230231
WHVWLQJ242243245 LPPXWDEOHGDWD230
([SUHVV189 LQGH[HV
XVLQJDVNH\272273274
) LQOLQHVW\OHV162163164166
)DFHERRN&RGHRI&RQGXFW LVRPRUSKLFDSSOLFDWLRQ189
UHIHUHQFH313 LVVXHVWDJJHGZLWKJRRGILUVWLVVXH
S`:9;`T
UHIHUHQFH313
1
- 1H[WMV204205
QJLQ[
-DYD6FULSWIDWLJXH16203
FRQILJXULQJ293
-DYD6FULSWWHPSODWLQJ30
LQVWDOOLQJ293
-HVW
1RGH3URGXFWLRQ3URFHVV0DQDJHU 30 292
DERXW234
1RGHMV
SDLQOHVV-DYD6FULSWWHVWLQJ236237238240
241 LQVWDOOLQJ285
-6;YHUVXV+70/ QSPSDFNDJH
DERXW25 SXEOLVKLQJ318
DWWULEXWHV26
%RROHDQDWWULEXWHV29 2
URRW2627 RSWLPL]DWLRQWHFKQLTXHV
VSDFHV28 DERXW211
VW\OH26 VKRXOG&RPSRQHQW8SGDWH213214215
-6; VWDWHOHVVIXQFWLRQDOFRPSRQHQWV216
DERXW2021 RZQHU90
FKLOGUHQ2425
'20HOHPHQWV24 3
+HOOR:RUOGSURJUDP23 SDLQOHVV-DYD6FULSWWHVWLQJ
SDWWHUQV30 ZLWK-HVW236237238240241
SURSV24 SDUDPHWHUV
5HDFWFRPSRQHQWV23 DGGLQJWRURXWHV255256258260262263
VSUHDGDWWULEXWHV29 264
SDWWHUQV-6;
. FRQGLWLRQDOV32333536
NH\V FRQWUROVWDWHPHQWV3738
DERXW210211 ORRSV37
LQGH[HVXVLQJDV272273274 PXOWLOLQH31
PXOWLSURSHUWLHV32
/ VXEUHQGHULQJ3940
SUHVHQWDWLRQDOFRPSRQHQW9598
OLQWHUV39
SUHVHQWDWLRQDOSDWWHUQ9397
ORFDOO\VFRSHG&66175177179180
SURSW\SHV7778
0 SURSHUWLHV
VSUHDGLQJRQ'20HOHPHQWV275276
PL[LQV XVHGIRULQLWLDOL]LQJVWDWH266267268269
DERXW98
ZRUNLQJZLWK99100
0RE;70
5
5DGLXP
PRGXOHEXQGOHUV171
ZRUNLQJ166167168170
PRWLRQFRPSRQHQW154
UHUHQGHULQJLVVXHVVROXWLRQV
0XVWDFKH14
DERXW216
FRQVWDQWSURSV222223224
S`:9<`T
IXQFWLRQVFUHDWLQJLQVLGHUHQGHUPHWKRG219 263264
220222
JRRGGHVLJQ224226228230 6
QRXSGDWHIRUFRPSRQHQWV217218 6FDODEOH9HFWRU*UDSKLFV 69* 155156
UHIDFWRULQJ224226227229 VHDUFKHQJLQHRSWLPL]DWLRQ 6(2 190
5HDFWFRQVWDQWHOHPHQWVWUDQVIRUPHU231 VHFWLRQV
5HDFW&66PRGXOHV182183 FUHDWLQJ249250251252253254255
5HDFW'HY7RROV 6HPDQWLF9HUVLRQLQJ 6HP9HU 318
XVLQJ245 VHUYHUVLGHDSSOLFDWLRQ
5HDFW'RFJHQ80 FUHDWLQJ193194195196198199
5HDFWKRRNV76 VHUYHUVLGHUHQGHULQJ 665
5HDFWLQOLQHHOHPHQWVWUDQVIRUP232 DERXW189
5HDFWPRWLRQ154 LPSOHPHQWDWLRQUHDVRQV190191192193
5HDFW5RXWHU VLQJOHHYHQWKDQGOHU145
DERXW248 VLQJOHJOREDOKDQGOHU147
FRQILJXULQJ249 VSUHDGDWWULEXWHRSHUDWRU29
LQVWDOOLQJ249 VSULQJIXQFWLRQ154
5HDFW6WRU\ERRN316 66+NH\
UHDFWPRWLRQOLEUDU\134 DGGLQJWR&LUFOH&,301302
UHDFWUHIHWFK VWDWH
ZRUNLQJ123125126127128129 DERXW70
5HDFW&RPSRQHQW DV\QFKURQRXV72
DXWRELQGLQJ606162 GHFODULQJ71
H[WHQGLQJ57 GHULYDEOHV74
SURSV5758 H[WHUQDOOLEUDULHV70
VWDWH5960 LQLWLDOL]LQJSURSHUWLHVXVHG266267268269
5HDFWMV PXWDWLQJ269270271272
UHIHUHQFH21 UHQGHUPHWKRG75
5HDFW XVLQJ73
DERXW248 VWDWHOHVVFRPSRQHQWV
FRQWULEXWLQJWR312 DERXW62
HOHPHQWV12 HYHQWKDQGOHUV64
UHFRPSRVHOLEUDU\ OD\RXWFRPSRQHQWV65666769
XVLQJ105106107 OLIHF\FOH64
UHFRQFLOLDWLRQ13209210 RSWLPL]DWLRQ65
5HGX[70 SURSV63
5HGX['HY7RROV UHIV64
XVLQJ246 VWDWH64
5HIV147148149150 WKLVNH\ZRUG64
5HVSRQVLYH0L[LQ101 VWDWHOHVVIXQFWLRQ55
UHXVDEOHFRPSRQHQWV82838690 VW\OHGFRPSRQHQWV184185186
UHYHUVHSUR[\VHUYHU
VHWWLQJXS294 7
URXWHV
WDJJHGWHPSODWHOLWHUDOV184
SDUDPHWHUVDGGLQJWR255256258260262
7HVWGULYHQGHYHORSPHQW 7'' 236
S`:9=`T
WHVWLQJ
EHQHILWV235 9
WKHPLQJ186 9LVXDO6WXGLR&RGH 96& 44
8 :
XQFRQWUROOHGFRPSRQHQWV134135136137 :HESDFN
XQLYHUVDODSSOLFDWLRQV189 XVLQJ171
8QLYHUVDO0RGXOH'HILQLWLRQ 80' 317