The Joy of React
The all-new interactive learning experience that teaches you how to build rich, dynamic web apps with React.
So, let’s be real. Learning React is hard.
Over the past few years, React has become a “must-have” skill for front-end developers. Just about every job posting lists it as a pre-requisite!
If you’ve tried to learn React, though, you know it can be confusing and overwhelming. There’s just so much to know, and most of the tutorials out there assume a ton of prior knowledge and context.
Maybe you’ve gotten stuck in tutorial hell, following tutorial after tutorial without ever making tangible progress, like a mouse on a running wheel. You’ve built so many dang “Todo list” apps now, and yet when you try to build your own project, you don’t know where to start.
You want to learn React, but you’ve struggled.
I want to help.
For the past two years, I’ve been hard at work building the ultimate beginner-friendly React course.
The Joy of React is an interactive course. You won’t just sit and watch me code. There are tons of exercises, real-world-inspired projects, and fun mini-games and activities. It’s not like any other course you’ve taken before (unless you’ve taken my CSS course, in which case, it’s quite a bit like that).
We learn React from the ground up, building a robust mental model we can use to understand React and solve hard problems. I’ll share the dozens of epiphanies I’ve had after almost a decade of professional React experience.
We won’t just learn about React, either; we cover everything you need to know to succeed as a React developer, including modern JavaScript syntax, along with a ton of helpful community tools and packages.
The truth is, React is a joy to use.
Once you get the hang of it, React is a dream. I’ve tried most popular JS frameworks, and nothing else makes me feel as empowered as React.
I care a lot about the user experience, including things like performance, accessibility, polish. Getting this stuff right is not easy. But the React community has stepped up, and there are so many wonderful solutions we can leverage.
We first need to build a rock-solid foundation, to truly understand React conventions and best practices. Then, we’ll see how “secret weapon” community packages extend our reach.
This is a recipe for uninterrupted flow state. It’s pure joy, and I want you to experience it.
Let me tell you how The Joy of React will make it so.
Module 1 React Fundamentals
In this first module, we introduce React, and build a common understanding we'll use throughout the course.
We'll learn all about JSX, components, and props. We'll discover how to do iteration and conditional rendering in React. We'll also cover styling in React.
As someone who has taught React to hundreds of students in-person, I know what all of the common early stumbling blocks are, and we address them head-on in this module.
We go surprisingly deep in this module. By the end of Module 1, you'll understand how JSX differs from a templating language, what a React element is, why keys are necessary… you'll even build your own stateless mini-React from scratch, so you know exactly how it works under-the-hood!
Module 2 Working With State
The real magic starts with state. React state allows us to make dynamic applications that feel alive.
In this module, we learn how to use event handlers and the React hook to update the UI based on user actions. We'll learn how to wire up forms, how to work with complex state structures, and how to manage state across the application.
We'll also deepen our understanding of how React works. We'll learn why React sometimes feels so much more complicated than other frameworks. We'll discover the crucial role that React component instances play. And we'll learn how to leverage best practices like lifting state up.
There are lots of fun exercises in this module. We build a couple of mini-games, and see how to build a minimal version of my Gradient Generator project.
Module 3 React Hooks
In 2019, React was revolutionized with the addition of hooks. Hooks allow us to “hook into” React internals.
In this module, we go beyond the hook, and cover things like:
- Managing side effects with the hook.
- Capturing DOM references with the hook.
- Optimizing the performance of our applications with and .
- Creating our own abstractions with custom hooks.
- Fetching data from the network with Fetch + the third-party hook.
Stuff gets real in this module. We cover some of the hardest concepts in React, like avoiding stale values in our side effects. To help us make sense of the hard stuff, we double down on our efforts to understand how React ticks, learning why immutability is so important, what exactly a “render” is, and more.
Module 4 Component API Design
At this point in the course, we've covered a good chunk of the React API, but we've been focusing on how everything works. In this module, our focus starts to shift.
The components we create should be a joy to use: they should be easy to understand, composable, and offer the right amount of flexibility. Even more critically, they should offer a wonderful user experience, in terms of accessibility, usability, and performance.
This module is all about refining our thinking around components. I'll teach you the mental models I use every day when deciding how I want to structure my code.
We'll cover a ton of practical tips and tricks in this module, from polymorphism to prop delegation to compound components and slots. You'll also learn about React Context, and see how it can be useful in achieving our goals.
Accessibility is a focus throughout the course, but we really lean into it in this module. We'll build notoriously-tricky components like modals from scratch, with a focus on usability and accessibility, and see why it's probably a better idea to use a library.
Module 5 Happy Practices
I started working with React in 2015, and I've learned so much along the way. My goal with this module is to help you skip a few years of experimentation, and jump straight to the patterns and practices that are a delight to use.
In the dev community, we talk a lot about “Best Practices”, but really, there's no such thing as a best practice. It depends what you're optimizing for! It's all trade-offs.
In this module, I'll share my favourite “Happy Practices”, the design patterns and habits I've been refining over 8 years, things that just make it enjoyable to work with React.
Here's a few examples of what we'll cover:
- The Principle of Least Privilege, and why I give components as little knowledge/power as possible.
- The distinction between parents and owners, and how we can simplify our code and improve performance in one fell swoop.
- The magic of Immer, and how it makes complex state much less scary.
- Really getting to understand things like React elements, refs, and keys, and how a deep understanding exposes entirely new patterns we can take advantage of.
Module 6 Full-Stack React
In this module, we go beyond the browser and explore how React works in a full-stack context, using Next.js.
Next.js is a meta-framework, built on top of React. It's been around since 2016, but was recently totally rebuilt from the ground up. In May 2023, Next brought its new “App” router out of beta, and ushered in the start of a new era in React.
In this module, we'll learn how to build performant full-stack applications using the latest version of Next.js. We cover all of the shiny new tech, including:
- React Server Components
- Suspense
- Streaming Server Side Rendering w/ Selective Hydration
- Next.js App Router
We'll learn how these things work, but also how they fit together to deliver incredible next-level user experiences. This stuff is bleeding-edge, and this course is one of the first in-depth resources to really explore this new world.
This is the module where everything comes together. Using everything we learned over the first 5 modules of the course, we'll build dynamic full-stack React applications, from project initialization to deploy.
Capstone Projects
Everything you learn in the modules will be reinforced and solidified in 3 challenging projects, woven between the modules. You'll use your newfound skills to build:
Project 1 Word Game
One of the best ways to learn React is by building games. In this first project, we build a clone of Wordle, a popular online word-guessing game.
The main focus of this project is to get comfortable with React state, but it also exposes us to some really interesting questions around application structure. You'll need to decide how you want state to move through the application, and consider different tradeoffs!
Project 2Toast Playground
We build a reusable, low-level component!
This is way harder than it seems. The component we build will adhere to all accessibility guidelines, with a focus on usability and user experience. We'll also put a lot of thought into its API design, making sure it's composable and flexible.
We'll also build a mini app to help us customize and generate toasts.
A few years back, I created a React curriculum for a local coding bootcamp, and it featured a project like this, building a seemingly-straightforward UI component. Students have said that this is a really eye-opening exercise.
Project 3 Interactive MDX-Based Blog
When I created my blog back in 2018, I didn't want to make a boring ol’ static blog. I wanted to create custom, bespoke widgets that would help the reader learn a concept by doing.
In this final project, we'll build the ultimate blog. You'll learn exactly how to set things up so that you have the full power of React available to you within the content.
Bonus Module Layout Animations with Framer Motion
Framer Motion is one of the most incredible tools in the React ecosystem. In this bonus module, you'll learn how to use its “layout projection” engine to do truly remarkable, seemingly-impossible layout animations.
This is honestly one of the best “secret weapon” packages in my arsenal, and I'm psyched to show you how I use it!
Bonus Feature React Technical Interview Prep
When it comes to getting hired as a React developer, one of the trickiest parts is the technical interview.
In this bonus feature, I'll help you prepare by giving you interview-style challenges, and then showing you how I would tackle them.
This bonus feature will be released later in 2023.
Watch Online The Joy of React
# | Title | Duration |
---|---|---|
1 | 001 - Welcome! | 03:00 |
2 | 002 - Hello React | 03:43 |
3 | 003 - Build Your Own React | 05:14 |
4 | 004 - Expression Slots | 05:02 |
5 | 005 - Fix The Converter - | 01:55 |
6 | 006 - The Whitespace Gotcha | 03:18 |
7 | 007 - Exercises | 03:20 |
8 | 008 - Exercises | 05:18 |
9 | 009 - Thinking in Components | 04:11 |
10 | 010 - Props | 06:29 |
11 | 011 - Exercises | 02:21 |
12 | 012 - Exercises | 06:29 |
13 | 013 - Fragments | 02:35 |
14 | 014 - Mapping Over Data | 04:21 |
15 | 015 - Keys | 05:09 |
16 | 016 - Exercises | 03:56 |
17 | 017 - Exercises | 05:17 |
18 | 018 - Exercises | 01:53 |
19 | 019 - Exercises | 04:56 |
20 | 020 - Exercises | 03:04 |
21 | 021 - Exercises | 04:09 |
22 | 022 - Styling In React | 04:09 |
23 | 023 - CSS Modules | 05:17 |
24 | 024 - Exercises | 03:40 |
25 | 025 - Exercises | 03:37 |
26 | 026 - Exercises | 02:15 |
27 | 027 - Exercises | 02:16 |
28 | 028 - Asynchronous Updates | 03:41 |
29 | 029 - Exercises | 04:49 |
30 | 030 - Exercises | 04:23 |
31 | 031 - Why the Dance | 09:32 |
32 | 032 - Data Binding | 08:28 |
33 | 033 - Exercises | 08:10 |
34 | 034 - Exercises | 02:40 |
35 | 035 - Exercises | 08:37 |
36 | 036 - Props Vs. State | 04:05 |
37 | 037 - Mutation Bugs | 07:27 |
38 | 038 - Exercises | 09:08 |
39 | 039 - Exercises | 04:12 |
40 | 040 - Dynamic Key Generation | 08:36 |
41 | 041 - Key Gotchas | 12:05 |
42 | 042 - Lifting State Up | 09:28 |
43 | 043 - Exercises | 01:42 |
44 | 044 - Exercises | 08:22 |
45 | 045 - Component Instances | 08:42 |
46 | 046 - About This Project | 03:15 |
47 | 047 - Getting Started | 04:32 |
48 | 048 - Solution | 10:46 |
49 | 049 - Solution | 14:03 |
50 | 050 - hhdfnang | 09:07 |
51 | 051 - ogfbmgeg | 09:09 |
52 | 052 - fgfcikbp | 16:04 |
53 | 053 - - 1920x1080 3305K | 06:02 |
54 | 054 - - 1920x1080 3066K | 07:00 |
55 | 055 - Rules of Hooks | 06:00 |
56 | 056 - Exercises | 03:12 |
57 | 057 - Exercises | 03:50 |
58 | 058 - Immutability Revisited | 09:10 |
59 | 059 - Refs | 06:09 |
60 | 060 - Exercises | 02:20 |
61 | 061 - Exercises | 04:24 |
62 | 062 - Side Effects | 04:09 |
63 | 063 - The useEffect hook | 07:44 |
64 | 064 - Exercises | 02:59 |
65 | 065 - Exercises | 05:23 |
66 | 066 - Effect Lint Rules | 04:34 |
67 | 067 - Running on Mount | 03:43 |
68 | 068 - Running on Mount | 04:48 |
69 | 069 - Exercises | 01:19 |
70 | 070 - Exercises | 02:15 |
71 | 071 - Exercises | 03:58 |
72 | 072 - Exercises | 05:51 |
73 | 073 - Cleanup | 06:55 |
74 | 074 - Cleanup | 07:14 |
75 | 075 - Cleanup Exercises | 00:56 |
76 | 076 - Cleanup Exercises | 01:31 |
77 | 077 - Cleanup Exercises | 02:40 |
78 | 078 - Cleanup Exercises | 05:33 |
79 | 079 - Stale Values | 11:33 |
80 | 080 - Stale Values | 03:16 |
81 | 081 - Exercises | 04:27 |
82 | 082 - Strict Mode | 06:39 |
83 | 083 - Strict Mode | 04:08 |
84 | 084 - Custom Hooks | 04:35 |
85 | 085 - Exercises | 02:31 |
86 | 086 - Exercises | 08:18 |
87 | 087 - Exercises | 05:19 |
88 | 088 - Fetching on Event | 03:55 |
89 | 089 - Fetching on Event | 07:20 |
90 | 090 - Fetching on Mount | 05:30 |
91 | 091 - Exercises | 11:28 |
92 | 092 - Exercises | 04:54 |
93 | 093 - Exercises | 01:10 |
94 | 094 - Exercises | 03:16 |
95 | 095 - Exercises | 10:10 |
96 | 096 - Alternatives | 07:00 |
97 | 097 - Introduction | 04:24 |
98 | 098 - The Spectrum of Components | 08:39 |
99 | 099 - Exercises | 05:41 |
100 | 100 - Exercises | 07:09 |
101 | 101 - Prop Delegation | 03:35 |
102 | 102 - Exercises | 03:09 |
103 | 103 - Exercises | 05:28 |
104 | 104 - Delegating Styles | 03:19 |
105 | 105 - Forwarding Refs | 09:10 |
106 | 106 - Exercises | 01:45 |
107 | 107 - Exercises | 01:24 |
108 | 108 - Polymorphism | 07:27 |
109 | 109 - Exercises | 06:55 |
110 | 110 - Exercises | 04:13 |
111 | 111 - Slots | 10:18 |
112 | 112 - Exercises | 03:05 |
113 | 113 - Exercises | 05:58 |
114 | 114 - The Problem | 09:26 |
115 | 115 - Exercises | 02:44 |
116 | 116 - Exercises | 02:41 |
117 | 117 - Provider Components | 06:49 |
118 | 118 - Performance | 05:16 |
119 | 119 - Performance | 05:52 |
120 | 120 - Modals | 15:17 |
121 | 121 - Exercises | 11:10 |
122 | 122 - Converting Our Modal | 10:29 |
123 | 123 - Exercises | 04:56 |
124 | 124 - Exercises | 03:01 |
125 | 125 - Exercises | 05:40 |
126 | 126 - Solution | 05:33 |
127 | 127 - Solution | 05:49 |
128 | 128 - Solution | 10:37 |
129 | 129 - Solution | 07:30 |
130 | 130 - edfhjakg | 14:04 |
131 | 131 - fpooaoln | 07:40 |
132 | 132 - Leveraging Keys | 04:01 |
133 | 133 - Leveraging Keys | 05:53 |
134 | 134 - Leveraging Keys | 06:55 |
135 | 135 - Exercises | 01:28 |
136 | 136 - Exercises | 04:49 |
137 | 137 - Exercises | 03:42 |
138 | 138 - Elements Revisited | 02:02 |
139 | 139 - Elements Revisited | 12:00 |
140 | 140 - Deriving State | 13:35 |
141 | 141 - Exercises | 02:20 |
142 | 142 - Exercises | 01:54 |
143 | 143 - Exercises | 07:36 |
144 | 144 - Lifting Content Up | 04:19 |
145 | 145 - Lifting Content Up | 04:17 |
146 | 146 - Exercises | 06:29 |
147 | 147 - Single Source of Truth | 08:01 |
148 | 148 - Exercises | 03:57 |
149 | 149 - Exercises | 04:03 |
150 | 150 - Principle of Least Privilege | 05:26 |
151 | 151 - Exercises | 04:21 |
152 | 152 - useReducer | 10:02 |
153 | 153 - Exercises | 01:51 |
154 | 154 - Exercises | 07:07 |
155 | 155 - Exercises | 06:51 |
156 | 156 - Exercises | 04:17 |
157 | 157 - Exercises | 04:28 |
158 | 158 - Exercises | 15:21 |
159 | 159 - Portals | 11:03 |
160 | 160 - Exercise | 04:05 |
161 | 161 - Exercise | 05:17 |
162 | 162 - Refs Revisited | 09:22 |
163 | 163 - Error Boundaries | 06:01 |
164 | 164 - - 1920x1080 | 10:03 |
165 | 165 - React Server Components | 12:02 |
166 | 166 - Hello Next! | 08:35 |
167 | 167 - Exercises | 02:46 |
168 | 168 - Exercises | 03:54 |
169 | 169 - Client Components | 17:16 |
170 | 170 - Exercises | 03:55 |
171 | 171 - Exercises | 05:03 |
172 | 172 - Exercises | 04:30 |
173 | 173 - Exercises | 09:16 |
174 | 174 - SSR Gotchas | 07:51 |
175 | 175 - SSR Exercises | 06:20 |
176 | 176 - SSR Exercises | 07:46 |
177 | 177 - SSR Exercises | 04:16 |
178 | 178 - Page Transitions | 09:39 |
179 | 179 - Dynamic Segments | 05:42 |
180 | 180 - Exercises | 02:36 |
181 | 181 - Exercises | 06:05 |
182 | 182 - Next's Metadata API | 03:59 |
183 | 183 - Starting a New Project - 1952x1080 | 03:49 |
184 | 184 - Building for Production | 06:11 |
185 | 185 - Building for Production | 04:38 |
186 | 186 - Exercises | 03:02 |
187 | 187 - React Cache | 06:46 |
188 | 188 - An Exciting New World | 16:15 |
189 | 189 - Graphing It Out | 07:52 |
190 | 190 - Suspense Exercises | 04:23 |
191 | 191 - Suspense Exercises | 04:15 |
192 | 192 - jbjdnpaj | 07:13 |
193 | 193 - Dark Mode | 15:12 |
194 | 194 - Getting Started | 06:57 |
195 | 195 - Exercises | 02:49 |
196 | 196 - Exercises | 06:35 |
197 | 197 - Layout Animations | 11:06 |
198 | 198 - Layout Exercises | 02:06 |
199 | 199 - Layout Exercises | 02:57 |
200 | 200 - Shared Layout | 09:22 |
201 | 201 - Working With Groups | 13:43 |
202 | 202 - Working With Groups | 03:56 |
203 | 203 - Shared Layout Exercises | 01:31 |
204 | 204 - Shared Layout Exercises | 06:45 |
205 | 205 - Shared Layout Exercises | 05:23 |
206 | 206 - One Last Exercise | 07:05 |
207 | 207 - One Last Exercise | 09:26 |
208 | 208 - - 1920x1080 | 03:47 |
209 | 209 - - 1920x1080 | 05:23 |
210 | 210 - Solution | 05:06 |
211 | 211 - Solution | 05:33 |
212 | 212 - Solution | 06:42 |
213 | 213 - Solution | 02:57 |
214 | 214 - ccobbnfj | 09:05 |
215 | 215 - pbjemcph | 10:33 |
216 | 216 - egfjagcc | 09:06 |
217 | 217 - nkfhacjj | 09:53 |
218 | 218 - jcppdheb | 11:35 |
219 | 219 - Suspense Investigations | 05:52 |
220 | 220 - Navigation | 03:13 |
221 | 221 - Tips N’ Tricks | 02:03 |
222 | 222 - Webpack | 05:32 |
223 | 001 - Cover Letters | 04:05 |
224 | 002 - Cover Letters | 02:37 |
225 | 003 - Cover Letters | 02:13 |
226 | 004 - Technical Interviews | 05:30 |
227 | 005 - FizzBuzz | 04:17 |
228 | 006 - Scroll Position | 06:34 |
229 | 007 - Todo App | 11:02 |
230 | 008 - Project Euler | 10:19 |
231 | 009 - Starfield Button | 22:48 |
232 | 010 - Multi-Step Signup | 36:27 |
233 | 011 - Trello Clone | 24:56 |
234 | 012 - Clicking Outside | 14:18 |
235 | 013 - Multi Checkbox | 21:41 |
236 | 014 - Fetch Race Condition | 01:27 |
237 | 015 - Fetch Race Condition | 11:05 |
238 | 016 - Fetch Race Condition | 04:33 |
239 | 017 - useEffectSkipMount | 12:19 |