Component State

5 minutes
Share the link to this page
Copied
  Completed
You need to have access to the item to view this lesson.
One-time Fee
$69.99
List Price:  $99.99
You save:  $30
€65.43
List Price:  €93.47
You save:  €28.04
£55.38
List Price:  £79.12
You save:  £23.73
CA$95.75
List Price:  CA$136.80
You save:  CA$41.04
A$107.11
List Price:  A$153.03
You save:  A$45.91
S$95.36
List Price:  S$136.24
You save:  S$40.87
HK$547.90
List Price:  HK$782.75
You save:  HK$234.85
CHF 63.27
List Price:  CHF 90.39
You save:  CHF 27.12
NOK kr772.60
List Price:  NOK kr1,103.76
You save:  NOK kr331.16
DKK kr487.88
List Price:  DKK kr697.01
You save:  DKK kr209.12
NZ$117.84
List Price:  NZ$168.36
You save:  NZ$50.51
د.إ257.06
List Price:  د.إ367.25
You save:  د.إ110.18
৳7,700.43
List Price:  ৳11,001.09
You save:  ৳3,300.65
₹5,837.33
List Price:  ₹8,339.41
You save:  ₹2,502.07
RM333.67
List Price:  RM476.70
You save:  RM143.02
₦92,489.99
List Price:  ₦132,134.22
You save:  ₦39,644.23
₨19,533.24
List Price:  ₨27,905.82
You save:  ₨8,372.58
฿2,588.46
List Price:  ฿3,697.97
You save:  ฿1,109.50
₺2,275.23
List Price:  ₺3,250.47
You save:  ₺975.23
B$358.08
List Price:  B$511.57
You save:  B$153.48
R1,314.42
List Price:  R1,877.82
You save:  R563.40
Лв127.95
List Price:  Лв182.79
You save:  Лв54.84
₩96,452.39
List Price:  ₩137,795.03
You save:  ₩41,342.64
₪267.23
List Price:  ₪381.78
You save:  ₪114.54
₱4,034.64
List Price:  ₱5,764.02
You save:  ₱1,729.38
¥11,065.06
List Price:  ¥15,807.91
You save:  ¥4,742.85
MX$1,201.03
List Price:  MX$1,715.83
You save:  MX$514.80
QR255.83
List Price:  QR365.49
You save:  QR109.65
P965.79
List Price:  P1,379.76
You save:  P413.97
KSh9,296.24
List Price:  KSh13,280.92
You save:  KSh3,984.67
E£3,349.82
List Price:  E£4,785.67
You save:  E£1,435.84
ብር4,026.64
List Price:  ብር5,752.60
You save:  ብር1,725.95
Kz58,375.85
List Price:  Kz83,397.65
You save:  Kz25,021.80
CLP$66,628.33
List Price:  CLP$95,187.41
You save:  CLP$28,559.08
CN¥507.11
List Price:  CN¥724.48
You save:  CN¥217.36
RD$4,113.13
List Price:  RD$5,876.15
You save:  RD$1,763.02
DA9,393.54
List Price:  DA13,419.92
You save:  DA4,026.38
FJ$158.35
List Price:  FJ$226.22
You save:  FJ$67.87
Q545.71
List Price:  Q779.62
You save:  Q233.91
GY$14,678.83
List Price:  GY$20,970.66
You save:  GY$6,291.82
ISK kr9,808.34
List Price:  ISK kr14,012.52
You save:  ISK kr4,204.17
DH708.72
List Price:  DH1,012.51
You save:  DH303.78
L1,243.72
List Price:  L1,776.81
You save:  L533.09
ден4,025.16
List Price:  ден5,750.48
You save:  ден1,725.31
MOP$565.76
List Price:  MOP$808.27
You save:  MOP$242.50
N$1,323.80
List Price:  N$1,891.23
You save:  N$567.42
C$2,582.07
List Price:  C$3,688.83
You save:  C$1,106.76
रु9,353.99
List Price:  रु13,363.42
You save:  रु4,009.42
S/263.57
List Price:  S/376.55
You save:  S/112.97
K270.82
List Price:  K386.91
You save:  K116.08
SAR262.49
List Price:  SAR375
You save:  SAR112.51
ZK1,859.31
List Price:  ZK2,656.27
You save:  ZK796.96
L325.94
List Price:  L465.65
You save:  L139.71
Kč1,644.39
List Price:  Kč2,349.23
You save:  Kč704.84
Ft25,663.75
List Price:  Ft36,664.08
You save:  Ft11,000.32
SEK kr762.14
List Price:  SEK kr1,088.81
You save:  SEK kr326.67
ARS$61,304.48
List Price:  ARS$87,581.58
You save:  ARS$26,277.10
Bs486.59
List Price:  Bs695.16
You save:  Bs208.56
COP$277,527.04
List Price:  COP$396,484.19
You save:  COP$118,957.15
₡35,650.64
List Price:  ₡50,931.67
You save:  ₡15,281.02
L1,732.56
List Price:  L2,475.19
You save:  L742.63
₲522,432.19
List Price:  ₲746,363.69
You save:  ₲223,931.50
$U2,704.33
List Price:  $U3,863.50
You save:  $U1,159.16
zł282.07
List Price:  zł402.98
You save:  zł120.90
Already have an account? Log In

