Full Stack React TOC
Full Stack React TOC
Book Revision . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
Updated January 13th, 2020 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
Join our Official Community Discord . . . . . . . . . . . . . . . . . . . . . . 1
Bug Reports . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
Be notified of updates via Twitter . . . . . . . . . . . . . . . . . . . . . . . . . 1
We’d love to hear from you! . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
Foreword . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
Part I . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
Your first React Web Application . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
Building Product Hunt . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
Setting up your development environment . . . . . . . . . . . . . . . . . . . 9
Code editor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
Node.js and npm . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
Install Git . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
CONTENTS
Browser . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
Special instruction for Windows users . . . . . . . . . . . . . . . . . . . . . . 11
Ensure IIS is installed . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
JavaScript ES6/ES7 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
Getting started . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
Sample Code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
Previewing the application . . . . . . . . . . . . . . . . . . . . . . . . . . 12
Prepare the app . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
What’s a component? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
Our first component . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
JSX . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
The developer console . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
Babel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
ReactDOM.render() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
Building Product . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
Making Product data-driven . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
The data model . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
Using props . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
Rendering multiple products . . . . . . . . . . . . . . . . . . . . . . . . . 39
React the vote (your app’s first interaction) . . . . . . . . . . . . . . . . . . . 44
Propagating the event . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
Binding custom component methods . . . . . . . . . . . . . . . . . . . . 48
Using state . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52
Setting state with this.setState() . . . . . . . . . . . . . . . . . . . . . 54
Updating state and immutability . . . . . . . . . . . . . . . . . . . . . . . . . 56
Refactoring with the Babel plugin transform-class-properties . . . . . . 63
Babel plugins and presets . . . . . . . . . . . . . . . . . . . . . . . . . . . 63
Property initializers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65
Refactoring Product . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65
Refactoring ProductList . . . . . . . . . . . . . . . . . . . . . . . . . . . 67
Congratulations! . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69
Components . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70
A time-logging app . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70
Getting started . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71
Previewing the app . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71
CONTENTS
ReactElement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 164
Experimenting with ReactElement . . . . . . . . . . . . . . . . . . . . . 165
Rendering Our ReactElement . . . . . . . . . . . . . . . . . . . . . . . . . 167
Adding Text (with children) . . . . . . . . . . . . . . . . . . . . . . . . . 169
ReactDOM.render() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 170
JSX . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 171
JSX Creates Elements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 171
JSX Attribute Expressions . . . . . . . . . . . . . . . . . . . . . . . . . . . 173
JSX Conditional Child Expressions . . . . . . . . . . . . . . . . . . . . . 174
JSX Boolean Attributes . . . . . . . . . . . . . . . . . . . . . . . . . . . . 174
JSX Comments . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 175
JSX Spread Syntax . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 175
JSX Gotchas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 176
JSX Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 180
References . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 181
Forms . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 219
Forms 101 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 219
Preparation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 220
The Basic Button . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 221
Events and Event Handlers . . . . . . . . . . . . . . . . . . . . . . . . . . 223
Back to the Button . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 224
Text Input . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 226
Accessing User Input With refs . . . . . . . . . . . . . . . . . . . . . . . 227
Using User Input . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 229
Uncontrolled vs. Controlled Components . . . . . . . . . . . . . . . . . 233
Accessing User Input With state . . . . . . . . . . . . . . . . . . . . . . 234
Multiple Fields . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 237
On Validation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 242
Adding Validation to Our App . . . . . . . . . . . . . . . . . . . . . . . . 243
Creating the Field Component . . . . . . . . . . . . . . . . . . . . . . . . 248
Using our new Field Component . . . . . . . . . . . . . . . . . . . . . . . 252
Remote Data . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 258
Building the Custom Component . . . . . . . . . . . . . . . . . . . . . . 260
Adding CourseSelect . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 266
Separation of View and State . . . . . . . . . . . . . . . . . . . . . . . . . 270
Async Persistence . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 270
Redux . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 279
Form Component . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 286
Connect the Store . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 291
Form Modules . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 293
formsy-react . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 293
react-input-enhancements . . . . . . . . . . . . . . . . . . . . . . . . . . 294
tcomb-form . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 294
winterfell . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 294
CONTENTS
react-redux-form . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 295
Routing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 455
What’s in a URL? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 455
React Router’s core components . . . . . . . . . . . . . . . . . . . . . . . 458
Building the components of react-router . . . . . . . . . . . . . . . . . . . 459
The completed app . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 459
Building Route . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 461
Building Link . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 469
CONTENTS
Part II . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 545
Intro to Flux and Redux . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 546
Why Flux? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 546
Flux is a Design Pattern . . . . . . . . . . . . . . . . . . . . . . . . . . . . 547
Flux overview . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 547
Flux implementations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 548
Redux . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 549
Redux’s key ideas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 549
Building a counter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 550
Preparation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 550
Overview . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 551
The counter’s actions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 552
Incrementing the counter . . . . . . . . . . . . . . . . . . . . . . . . . . . 553
Decrementing the counter . . . . . . . . . . . . . . . . . . . . . . . . . . . 554
CONTENTS
renderScene() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 885
configureScene() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 888
Web components vs. Native components . . . . . . . . . . . . . . . . . . . . 891
<View /> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 892
<Text /> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 892
<Image /> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 893
<TextInput /> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 893
<TouchableHighlight />, <TouchableOpacity />, and <Touchable-
WithoutFeedback /> . . . . . . . . . . . . . . . . . . . . . . . 893
<ActivityIndicator /> . . . . . . . . . . . . . . . . . . . . . . . . . . . . 894
<WebView /> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 894
<ScrollView /> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 894
<ListView /> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 895
Styles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 905
StyleSheet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 906
Flexbox . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 908
HTTP requests . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 930
What is a promise . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 930
Enter Promises . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 933
Single-use guarantee . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 935
Creating a promise . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 935
Debugging with React Native . . . . . . . . . . . . . . . . . . . . . . . . . . . 937
Where to go from here . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 939
node . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 953
element . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 954
any type . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 956
Optional & required props . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 956
custom validator . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 957
Changelog . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 999
Revision 40 - 2020-01-13 . . . . . . . . . . . . . . . . . . . . . . . . . . . 999
Revision 39 - 2019-01-10 . . . . . . . . . . . . . . . . . . . . . . . . . . . 999
Revision 38 - 2018-12-20 . . . . . . . . . . . . . . . . . . . . . . . . . . . 999
Revision 37 - 2018-12-19 . . . . . . . . . . . . . . . . . . . . . . . . . . . 999
Revision 36 - 2018-10-01 . . . . . . . . . . . . . . . . . . . . . . . . . . . 999
Revision 35 - 2018-04-02 . . . . . . . . . . . . . . . . . . . . . . . . . . . 1000
Revision 34 - 2017-10-17 . . . . . . . . . . . . . . . . . . . . . . . . . . . 1000
Revision 33 - 2017-08-31 . . . . . . . . . . . . . . . . . . . . . . . . . . . 1000
Revision 32 - 2017-06-14 . . . . . . . . . . . . . . . . . . . . . . . . . . . 1000
Revision 31 - 2017-05-18 . . . . . . . . . . . . . . . . . . . . . . . . . . . 1000
Revision 30 - 2017-04-20 . . . . . . . . . . . . . . . . . . . . . . . . . . . 1000
Revision 29 - 2017-04-13 . . . . . . . . . . . . . . . . . . . . . . . . . . . 1001
Revision 28 - 2017-04-10 . . . . . . . . . . . . . . . . . . . . . . . . . . . 1001
Revision 27 - 2017-03-16 . . . . . . . . . . . . . . . . . . . . . . . . . . . 1001
Revision 26 - 2017-02-22 . . . . . . . . . . . . . . . . . . . . . . . . . . . 1001
Revision 25 - 2017-02-17 . . . . . . . . . . . . . . . . . . . . . . . . . . . 1001
Revision 24 - 2017-02-08 . . . . . . . . . . . . . . . . . . . . . . . . . . . 1001
Revision 23 - 2017-02-06 . . . . . . . . . . . . . . . . . . . . . . . . . . . 1002
Revision 22 - 2017-02-01 . . . . . . . . . . . . . . . . . . . . . . . . . . . 1002
Revision 21 - 2017-01-27 . . . . . . . . . . . . . . . . . . . . . . . . . . . 1002
Revision 20 - 2017-01-10 . . . . . . . . . . . . . . . . . . . . . . . . . . . 1002
Revision 19 - 2016-12-20 . . . . . . . . . . . . . . . . . . . . . . . . . . . 1002
Revision 18 - 2016-11-22 . . . . . . . . . . . . . . . . . . . . . . . . . . . 1003
Revision 17 - 2016-11-04 . . . . . . . . . . . . . . . . . . . . . . . . . . . 1003
Revision 16 - 2016-10-12 . . . . . . . . . . . . . . . . . . . . . . . . . . . 1003