React Tutorial for Beginners
By Programming with Mosh
Summary
## Key takeaways - **React: Library vs. Framework**: React is a library focused on building user interfaces, unlike frameworks like Angular or Vue which provide a broader set of tools and guidelines for application development. [19:06], [19:21] - **JSX: JavaScript XML for UI**: JSX allows you to write UI structures that look like HTML directly within your JavaScript code. This code is then compiled into standard JavaScript calls for React to render. [12:45], [13:15] - **Components: Reusable UI Building Blocks**: React applications are built as a tree of components, where each component is a reusable, modular piece of the user interface. These components can be combined to construct complex UIs. [04:08], [04:44] - **State Management with `useState` Hook**: The `useState` hook allows components to manage internal data that can change over time. When state changes, React automatically re-renders the component to reflect the updates. [44:43], [47:53] - **Props: Passing Data Down**: Props are used to pass data from a parent component to a child component, enabling reusability and dynamic content. Props should be treated as immutable. [50:49], [58:38] - **Conditional Rendering Techniques**: React offers several ways to render content conditionally, including using the ternary operator or logical AND (`&&`) within JSX, allowing for dynamic UI updates based on conditions. [33:17], [37:30]
Topics Covered
- React's Core: Components and JSX Explained
- Mastering React Components: State, Props, and Reusability
- Unlock Reusability: Passing Children and Dynamic Props
- Leveraging TypeScript for Robust React Development
Full Transcript
[Music]
welcome to the ultimate react course in
this course you will learn everything
you need to know about react from the
basics to more advanced concepts so by
the end of the course you'll be able to
confidently build fast and scalable apps
with react if you are looking for a
comprehensive easy to follow
well-organized and practical course that
takes you from Zero to Hero this is the
right react course for you you won't
need any prior knowledge of react to get
started everything you need to know is
right here so you won't need to jump
back and forth between random tutorials
now unlike other courses we won't be
building a dummy App instead we'll be
building and deploying a beautiful
production grade app for discovering
video games this app has all the
features and UI patterns you would
expect from a modern application we can
toggle within the dark and light modes
we can search for games filter them by
genre as well as platform now as we
change filters the page title gets
updated dynamically we can also sort
games and here we see loading skeletons
while games are being fetched from the
back end and that's just the start in
the next part which I'm currently
working on we'll dive into advanced
topics like routing State Management
fetching data with react query
authentication error handling
performance optimization and much much
more I've put my heart and soul into
creating this course and I'm confident
that it's going to be a game changer for
your react skills I'm Marsha madani I'm
a software engineer with over 20 years
of experience and I've taught millions
of people how to code and become
professional software Engineers through
my YouTube channel and online school
codebitmarsh.com if you're new here make
sure to subscribe as I upload new videos
all the time so if you're ready to
master react and build front-end apps
with confidence let's jump in and get
started
[Music]
thank you
[Music]
before we get started let's talk about
what you will need to know to take this
course first things first you don't need
to know react to take this course
however you should have a good
understanding of HTML CSS and JavaScript
if you're comfortable writing code in
these languages you are in a great
position to start learning react now
throughout the course we'll be using
typescript typescript is a superset of
JavaScript that adds static typing to
the language essentially it helps us
catch errors earlier in the development
process which can save us time and
headaches down the road now don't worry
if you have never coded in typescript
before I'll hold your hands and teach
you everything from scratch with that
out of the way we can dive right into
learning react
before we begin coding let's take a few
minutes and discuss what reacting is and
how it helps us create better
applications react is a JavaScript
library for building Dynamic and
interactive user interfaces it was
created at Facebook in 2011 and is
currently the most widely used
JavaScript library for front-end
development so if you're looking for a
job as a front-end developer you should
know how to confidently build
applications with react but why was
react created well as you probably know
when a web page is loaded in a browser
the browser takes the HTML code and
creates a tree like structure called the
document object model or the Dom for
short this allows us to use JavaScript
and change the page content in response
to user actions for example we can use
JavaScript to hide an element when a
button is clicked this is called vanilla
JavaScript meaning plain JavaScript code
without any third part tools now as our
applications grow working with a Dom can
become quite complex and challenging to
manage this is where react comes into
play with react we no longer need to
worry about querying and updating Dom
elements instead with this grab a web
page using small reusable components and
react will take care of efficiently
creating and updating Dom elements so
components help us write reusable
modular and better organized code now
let's look at a real word example
imagine you want to build a web page
like this on this page we have a
navigation bar on the top a side panel
on the left and a grid of video games in
the main area we can build each of these
sections as separate components now in
this grid each game is displayed in a
cart which is an independent component
with a like button that's another
component itself we can build all these
components individually and then combine
them to build this page essentially a
react application is a tree of
components with the app being the root
bringing everything together all right
that's enough theory for now next we're
going to set up our development
environment and get a feel for what it's
like to build applications with react
foreign
foreign
to take this course you need to have
node version 16 or higher now to check
the version of node on your machine open
up your command prompt or terminal
window and run node Dash V so on this
machine I'm running node version 19. you
might be running a newer version that's
totally fine it's not going to impact
the materials in this course but you
need to have node version 16 or higher
if you don't head over to
nodejs.org and download the latest
version on this page now in this course
just like my other courses I'll be using
visual studio code or vs code as my
editor you're welcome to use any editor
that you prefer but if you want to use
vs code I strongly suggest you to use
the printer extension for formatting
your code so here's the extensions panel
over here search for prettier
and install this extension once you do
that on the top under the code menu go
to preferences and settings now this
layout might be different on Windows or
Linux I'm not entirely sure but find the
settings dialog and on this page search
for format on Save
if you take this box every time you save
a file that file gets automatically
reformatted with all that now we are
ready to create our first react
application
[Music]
there are two ways to create a react app
we can use the official tool provided by
the react team it's called create react
app or CRA but we also have another tool
called Veet that's getting increasingly
popular these days because it's much
faster and gives us smaller bundle sizes
so here in the terminal window I'm
currently on my desktop to create a new
app using Veet all you have to do is run
npm create Veet at latest or if you want
to use the exact same version as me
which is what I recommend you because I
want to make sure you have the exact
same experience then you need to specify
the version that is 4.1.0
okay now npm is asking if you want to
install this package let's proceed
next we need to specify our project name
which is Veet project by default but we
can change that to anything like react
app
next we need to select a framework so
using meet we can create any kind of
JavaScript project we can use vanilla
JavaScript which is Javascript without
any third-party tools we can also create
a view project a react project and so on
so using up and down arrows we can move
down this list let's select react
next we need to select a language so
here we have JavaScript and typescript
we're going to use typescript in this
course
good so now we have a new project next
we need to go into this folder install
all the third party dependencies and run
our web server so let's set it into the
react app folder and type npm install or
npmi that is shorter and with this we
can install all the third-party
libraries
all right now we need to open this
project in vs code to do that we type
code period if this doesn't work on your
machine simply drag and drop that folder
into vs code
now here in vs code we can open an
embedded terminal by pressing Ctrl and
backtick if this doesn't work on your
machine just go to the terminal window
and open a new terminal you can also see
the shortcut right here
so this is our embedded terminal it's
much easier to use this than switch back
and forth between vs code and a
different terminal window now to run our
web server we type npm run Dev
now this launched a web server at this
address localhost Port 5173 this might
be different on your machine so don't
worry about that just open this address
in your browser and this is our first
react application next we're going to
create our first react component
so this is our project loaded in vs code
now let me give you a brief overview of
the key files and folders in this
project here we have the node modules
folder this is where all the third-party
libraries like react and other tools are
installed you'll never have to touch
this
next we have the public folder this is
where the public assets of our website
exist like images video files and so on
next we have the source folder this is
the source code of our application in
this folder currently we have a
component called the app component don't
worry about any of the code here we're
going to rewrite everything from scratch
all I want you to note here is that
currently in this application we have a
single component called the app
component
now outside of the source folder we have
index.html which is a very basic HTML
template in this template we have a div
with the idea of root that is the
container for our application
below that we have a script element
referencing Source slash main.tsx this
is the entry point to our application
next we have
package.json in this file you can find
information about this project so we
have the name of the project its version
a bunch of script
the list of dependencies So currently
we're dependent on two libraries react
and react on version 18. we also have a
bunch of development dependencies these
are only used for development they're
not, going, to, be deployed, with, our
application in the future
next we have a typescript configuration
file here we have a bunch of settings
for telling the typescript compiler how
to compile our code to JavaScript now
for the most part you never have to
touch this file unless you're an
advanced user and finally we also have a
configuration file for Veet again for
the most part you don't have to touch
this file
[Music]
Now to create a react component we right
click on the source folder and add a new
file called
message.tsx so the extension of
typescript files should be either TS or
TSX quite often we use Ts for plain
typescript files and TSX for react
components
now there are two ways to create a react
component we can use a JavaScript class
or a function these days function based
components have become more popular
because they are more concise and easier
to write so that's what we'll use in
this course but if you're maintaining an
older react project that is built with
class components you can look at my
previous react course to learn about
them
but function based components are the
recommended approach for new projects so
here we declare a function called
message
that pay attention to how I have named
this function this convention is called
Pascal casing with Pascal casing we
should capitalize the first letter of
every word in this case p and C it's
really important to follow this
convention because this is the
convention that both react and other
developers expect us to follow so in
react application whenever we want to
create a function component we should
always follow Pascal casing now here we
should describe what the UI is going to
look like where we use this component so
let's say wherever we use this component
we want to render an H1 element with a
message like hello work so here we
return an H1 element with hello world
now this syntax might make you a little
bit confused you might be thinking that
you're writing HTML code in the middle
of JavaScript code but that is not
correct this syntax you see here is
called jsx which is short for JavaScript
XML so this code under the hood is going
to get compiled down to JavaScript
if you head over to
babblejs.io repo that is repl you can
see how this code gets converted to
JavaScript let me show you
so on the left side we can write jsx
code like H1 hello world
and on the right side we can see the
equivalent JavaScript code so this piece
of code gets eventually converted to
react.createelement the type of element
is H1 and the message inside the element
is hello world
so this is a very basic component now to
use this first we need to export it as a
default object from this module
now let's go to the app component and
use this new component so back to our
project
here's the app component
now we're going to delete everything in
this file
now let's create a new component called
app
now in this component let's say we want
to have a div and inside the div we want
to have our message component so first
we need to import our message component
from period slash message so period
means the current folder
now we can use this component just like
regular HTML elements so we add the
opening tag and close it it's really
important to close it we should always
close our react components or we'll get
a compilation error now here we can also
use the self-closing syntax that is more
concise
now just like the message component we
should export
the app
component so it can be used somewhere
else
now here in the terminal you can see our
web server is still running and here we
have HMR which is short for hot module
replacement so read under the hood
monitors our files for changes whenever
we make any changes it will
automatically refresh our page in the
browser
so now you can see our message component
rendered on the screen now this is a
very simple example in a real world
application a component can have
Behavior so here we can have a button
when the button gets clicked perhaps we
can change the message we can do all
sorts of things
so with jsx we can easily describe the
user interface of our application with
HTML and JavaScript now the great thing
about jsx is that it allows us to easily
create Dynamic content for example here
we can declare a constant Cod name I set
it to my name Marsh now we can replace
this word with my name dynamically so
here we add braces and inside the braces
we can write any JavaScript expression
an expression is a piece of code that
produces a value so here we can
reference the name constant we can also
call a function like get name basically
any piece of code that returns a value
so here we can add my name dynamically
we can also write if statement so we can
say if name is true theme return this
markup otherwise return a different
markup like Hello World
now back to the browser you can see my
name is rendered on the screen however
if I change the name to an empty string
we see Hello World so this is the beauty
of jsx using this syntax we can easily
describe the user interface of our
applications
[Music]
So currently we have a component tree
with the app being the root or top level
component and the message being a child
when our application starts react takes
this component tree and builds a
JavaScript data structure called the
virtual Dom this virtual Dom is
different from the actual Dom in the
browser it's a lightweight in-memory
representation of our component tree
where each node represents a component
and its properties when the state or the
data of a component changes react
updates the corresponding node in the
virtual Dom to reflect the new state
then it compares the current version of
virtual Dom with the previous version to
identify the nodes that should be
updated it will then update those nodes
in the actual Dom now technically
updating the Dom is not done by react
itself it's done by companion Library
called react Dom so earlier we talked
about package.json in this file we can
see the dependencies of our application
so currently our application is
dependent on two libraries react and
react on let me show you how these work
together
so in index.html I told you that we have
a div with the idea of root and this is
the container of our application
below that we have a script element
referencing
main.tsx now if you look at this file
you can see that here we're using react
Dom to render this component tree inside
an element with the ID of root
so this is our component tree here is
our app component that is wrapped by
another component called strict mode
this is one of the built-in components
in react it doesn't have a visual
representation its purpose is to
identify potential problems so we're
taking this component tree and rendering
or displaying it inside an element with
the idea of root and to do that we're
using the react on library but we can
also render this component Tree in a
mobile app using a different Library
called react native so react itself is
not tied to a particular platform like
web or mobile it's platform agnostic and
we can use it to build apps for web
mobile and desktop devices
[Music]
so you have learned that react is a
JavaScript library for creating user
interfaces in contrast to react we have
other tools like angular and view which
are Frameworks but what is the
difference between a library and a
framework a library is a tool that
provides specific functionality while a
framework provides a set of tools and
guidelines for building applications so
a library is like a tool while a
framework is like a tool set now react
is just a library or a tool for building
user interfaces so the only thing that
it does and is good at is creating
Dynamic and interactive user interfaces
but we hardly use only react to build
modern applications we often need
additional tools for concerns such as
routing which means allowing the user to
go from one page to another making HTTP
calls managing the application State
internationalization form validation
animations and so now the great thing
about react is that it doesn't have an
opinion about the additional tools we
should use for these concerns so we can
pick the right tools for the job in this
part of the course our focus is entirely
on react and no third-party libraries
once you master react in the next part
we'll explore some additional useful
libraries in the react ecosystem
hey guys Marsh here before we dive back
into the tutorial I just wanted to say
that this tutorial is actually the first
hour of my complete react course the
full course includes eight hours of
content jam-packed with the latest
techniques and best practices it's got
everything you need to become a react
Pro including exercises summary notes
cheat sheets and even the project I
showed you at the beginning of this
tutorial and the best part is it comes
with a 30 day money back guarantee so if
you're loving this tutorial and want to
take your react skills to the next level
I highly recommend checking out the
complete course using the link below
this video thanks for watching and now
let's get back to the tutorial
so you got a taste of building
applications with react in this section
we'll be covering the fundamental
concepts in react applications this is
the most important section in this
course you don't want to miss the
materials I've covered here help you
build a strong foundation in react we'll
talk about building components rendering
markup with jsx managing State passing
input to components where props and
debugging react applications so let's
jump in and get started
[Music]
all right in this lesson we're going to
create a basic list group component
first we're going to install bootstrap
to give our application a modern look
and feel now in case you are not
familiar with bootstrap it's a very
popular CSS library that gives us a
bunch of CSS classes for styling our
applications
so here we open up our terminal window
you can see our web server is running so
we open a new terminal window and run
npm install bootstrap the version that
I'm using in this video is
5.2.3 let's go ahead
good now we need to import it in one of
our CSS files so here in the source
folder we have a couple of CSS files one
is app.css
this file contains all the styles for
our app component we don't need any of
this stuff anymore
delete
we also have
index.css where we have Global styles
for our application again we don't need
any of these Styles here because all of
them were generated by wheat so we can
delete this file entirely
now let's go to main.tsx
you can see that our index.css file was
imported here we're going to replace
this line with import bootstrap slash
dist slash CSS slash bootstrap.css
okay now to make sure that bootstrap is
imported properly we go back to the
browser so previously hello world was in
the middle of the page and we had a
different font now it's up here and it
has a different font beautiful so now
let's create a list group component
so back to our project here in the
source folder we add a new folder called
components this is not necessary but by
convention we put all of our components
in a folder called components now here
we add a new file
called list group dot TSX again pay
attention to how I have named this file
here we're following the Pascal
convention so we're capitalizing the
first letter of each word
now in this file with declare a function
called list group
for now let's just return an H1 element
list group
and Export this from this module
next we need to import this in our app
component so if you're on Mac press
command and P if you are on Windows
press Ctrl NP here we can search for
files like app.tsx okay now we don't
need the message component anymore so
let's remove the slide instead we're
going to import our list group com
component okay and we're going to use
that right here
okay let's make sure everything is
working up to this point so here in the
browser we have our list group component
beautiful now finally we need to display
a list of items here and for that we're
going to borrow some code from bootstrap
so head over to
getboosttrap.com go to the docs
and on the left side
under component section
you should find list group so
this is a list group component in
bootstrap
to create a list like this we need to
use
this markup so we need a UL with this
class and a bunch of list items with
these classes so we copy this we go back
to our list group component and return
this markup now here we get a bunch of
Errors because class is a reserved
keyword in JavaScript or typescript so
here we need to rename all these classes
to class name now let me show you
another shortcut let's rewrite this back
we select the class keyword now if
you're on Mac press command and D if
you're on Windows press Ctrl and d and
with this we select the next occurrence
of the selected keyword so now we have
multiple cursors we can press command
and d one more time and again and again
and again now all of these are selected
so we delete them and type class name
then we press escape a couple of times
to disable multi-cursor editing okay now
finally I save the changes but my code
is not reformatted so let's investigate
why this is happening
on the top Under The View menu
we go to the command palette note the
shortcut on Mac it's shift command and P
and here we search for format document
okay here we have an error saying there
are multiple formatters for typescript
jsx files so let's click on configure
and here we're going to use prettier as
our default code formatter good now this
file is formatted Beautiful Just note
that prelayer automatically wrapped our
jsx markup in parenthesis this is
necessary to break the markup into
multiple lines so if you're not using vs
code with prettier be sure to add the
left bracket in front of the return
keyword so you can spread your jsx into
multiple lines so now back to the
browser here's our list group component
but this is pretty boring this doesn't
have any functionality and it doesn't
allow us to render or display these
items dynamically so we're going to
solve these issues one by one over the
next few lessons
[Music]
now what if we want to add a heading
here well if we add another element here
like an H1
we get a bunch of Errors because in
react a component cannot return more
than one element so earlier I told you
that this H1 expression that we have
here eventually gets compiled to
JavaScript so this line gets translated
to something like
react.createelement with H1 being the
type of the element
the same thing will happen for the
second element so in this function we
are returning multiple elements and this
is not allowed in react now to solve
this problem we have a couple of
different ways one simple way is to wrap
this entire expression inside a div or
another element
so let me show you another shortcut we
select all this code
then we bring up the command palette so
we go to the view menu and bring up the
command palette or better we use the
shortcut
and here we search for wrap with
abbreviation now we press enter
and here we specify the type of element
that we want to use to wrap this entire
code so div
enter done okay so that's one way but
we're adding one extra element in the
Dom purely for making react happy this
is unnecessary a better way is to use a
fragment so on the top
we import fragment
from react make sure to put it in braces
now we replace the div with a fragment
so just like before I've selected the
div element now we can press command and
D to select the other div and now with
multiple cursors we can edit both of
them
in one go okay
now with this change when this component
is rendered on the screen we're not
going to have an additional element like
a div in the Dom okay now there is even
a better way to achieve the same result
we have a shorter syntax we don't have
to import the fragment component from
react so let's delete this line
and we select the fragment tags both of
them and remove them
so if you add empty angle brackets we're
telling react to use a fragment to wrap
all these children
now back to the browser so here's our
heading and our items beautiful
[Music]
now this list is kind of useless because
we have hard-coded these items in our
markup what if you want to render a list
of items dynamically well let's declare
a constant
called items and set it to an array of
strings here we can use the name of
series like New York
San Francisco Tokyo
London
and Paris
now in jsx we don't have a for Loop so
we cannot write code like four item in
items render whatever it doesn't work
that way so we have to use a different
technique in JavaScript as you probably
know arrays have a method called map for
mapping or converting each item to an
item of a different type
so if you type items dot map
here we can pass an arrow function we
can say take each item and convert it to
an item of a different type
so here we want to convert each item to
an Li element so here we type Li and
inside the tags we want to render or
display the item itself earlier I told
you that in jsx we use curly braces to
render data dynamically so here we
render the item itself okay now
we're going to delete all these list
items
and instead we're going to bring down
this piece of code
however we get a compilation error
because this expression is not allowed
in the middle of a jsx markup in jsx we
can only use HTML elements or other
react components so to render data
dynamically we need to wrap this
expression in braces
okay
now save the changes
our code got reformatted so Predator
plugin broke down our code into multiple
lines and added parentheses to wrap them
now back to the browser here's our list
of cities beautiful while reviewing this
video I just realized that I made a
mistake earlier and forgot to apply a
CSS class to our list items that's why
we have lost styling here but don't
worry I'll fix that in a later video
however if we right click anywhere on
this page and go to inspect
this is Chrome developer tools you
should probably be familiar with it here
on the console tab we have a warning
saying eat child in a list should have a
unique key prop what does this mean well
back to our code this is where we are
mapping each item to a list item
here the warning is saying that each
list item should have a key prop or key
property that uniquely identifies that
item react needs this to keep track of
our items so later when we add or remove
items dynamically react knows what part
of the page should be updated so when
rendering a list of items using the map
method we should give each item a unique
key now in this case each item has a
unique string so we can use the item
itself as a unique key but in a real
world application where we retrieve
items from an API quite often each item
has a property like ID
we don't have that in this case so we
don't have to worry about it now back to
the browser let's refresh the warning is
gone and here's our list beautiful
[Music]
sometimes we want to render different
content based on certain conditions for
example here we can add an if statement
and say if items the length equals zero
perhaps we want to show the user a
different message so here we can return
a completely different markup for
example we can add a paragraph and here
we say no item found
now to make sure this works I'm going to
change the constant to a variable so we
can reassign this on the next line
okay now back in the browser so here we
have no item found beautiful but our
heading is gone
so we can come back here and add our
heading as well
list and now we need to wrap this entire
expression inside a fragment so let's
add a fragment
okay now if I save the changes Predator
reformats our code and here once again
we have parenthesis for spreading this
code over multiple lines
with this our heading is back but I
don't like this implementation because
we have a bit of duplication and
generally speaking duplication in code
is not considered a good practice so let
me show you a different way to achieve
the same result
we're going to get rid of the if
statement
instead we're going to render things
conditionally inside our jsx expression
however inside this jsx expression we
cannot write an if statement because as
I told you earlier here we can only use
HTML elements or other react components
The Only Exception is
braces with braces we can render
anything dynamically so here we can use
the ternary operator in JavaScript so we
start with our condition items the
length equals zero then we type a
question mark if this condition is true
we're going to return a paragraph with
this message
otherwise
we're going to return null meaning
nothing will be rendered with this
we have the same result as before and
our implementation is a little bit more
concise
now sometimes this logic can get a
little bit too complicated and it can
pollute our jsx markup in those cases we
can always extract this logic and store
it in a separate variable or constant
for example here we can declare a
constant called message
Now we move this expression
right here
and then we can simply render our
message constant in our jsx markup so
now our j6 markup is a little bit
cleaner now we can also move this logic
inside a function for example we can
declare a function called get message
and here I'm using the arrow function
syntax
now we can move this logic right here
and now we don't need this constant
anymore
so here we have a function and we can
call that function to get the right
message now the benefit of using F
function in this case is that our
functions can have parameters so perhaps
we can get different messages depending
on different conditions so here we can
pass different arguments like one or
whatever and get a different message if
you don't have that scenario it's better
to use a constant in this case
now let me revert this code back to the
previous state
I'm going to move this expression
right here
so I can show you a more concise way to
write the same code
so let's remove this function
okay look this piece of code is fine and
it works but the part that bugs me a
little bit is the second part returning
null here let me show you a better way
to write this code we start with our
condition items that length we call zero
now instead of using the ternary
operator instead of using a question
mark we do a logical and between this
condition and the value that we want to
return if this condition is true that is
the paragraph element
okay
with this implementation we don't have
the null keyword and our code is a
little bit more concise but how does
this work well let's go back to the
browser and open up Chrome developer
tools
here in the console tab this is going to
be our JavaScript playground if you have
a Boolean value like true
and perform a logical and with another
value like one
see what happened the result of this
entire expression is equal to the second
value what if we type true and mosh
the result of the expression is mosh now
what if you have false and mush
the result is false so what does this
mean well that means if our condition is
true the result of this entire
expression will be our paragraph element
but if the condition is false the result
of the entire expression will be false
and nothing will be rendered on the
screen so this is a very common
technique react developers use to render
content dynamically okay with this we
can remove the slide and this is our
final implementation
foreign
[Music]
now let's see how we can handle click
events in a component first I'm going to
remove this line so we bring back our
items good now I just realized that
earlier I made a mistake and forgot to
apply one of the Boost trap classes to
these items so back to our code this is
where we're rendering a list item we
should give this a class of
list Dash group Dash item
okay that's better now we want to be
able to click on each item and see it on
the console in react each element has a
property or a prop called on click
so here is that on click to braces now
inside the braces we can write an arrow
function so a function with no
parameters
and here we can just say console.log
clicked as simple as that now I'm going
to save the changes so the code is
reformatted so now each property or each
prop is on a separate line okay now back
to the browser we had an internal server
error from this web server don't worry
about it just refresh error is gone now
if we click on each item we see this
message beautiful but what if you want
to see the actual item that was clicked
well
look this is where we are mapping each
item to a list item so when creating
this list item we have access to each
item because we are using that item as
the key of each list item right so
instead of logging clicked we can simply
log item
now if we click on each item we see it
on the console beautiful and by the way
when mapping items we can optionally add
a second parameter as an index and with
this we can see the index of the item
that was clicked so let me show you I'm
going to clear the console now if we
click on each item we can also see its
index in the array lovely
now this Arrow function can optionally
have a parameter that represents the
browser event we can call that e or
event whatever we prefer
now let's log this on the console and
see what we get
so clear click look the type of this
object is synthetic base event I know
it's a fancy term this is one of the
built-in classes in react because
different browsers have different
implementations of event objects so to
make this cross browser react team have
created a class called synthetic bass
event that is a wrapper around the
native browser event object now if you
look at the properties of this object
you see properties that you're probably
familiar with for example we have client
X and client Y which represent the
position where we clicked
we also have type which represents the
type of event we have Target which is
the element where I clicked that was a
list item with this class
now our event handling logic here is
very simple it's just a one-liner so
writing a function here is totally fine
but if our logic gets more complex we
don't want to write that logic here in
the middle of a jsx markup instead we
should move that logic into a separate
function so
in this component we declare a function
by convention we start with the word
handle and then we specify the type of
event in this case click
now we set this to
let's grab this piece of code
and paste it here
now we have a warning from the
typescript compiler saying parameter
event implicitly has an any type so the
reason I know this is a typescript issue
is that here we have Ts that is short
for typescript but why are we getting
this warning well the reason we're
getting this error is that the
typescript compiler doesn't know the
type of this parameter is event a number
is it a string is it an object what is
it so if we use the dot operator we
cannot see any properties of this event
object this is where we need to specify
the type of our parameter so we get Auto
completion and type safety so let's
hover our Mouse over this event
parameter look the type of this
parameter is react.mouse event so when
we pass an inline function here the
typescript compiler knows the type of
our parameter that is why we didn't get
a warning earlier but in this case we're
declaring a brand new function the
typescript compiler doesn't know where
we're going to use this so it doesn't
know the type of this parameter so we
should go on the top add import
mouse event from react
and then after the parameter we type a
colon followed by its type this is
called type annotation in typescript so
we type annotation we can specify the
type of variables parameters and so on
now with this annotation
if we use the dot operator we can see
all the properties of this mouse event
object this is one of the beauties of
typescript we get Auto completion we get
type safety and it's easier to refactor
or restructure our code you'll see more
examples as we go through the quest
so let's finish this example
so now we have a function here this
function is called an event handler
because its job is handling an event in
this case The Click event
now over here
we're going to remove this inline
function and simply reference our handle
click function note that I'm not calling
this function we don't want to call it
we just want to pass a reference so
you're telling react that whenever the
user clicks on this event this function
should be caught so calling this
function will be done later at runtime
now let's make sure everything is
working so let's click on one of these
items beautiful
[Music]
all right now the next step when we
click on an item we want to highlight it
to do that we have a CSS class in
bootstrap called active so back to our
code this is where we are rendering a
list item I'm going to give this a
second class called active now
look all of them are highlighted or
activated this is not what we want we
want to highlight one item at a time to
do that we need a variable to keep track
of the index of the selected item so
back to our component
let's declare a variable
called selected index we can initialize
this to negative one that means no item
is selected if we set this to zero that
means the first item should be selected
now down here
we can render this active class
dynamically so we're going to use the
same technique you learned in the
conditional rendering lesson so I'm
going to remove
the quotations here we add braces so we
render content dynamically here we can
check the selected index if it equals
the index of the current item
that means that items should be active
so we're going to give it two classes
list group item and active
otherwise we should only give it the
list group item class
this is a very simple way to add classes
dynamically there are other more
Advanced Techniques let's not worry
about them at this stage let's just see
if this works or not so back to the
browser now the first item is selected
beautiful now when we click on an item
we should change the selected index so
this is very good handling the click
event now in this case we need a simple
error function to update the selected
index so I'm going to get rid of this
handle click function so we deleted from
here
as well as here
we should also delete
the mouse event import on the top okay
so always pay attention to cleaning up
your code so here we write a simple
arrow function and here we set selected
index to the index of the current item
okay now back to the browser let's click
on item
nothing is happening why is that well
this variable we have declared here is
local to this function component so
react is not aware of it it's like a
little secret inside this component to
solve this problem we should tell react
that this component is going to have
data or state that might change over
time and to do that we have to use one
of the built-in functions in react
called use state so when we type this
here and press enter it gets imported on
the top okay now this function is called
a hook
a hook is a function that allows us to
tap into built-in features in react so
this is called the statehook we have
other hooks that you will learn about as
we go through this course using the
state hook we can tell react that this
component can have data or state that
will change over time so instead of
declaring a variable this way we're
going to call this function
that we're going to initialize our
variable we can give it the initial
value of negative one
now this returns an array
in this array we're going to have two
elements the first element is going to
be a variable like our selected index
variable
and the second element is going to be an
updater function using that updater
function we can update this variable and
at that point react will be notified so
it knows that the state of our component
is changed and then it will re-render
our component which causes the Dom to be
updated under the hood so as I told you
earlier in the course with react we
almost never have to touch the Dom
directly we think in terms of components
that have state when the state of a
component changes react will update the
Dom to match the new component State
okay now let's see how we can use this
so instead of working with two
individual elements here it's easier to
destructure this array into two elements
so the first element is going to be
select an index and the second element
is going to be a function which we call
set selected Index this is a convention
we follow in react applications so here
we have a state variable called selected
index and here we have a function called
set selected index now as another
example we can use the state hook to
declare another variable called name so
we call view state
we can initialize the name to an empty
string this returns an array which we
can destructure into two elements name
and set name
that's the idea now in this case we
don't need a name variable so let's
delete this line
and the comment and the slide
so here we have a state variable called
selected index now down here
to update this variable we're going to
call set selected index and give it
the new index
with this when we click on an item it
gets selected beautiful
so this is how we tell react that our
component can have state that will
change over time now one thing you need
to know about component state is that
each component is going to have its own
state so if we go back to our app
component and add another instance of
our list group here
each list group is going to have its own
state so
in our first list group Paris is
selected but in our second list group
nothing is selected because this
component has its own state so there
will be independent of each other okay
now we don't need to list groups here so
I'm going to remove the second one
[Music]
so we're showing a list of cities here
but what if we want to show a list of
names or a list of colors we don't want
to recreate a separate component for
each type of list right so how can we
make this component reusable this is
where we use props or properties props
are the inputs to our components so back
to our code
instead of defining these items here we
should be able to pass them as an input
to this component just like how we can
call a function and give it an argument
now the same principle applies to this
heading instead of hard coding this
label here it would be nicer if you
could pass different labels like cities
names colors and so on so how can we do
that well first we need to decide the
shape of the input to this component so
we should be able to pass an object with
two properties items which is going to
be an array and heading which is going
to be a string to do that we use one of
the typescript features called an
interface using an interface we can
Define the shape or the interface of an
object so you start with the interface
keyword give this a name by conventional
use props but some people prefer to
prefix it with the name of the component
so list group props either way it works
I prefer a shorter name
that he Embraces would define various
properties and their types so we want to
have items which is going to be an array
of strings so string array and heading
which is going to be a string
so once again we're using type
annotation to specify the type of
various properties okay
now we don't need this comment anymore
next we give this function a parameter
called props of type props
now if we go back to our app component
we have two compilation errors saying
type is missing the following properties
from type props items and heading so the
typescript compiler is saying that this
component expects two properties which
are items and heading we have not
specified them this is yet another
benefit of using typescript so the
typescript compiler is reminding us that
we have forgotten to pass these props so
it's helping us to catch a bunch of
potential errors at compile time before
running our application
so back to our list group
I'm going to grab the list of items and
move it to
the app component
now we can pass this just like how we
said the attributes of HTML element so
we set items to we add braces so we can
reference this variable
now similarly we should also set the
heading to
series
now in this case I'm using quotation
marks but we could also wrap this in
braces but this is unnecessary because
we're passing a static value
so let's rewrite it that's better now
the compilation error is gone so back to
our list group component
now there are a couple of issues here we
don't have the items variable anymore so
we have to prefix it with props dot okay
but we have to do the same thing here
this looks a little bit repetitive and
ugly a better solution is to destructure
this parameter right here so we remove
the name and add braces and pick the two
properties items and heading now we have
access to these properties anywhere in
this function so we can remove props Dot
and our code is cleaner
now the final part is to replace the
list with
The Heading dynamically okay
back to the browser our app still
working so using props we can pass data
to our components
foreign
our list group component is in a fairly
good shape when we click an item it gets
selected but in a real world application
quite often something should happen
after an item is selected perhaps we
want to filter a list of objects or
maybe we want to redirect the user to a
different page so something should
happen after an item is selected now
what happens is different from one
application to another there is no
one-size-fits all so we don't want to
implement that piece of logic inside our
list group component because then it's
not going to be a reusable component
anymore so we need a mechanism to notify
the consumer or the parent of this
component that an item is selected in
this case the consumer or the parent of
this component is our app component this
is where we are using the list group so
when an item is selected we should
notify the app component that an item is
selected but how can we implement this
well that's very easy so look at our
props object currently we have two
properties and we are using these to
pass data to our list group component
now we can add a third property which is
going to be a function now down here
when we select an item we're going to
call that function with this our app
component will be notified let me show
you how this works it's really simple
so first let's define the signature of
that function let's imagine that we want
a function that takes a parameter called
item of type string that is the selected
item
and returns void so it doesn't return a
value so here we have a property by
convention we start with the word on and
then we specify the type of event in
this case select item this is just like
the on click prop that you saw earlier
but here we have on select item
so we have a property called unselect
item the type of this property is a
function
that has a parameter of type string and
returns void okay
with that now we have a compilation
error in our app component how can I
tell look it turned red also we can go
to the top under View
open up the problems panel
so the typescript compiler is telling us
that in the app component we have
forgotten to pass this prop so once
again the typescript compiler is helping
us catch a lot of potential problems
early on so let's go back to our app
component
now here we set on select item we can
write an inline function here just like
how we handled the click event earlier
or we can write a separate event handler
if you want to write a separate event
handler
again just like before by convention we
start with the word handle and then we
specify the type of event select item
now we set this to a function with a
signature that we just defined so item
of type string goes to nothing now here
we can just do a console.log
and print the item on the console now we
can pass that down here
handle select item now the last step
back to our list group over here when
destructuring the props we should pick
the on select item property
and then
When selecting an item
we should call this function
so we call this and pass the selected
item which is
this item variable here
now back to the browser when we select
an item the app component is notified
and it's now printing the name of the
selected City on the console
[Music]
now let's talk about the differences and
similarities between props and state as
you have seen props or properties are
the inputs or arguments passed to a
component State on the other hand is the
internal data managed by a component
that can change over time so Props are
like functional arguments and state is
like local variables inside a function
now one thing you need to know about
props is that we should treat them as
immutable what does this mean in English
to mute it something means to change it
so mutable means changeable and
immutable means unchangeable so when we
say something is immutable it means it's
read only so in our list group component
here are our props we should not change
any of them here we should not set the
heading to a new value if we do so
nothing is going to happen nobody is
going to yell at us but this is an
anti-pattern in react you will
understand the philosophy behind this as
we go through the course this is based
on functional programming principles so
we should treat props as immutable or
unchangeable State on the other hand is
mutable and that's the whole purpose of
using State variables we want to tell
react that this component has data that
can change over time right so these were
the differences between State and props
but one thing they both have in common
is that anytime they change react will
re-render our component and update the
Dom accordingly
[Music]
sometimes we want to pass children to a
component just like how we are passing a
list group to this div element here so
in this lesson I'm going to show you how
to create a component that can accept
children
so
back to our components folder let's add
a new file called alert.tsx
now let me show you a shortcut instead
of defining a function here and then
exporting it
we can use a shortcut
so here in the extensions panel if you
search for es7 plus you will find this
extension
it's called es7 plus react Redux and
react native it's a very popular
extension look at how many times it's
been downloaded so once you install this
you can type RAF CE now it's not coming
up I don't know why so let's close this
file and open it one more time
now let's try again good so this is
short for react Arrow function component
export so if you press enter we get this
code snippet lovely now here we have
multi-cursor editing so we can change
the name of the component
if you made a mistake but in this case
no so let's go back to alert and then we
press escape to exit multi-cursor
editing good now we don't need to import
react on the top
so here's our alert component now let's
add this to our app component and test
our application up to this point so we
go to the app component
that we're done with our list group for
now so let's delete all the code here
now inside this div we want to add an
alert so let's add alert
good now back to the browser so here's
our alert component lovely now to
display an alert we're going to borrow
some code from bootstrap
so head over to bootstrap website go to
the docs and here on the left side under
components
you should find alerts so let's find out
the markup we need to render an alert
like this so that is very
straightforward we need a div with two
classes the base class is alert that all
of these have the second class is a
class that determines the color so if
you use alert primary we get this Blue
Alert by default
so back to our alert component let's
give this div a couple of classes alert
and alert
primary
all right this is what we get lovely now
we need to make this Dynamic so we want
to pass the text as a prop to do that
first we need to use an interface to
define the shape of props so Props here
we need a property called text of type
string
then we add a parameter here of type
props
in fact it's better to de-structure this
and grab the text property
and render it right here
okay now back to our app component
here we should set the text to something
like
hello world
before going further Let's test our
implementation
okay it's working lovely
now while this works this way of passing
text to this component is kind of ugly
what if the text is a bit too long what
if you want to pass HTML content passing
HTML content has a prop like this is
kind of ugly wouldn't that be nicer if
you could pass text as a child to this
component let me show you how so we want
to be able to use this component like
this this is better so to do that we go
back to our component
now there is a special prop that all
components support and it's called
children so if you simply rename text to
children now we can pass our text as a
child to this component but we have a
couple of Errors because we need to
rename these two references to text so
I'm going to rename them both in one go
good there is our con and our
application is still working lovely now
what if you want to pass HTML content
here
we get a compilation error because we
told the typescript compiler
that the children prop is a string but
in this case we are not passing a string
we are passing a more complex structure
to solve this problem
we need to change the type of children
from string to react node now here in
order completion box we have two react
nodes the first one is an abbreviation
so if you press enter here we get this
markup this is not what we want we want
the second item this is the react node
class defined in the react module so
let's import it on the top like this and
with that we can pass HTML content to
our alert component
so to recap using the children prop we
can pass children to a component
[Music]
all right the last thing we're going to
cover in this section is react Dev tools
which is a very useful browser extension
for inspecting and analyzing our react
applications it's available for Chrome
Firefox and Microsoft Edge so simply
Google reactive upper tools or reactive
tools and install it in your browser
once you do that then go back to this
page here in the dev tools you will see
a couple of new tabs one is components
the other is profiler now look at the
components tab here we can see the
hierarchy of our components so on the
top we have the app component and below
that we have the alert component so this
is the component tree that react takes
and renders in the actual Dom now down
here you can see the props of this
component so here we have the children
prop which is set to an array of two
objects the first element is a string
the second element is a span object
below that you can see how this
component was rendered so it was
rendered by the app component now
finally down here you can see where this
component is implemented in this case in
app.tsx but that is not visible in my
recording window now in a large
application with a lot of components
finding the right component might be a
little bit tedious so we can always
search for them here also here we have a
couple more useful features for example
we can select a component and inspect
the matching Dom element so if you click
this and then go to the elements tab
we can see the matching Dom element that
represents this component now back to
the components tab
there's also another useful feature here
so we can select the component and click
on this icon to see its source code so
in this case this is our alert component
so it's pretty straightforward it
doesn't really need more explanation as
you're building applications if you want
to better understand your components and
how they work if you want to inspect
their props and state use reactive tools
[Music]
all right now it's your turn I want you
to create a bootstrap button component
so here on bootstrap website if you look
at the buttons page you can see we have
different types of buttons now for this
exercise I want you to only focus on
this set of buttons because here we have
other flavors don't worry about them
don't worry about the sizes or outline
buttons just simple bootstrap buttons
now the markup is really simple each
button has two classes one is BTN which
is a base class and the other is a class
that identifies the color so by default
primary buttons are blue secondary
buttons are gray and so on so I want you
to encapsulate this markup inside a
reusable react component so span a few
minutes on this then be sure to come
back and see my solution as I'll be
showing you a really cool typescript
technique
all right here in the components folder
we add a new file called button.tsx
now we use our shortcut rough C
good next we rename div to button and
give it a couple of classes now I'm
typing a little bit too fast because I'm
assuming you have already done your
exercise so I'm not expecting you to
code along with me okay so here we have
two classes for now let's just stick to
primary buttons and then we make this
Dynamic so this is the approach I want
you to take while building applications
one step at a time don't try to do too
many things together okay so for now I
just want to render a basic button I
don't even want to make the text Dynamic
let's see if our application works up to
this point
so we go to our app component
and in this div we add a button
component okay
now back to the browser here's our
button beautiful so the first step is
done now the next step is to make the
text or label Dynamic so back to our
button component here we need to use an
interface to define the shape of props
now I want to use the children prop here
so we can pass the text just like HTML
buttons so I'm going to set the type of
children to string
we could also use react node but I
prefer to use a string in this case
next we add the props parameter and
de-structure it
and finally we render children right
here
good now we go back to our app component
and give this button a label like my
button
let's see if our application is working
good again don't worry about these
errors everything is good so far next we
need to handle the click event because
in a real run application when this
button is clicked we have to do
something what happens next should not
be implemented in our button component
otherwise it's not going to be reusable
okay so back to the button component
here in the props object we need to add
a new prop called on click
and this is going to be a function with
no parameters that returns void
next we added here on click and finally
we set the on click prop of the HTML
button to the function that is passed
from the outside so on click is going to
be a function that is passed from the
outside so the parent of this component
is going to pass that function we get
that function and simply pass it to this
HTML button okay now in our app
component we have an arrow because we
haven't set the unclick prop
for now I just want to add a simple
inline function
and log clicked on the console
let's see if our application is working
so click click click beautiful now the
final step is implementing the color so
we want to be able to pass the color of
this button from the outside like this
so we can set it to primary or secondary
or whatever
so let's add a new prop called color
of type string I prefer to sort these
props in alphabetical order it makes our
code a little bit easier to read That's
nicer
next we add the color prop here and we
use that to add the second CSS class
dynamically so we wrap the codes in
braces
we terminate our string here and then
append the color right after okay we
have a compilation error because this
quotation mark is unnecessary good now
in our app component we have set the
color to secondary let's see if it's
working good if we change it to primary
it's still working great now what if you
want to give this a default value so we
don't have to specify the color every
single time
to do that we go to our button class and
give this color prop that default value
of primary
with that we get this blue button
beautiful however we have a compilation
error in the app component saying
property color is missing in type so
even though
we gave this prop a default value the
typescript compiler still expects us to
set the color prop when using the button
component to solve this problem we have
to tell the typescript compiler that
this property is optional so we add a
question mark after and now
the area is gone okay now what if we
pass an invalid color here like let's
say react what happens
well there are no errors or Warnings but
this is not how a button supposed to
look like this is where we can use
typescript to catch this kind of bugs
early on before we deploy our
application let me show you how so back
to our button component instead of
setting the type of color to string we
can set it to a string literal like
primary and with this we can only set
this property to the value of primary so
if you set it to something else we get a
compilation error now we don't want to
be limited to primary we want to support
other colors so here we can use the
union operator and add a second string
literal so we can add secondary we can
also add danger success and other
bootstrap colors with this
implementation we can only set this
property to one of these values and
nothing else so if we set it to react
for example the typescript compiler is
yelling at us we can see this file
turned red and also if we go to the view
menu and look at the problems panel we
can see that we have a problem in this
file so now if we change this back to
primary or secondary or one of the
supported values the arrow goes away
[Music]
all right here's the next exercise I
want you to write the necessary code so
when we click this button we see an
alert and here we have a close button
when we click it the alert disappears
this is a great exercise for you to
practice pretty much everything you have
learned in this section now let me give
you a hint on bootstrap website
look at the alerts component on the
right side you will find a link called
dismissing now
down here
you can see that to make an alert
dismissable you need to add a class here
called alert dismissable you should also
add
a button this is the close button with
this class and other stuff
so spend a few minutes on this then come
back see my solution
all right this is so much fun so here in
the app component right above our button
we're going to add an alert
and here let's say my alert now before
going any further I just want to test
our implementation up to this point I
don't want to show or hide anything I
just want to make sure if we can see an
alert beautiful now we don't want to
show this at all times we want to show
this only when this button is clicked to
do that we need a state variable
here in the app component that
determines the visibility of the alert
so we want to render this part only if
that variable is true
so here we need to use the state hook
to declare a state variable we
initialize it to false so our alert is
initially hidden now this returns an
array that we can de-structure into two
elements we can call the first one alert
visible
and the second one set alert visibility
you could call them anything whatever
you prefer now we want to render
the alert only if alert is visible alert
visible is true
sober wrap is Embraces and perform a
logical and between alert visible and
this expression so alert visible
and okay
now when we click the button instead of
logging something on the console we
simply call set alert visibility to true
so set alert visibility to true
let's see if our implementation is
working
all right now we click and here's our
alert beautiful let me explain how this
works
so when we click on this button this
function is called at this point we set
our state variable to true so the state
of this component is changed and react
will re-render this component and all
its children this is why we see the
alert now we need to add the close
button to the alert so here on bootstrap
website I'm going to copy some code
I'm going to grab this class so there
are no typos let's add that
to our alert
component
okay we also need a close button
I'm going to copy that from this website
as well
paste it here
we just need to rename class to class
name
good now once again before we implement
the hiding logic first we want to test
our application and make sure that we
can see the close button so one more
time click okay here's a close button
now the final part when we click this
button we should notify the app
component that the user clicked on this
button at that point the app component
will set the visibility of the alert to
false which will cause the app component
and all its children to re-render
so to notify the parent or the consumer
of this component that the user has
clicked on the close button here we need
to add a new prop
on lows so remember the convention we
start with the word on and then we
specify the event in this case close
this is going to be a function with no
parameters that returns void
now we need to add that here
and finally
when the user clicks on this button
so unclick we simply call on close and
more accurately we are not calling this
function we're not calling it like this
we're just setting on click to unclose
so on close will be a function that is
passed from the outside from the parent
we pass that function to this prop when
the user clicks on the close button
react will call that function for us
okay now we have a completion error in
the app component because we haven't set
the unclose prop
pass
and error function and set alert
visibility
to false
as simple as that okay now
the final test click click lovely
congratulations you made it to the end
of this tutorial I hope you found it
helpful and learned a lot about react
but wait there is more this tutorial was
just a small part of my complete react
course the full course includes eight
hours of content and is jam-packed with
the latest tools and best practices
you'll get access to exercises summary
notes cheat sheets and a project I
showed you at the beginning of this
tutorial and if you're not completely
satisfied no problem the course comes
with a 30-day money-back guarantee so
there is no risk in giving it a try so
if you are serious about master react I
encourage you to check out the full
course using the link below this video
thanks for watching and happy coding
[Music]
Loading video analysis...