Transcript

In this lesson, I'm going to do a deeper dive on components state. Before we jump in, let's go over where we left off. Okay To recap, we have a joke button that fetches a joke every time it's clicked, and we currently log the joke to the console. Next, I want to update our app so that the fetch joke is rendered to the screen. In order to do that, though, we'll need somewhere to store the fetched joke value. In a non react setup, you might think to store the value in a variable like so.

And when a new joke is fetched, I'm going to update the value of the joke variable with the fetch joke. If you call the joke API returns an object that includes ID joke and status. instead of storing the entire joke object, I'm just going to store the joke itself. I'm also going to log the value of the joke variable just to make sure it's updating. And lastly, I'm going to add a wrapper div element around our button. Insert a paragraph element and then set the contents of that paragraph to the value of our joke variable.

Okay, let's give this a try and see what happens. So we can see that our job variable is being logged in the console every time the button is clicked. But we're not seeing anything update on screen. How come? The reason we're not seeing any updates on screen is that react doesn't know anything has actually changed. React component will only rerender when its props, or state have changed.

In the case of our app component, a render occurs each time the app function is run by react, I'm going to add a console dot log to our app function. That way, we can see something logged every time the component renders. As you can see, render is logged out for the components initial render. But notice each time I click the joke button render is not logged out, even though the joke variable is updating. This is because changes to our joke variable are not being tracked by react and therefore aren't trigger a new render. It looks like if we want app to update when a job changes, we'll need to start joking either the components state or props.

So which one do we use in this case, props are passed into component and are read only meaning they can be changed, where a state holds information about the component and can be updated. With that being said state looks like the right choices we will be needing to update the job value as we go. Since functional components don't have access to state the first thing we'll need to do is convert app to a class component, start by changing the app function to a class that extends from react component. then convert joke into a class property. Next we'll need to convert the on tell joke function to be a class method instead. And then lastly, instead of returning elements directly, we use the render method and return elements from there instead.

And now that untell joke and joke are both class variables, we need to add this in front of them. Okay, it looks like we're rendering without errors, but let's try the joke button again. Looks like we broke something in code sandbox is nice enough to tell us exactly what there is cannot set property joke of undefined. It turns out we caused this error when we change the on tell joke function class method. This is because class methods aren't bound by default instance on tell joke is called from a click handler. The reference to this is no longer scoped to the component but to the button.

Hence, we get an error when trying to set a value on this thought joke. While there are multiple solutions to this issue. Choose to explicitly bind each method to the component in the constructor, or component doesn't have a constructor right now. So let's start by adding one. Since all components extend from reacts component class, you need to ensure that you call the super method before doing anything else. I'm going to take this on tell joke method and reassign it to a version of that method that is bound to the component.

So now even though on tell joke is called from a click handler, this will reference the component and not the button. Okay, with that fixed in place, let's go ahead and try our joke button again, awesome, no more errors. And now that our component has been successfully updated to a class component, we're ready to start using local state. Let's start by removing our old joke variable as is no longer needed. Instead, we're going to create a new job variable in our components state. When adding state values to your component.

I'll usually start by adding default values. This is done in the constructor by directly adding values to the components state property, I'm going to go ahead and add job to our state and set it to normal to start with, it's important to remember that this is the only time you should be modifying the component status. For state updates, you always need to use the component set state method, which will now use to update our state every time a new joke is fetched. Let's start by removing our reference to our old joke variable. Let's replace that with a call to this dot set state. Next, we'll pass that state an object with our updated state values.

In our case that will be passing in our new fetch job value. When using set state, it's better to think of it as a request rather than an immediate command to update the component. This is because state does not always immediately update the component it may batch or defer the update until later. This makes reading this state right after calling set state a potential pitfall to avoid these pitfalls with set state I recommend reading reacts official docs on the subject as it's a critical piece when dealing with more advanced react topics. Now that we've hooked up our set state calls, let's update our paragraph element to use the joke state instead of our old joke value. All right, let's see if that made a difference.

Nice. Now when we click the joke button, our new joke is being rendered to the screen. You'll also notice that render is now being logged every time I click the button. This is expected As each button unclick is triggering a state update and each state update triggers a rerender. Okay, that wraps up the introduction to component state. Next up, we'll take a look at another important react feature lifecycle methods.

Sign Up

Share

Share with friends, get 20% off
Invite your friends to LearnDesk learning marketplace. For each purchase they make, you get 20% off (upto $10) on your next purchase.