0 1 00:00:00,840 --> 00:00:06,750 Hey guys. In this lesson I want to talk about something that you might have come across or will come 1 2 00:00:06,750 --> 00:00:10,510 across at some point in your React development journey. 2 3 00:00:10,740 --> 00:00:15,250 And it's this comparison between hooks and classes. 3 4 00:00:15,390 --> 00:00:21,030 Now in order to really understand this we have to go back and to the very beginning. 4 5 00:00:21,030 --> 00:00:29,880 And so once upon a time in a land far far away, there were two ways of adding state into a React app. 5 6 00:00:30,840 --> 00:00:36,060 One way or what you might call functional components, look like this. 6 7 00:00:36,180 --> 00:00:39,150 And you should be pretty familiar with this by now. 7 8 00:00:39,150 --> 00:00:46,500 And it's a really well understood way of creating these separate React components. But you should 8 9 00:00:46,500 --> 00:00:53,520 be aware that there's also another way that you can in fact create React components. Instead of splitting 9 10 00:00:53,520 --> 00:00:56,250 individual components into functions, 10 11 00:00:56,280 --> 00:01:04,440 you can also create a class. And the only difference is the keyword, instead of function becomes class. 11 12 00:01:04,440 --> 00:01:08,350 Classes are not called, so they don't have these parentheses. 12 13 00:01:08,670 --> 00:01:17,070 And this class must extend something that comes from the React module something called component. 13 14 00:01:17,070 --> 00:01:25,650 And this turns your app class into a React component class. And in order to render what you want to see 14 15 00:01:25,680 --> 00:01:34,500 inside this component, you have to add your code inside a render method like so. That wasn't a big deal 15 16 00:01:34,620 --> 00:01:40,900 and it was just a few extra lines of code and we end up with exactly the same result. 16 17 00:01:41,010 --> 00:01:48,630 Now in the past, the main reason why people converted their functional components into class components 17 18 00:01:49,020 --> 00:01:54,450 was because it was required in order to have state. 18 19 00:01:54,480 --> 00:02:00,450 If you take a look at some of the documentation on state and lifecycle for example which are linked 19 20 00:02:00,450 --> 00:02:08,790 to, you'll see that in order to use state, it used to be that you had to convert your functions into a 20 21 00:02:08,790 --> 00:02:11,670 class just like what we did just now. 21 22 00:02:11,670 --> 00:02:15,510 So what does managing state using classes actually look like? 22 23 00:02:15,510 --> 00:02:18,660 Let me show you a simple counter map as an example. 23 24 00:02:18,780 --> 00:02:26,970 And so I've created a class component here of our counter app and all it does is it has a single button 24 25 00:02:27,360 --> 00:02:31,690 which increases the number of the count. 25 26 00:02:31,770 --> 00:02:39,600 So if I go ahead and replace my

with my class component, you can see that I'm using it in the same 26 27 00:02:39,600 --> 00:02:44,780 way as I would with my functional Component, just adding it in as a self closing tag. 27 28 00:02:44,790 --> 00:02:52,430 Now using this class component, I'm able to render a

and a button. 28 29 00:02:52,680 --> 00:03:00,180 And when this button gets clicked, it calls a function called increase. And increase will then in turn call 29 30 00:03:00,240 --> 00:03:08,100 a pre-built function called setState which allows us to pass over some new values to the object that 30 31 00:03:08,370 --> 00:03:10,870 is stored inside this property, state. 31 32 00:03:11,760 --> 00:03:18,570 Now this works exactly the same as what we would have done using hooks but you can see that involves 32 33 00:03:18,720 --> 00:03:24,390 a lot more boilerplate code and it's a little bit harder to reason about especially when you've got 33 34 00:03:24,390 --> 00:03:26,560 this all over the place. 34 35 00:03:26,640 --> 00:03:33,570 It also requires binding and it gets pretty complicated when you want to reuse some of your state functionality 35 36 00:03:33,690 --> 00:03:35,490 across different components. 36 37 00:03:35,520 --> 00:03:42,000 So back in 2018, the React team set about trying to solve this problem and many others. And they came 37 38 00:03:42,000 --> 00:03:49,140 up with the idea of hooks. And I strongly recommend to actually have a look at this page in the React 38 39 00:03:49,140 --> 00:03:56,580 documentation just so that you can watch the video and take a look at some of their concepts around 39 40 00:03:56,640 --> 00:04:03,300 why they decided to build hooks and why it's so awesome. 40 41 00:04:03,300 --> 00:04:10,590 Now what the React team recommends is that if you're writing new code that you should start using hooks 41 42 00:04:10,950 --> 00:04:16,720 instead of classes because this is a much easier way of managing state. 42 43 00:04:17,040 --> 00:04:22,060 It just makes the code much clearer and much easier to reason about. 43 44 00:04:22,080 --> 00:04:27,420 Now the thing to remember is that you can only use hooks with functional components. 44 45 00:04:27,420 --> 00:04:34,080 You can't use it inside a class component. But they do say that if you already have classes written for 45 46 00:04:34,080 --> 00:04:38,990 a React app, then you can use it alongside. Here 46 47 00:04:39,060 --> 00:04:47,910 I've written the functional component equivalent of our counter app here and you can see that at a glance 47 48 00:04:47,930 --> 00:04:51,570 firstly by using hooks, we're saving ourselves a lot of lines of code. 48 49 00:04:52,110 --> 00:04:57,490 And this is because it removes a lot of the boilerplate that's required in order to use classes. 49 50 00:04:57,540 --> 00:05:00,910 You'll see that there's no this keyword all over the place, 50 51 00:05:00,990 --> 00:05:07,830 you can see that the state is kept together in one constant and you've got the count and set count 51 52 00:05:07,950 --> 00:05:10,950 being destructed from our use state function. 52 53 00:05:11,100 --> 00:05:16,710 And all we have to do to change the count is to call set count if we want to use the count then we 53 54 00:05:16,710 --> 00:05:24,870 simply use it as the variable name itself. So this way we can create React apps that are entirely built 54 55 00:05:24,990 --> 00:05:31,050 using functional components instead of having a mix of functional components and then occasionally having 55 56 00:05:31,050 --> 00:05:38,340 to convert our functional components into class components just to be able to have a stateful app. 56 57 00:05:38,340 --> 00:05:43,500 But in the wild, you will occasionally see components built using classes. 57 58 00:05:43,500 --> 00:05:50,070 You will see this.state or .setState, but gradually what we're seeing is that the React community 58 59 00:05:50,100 --> 00:05:58,870 is really embracing this concept of hooks and new code and future code will be written in this format. 59 60 00:05:59,080 --> 00:06:05,290 So this is just a quick lesson to talk about these two different ways of managing state just so that 60 61 00:06:05,290 --> 00:06:09,890 when you come across classes in the wild you're not confused about what's happening. 61 62 00:06:09,940 --> 00:06:17,440 Most of the cases when people are telling you to write class component, it's to be able to use and set 62 63 00:06:17,530 --> 00:06:21,830 the state of an app which you can achieve in exactly the same way 63 64 00:06:21,850 --> 00:06:23,590 using this useState hook.