0 1 00:00:00,480 --> 00:00:07,020 Up till now in all of the apps that we've created where we've used state, I've actually tried to keep 1 2 00:00:07,020 --> 00:00:14,910 the component tree very simple. And in fact all that we have is just a single app component where everything 2 3 00:00:14,910 --> 00:00:16,360 is being rendered. 3 4 00:00:16,410 --> 00:00:24,000 Now we know from previous lessons that this is not how a React app will end up looking like. We would 4 5 00:00:24,000 --> 00:00:28,350 probably want to separate out this app into separate components. 5 6 00:00:28,350 --> 00:00:31,650 So we'd probably have a component for the heading area, 6 7 00:00:31,740 --> 00:00:38,880 we'd probably have one for this div with the input and the button, we'd probably then have each of these 7 8 00:00:38,970 --> 00:00:42,930
  • s being a separate component being rendered. 8 9 00:00:43,000 --> 00:00:45,600 So let's see how this would pan out. 9 10 00:00:45,630 --> 00:00:54,900 Go ahead and fork the starting sandbox and then go into your components folder and create a new component 10 11 00:00:55,170 --> 00:00:58,200 called ToDoItem. 11 12 00:00:58,460 --> 00:00:59,900 jsx. 12 13 00:01:00,190 --> 00:01:08,640 Now inside this to do item, I want you to take out the
  • and create a separate component. 13 14 00:01:08,970 --> 00:01:14,280 The behaviour that you're looking for afterwards is the ability to add new items to the list like so. 14 15 00:01:15,320 --> 00:01:17,250 Pause the video and I'll wait for you. 15 16 00:01:20,260 --> 00:01:20,640 All right. 16 17 00:01:20,670 --> 00:01:26,130 So first we're going to have to import React from react. Next 17 18 00:01:26,160 --> 00:01:31,740 we're going to create our function which is going to be called ToDoItem just like the name of the 18 19 00:01:31,740 --> 00:01:32,630 file 19 20 00:01:32,760 --> 00:01:40,580 and here we're going to return an
  • which is going to contain some text from the to do list. 20 21 00:01:40,590 --> 00:01:47,460 Finally we're going to export this as the default and the name is ToDoItem. 21 22 00:01:47,460 --> 00:01:57,810 Now we can go into our App.jsx and import are ToDoItem from ./ToDoItem. 22 23 00:01:57,860 --> 00:02:06,310 Alright so now we can use this component instead of this
  • when we want to render it. So we can add 23 24 00:02:06,400 --> 00:02:13,540 a self closing tag which is called ToDoItem, and then in order to display a different ToDoItem each 24 25 00:02:13,540 --> 00:02:19,720 time we map through our items array, we're going to pass this ToDoItem which is the text, 25 26 00:02:19,900 --> 00:02:28,040 this should display as a property. So we'll call it text maybe and set it equal ToDoItem. 26 27 00:02:28,900 --> 00:02:37,000 So now we can receive this text inside our ToDoItem as one of the props and instead of having this 27 28 00:02:37,000 --> 00:02:44,110 hardcoded text, I'm gonna open up a set of curly braces and happened to props.text. 28 29 00:02:44,110 --> 00:02:52,690 So now if we refresh our app and add buy milk, click add, you'll see it has exactly the same functionality 29 30 00:02:52,690 --> 00:02:59,860 as before but this time we've now got a separate component. And that's the solution to the challenge. 30 31 00:02:59,860 --> 00:03:05,800 This was a mini review of something we've covered already namely splitting our app into different components. 31 32 00:03:06,340 --> 00:03:12,430 But now that we know all about state, we need to start thinking about how our state is handled across 32 33 00:03:12,430 --> 00:03:18,270 the app and ToDoItem components. And this ToDoItem component 33 34 00:03:18,280 --> 00:03:25,960 at the moment is what you would call a stateless component because it's not trying to change itself 34 35 00:03:26,050 --> 00:03:27,490 or anything else. 35 36 00:03:27,490 --> 00:03:33,960 All it's doing is receiving some read only properties and it just displays them inside. 36 37 00:03:34,510 --> 00:03:40,780 Remember that props are read only so you can't for example say inside here. 37 38 00:03:40,900 --> 00:03:50,110 Let's say if we had a div and inside the div we had an inputs and let's say that this input had an on 38 39 00:03:50,110 --> 00:03:59,380 Change and when it gets called then we're going to trigger some code and we tried to modify the props 39 40 00:03:59,830 --> 00:04:04,970 and we say props equals new thing. 40 41 00:04:05,020 --> 00:04:08,290 This unfortunately does not work as I'll show you. 41 42 00:04:08,290 --> 00:04:09,690 So I add buy milk, 42 43 00:04:09,730 --> 00:04:14,140 so there's a new input that's been added as well because I'm adding a new to do item. 43 44 00:04:14,710 --> 00:04:22,690 And ideally when I start typing, it should update our props but it does not because props is read only. 44 45 00:04:23,620 --> 00:04:32,140 So we can't modify our props but what we can do though is we can have state inside these components. 45 46 00:04:32,140 --> 00:04:34,300 Here's a challenge for you. 46 47 00:04:34,480 --> 00:04:42,580 See if you can change the code just inside this ToDoItem file so that when you add a new to-do item 47 48 00:04:43,090 --> 00:04:49,540 and you click on it, it crosses out the item and then when you click on it again it uncrosses it out. 48 49 00:04:50,170 --> 00:04:56,320 So you've already seen what linethrough does when you change the text decoration to this particular 49 50 00:04:56,320 --> 00:05:02,950 value. It basically just crosses out the text. And you've learnt enough about state to be able to figure 50 51 00:05:02,950 --> 00:05:11,920 out when this
  • or this div gets clicked, how it should change this text styling. So you'll need to 51 52 00:05:11,920 --> 00:05:20,140 think about inline styling, ternary operators, conditional rendering, event handling and using state to 52 53 00:05:20,140 --> 00:05:23,320 complete this challenge. Pause the video now and give that a go. 53 54 00:05:26,490 --> 00:05:26,940 All right. 54 55 00:05:27,060 --> 00:05:33,800 So the first thing we need to do is test to see if we can change this
  • using inline styling. 55 56 00:05:33,840 --> 00:05:38,270 So let's tap into the style property and inside the style property 56 57 00:05:38,340 --> 00:05:39,590 let's add some code. 57 58 00:05:39,930 --> 00:05:47,190 So we're going to say that if we wanted the style to just be applied, then we could simply add a Javascript 58 59 00:05:47,310 --> 00:05:54,960 object as the code and the property was called textDecoration which of course has to be camel case 59 60 00:05:55,500 --> 00:05:59,660 and then the value was called line-through, 60 61 00:05:59,910 --> 00:06:02,010 and this is going to be a string. 61 62 00:06:02,010 --> 00:06:05,860 So let's add a new item and see if that works. 62 63 00:06:05,910 --> 00:06:06,840 So brilliant. 63 64 00:06:06,840 --> 00:06:08,580 That's now working. 64 65 00:06:08,580 --> 00:06:15,780 But we need this to be rendered depending on a condition. And that condition is whether if the user has 65 66 00:06:15,900 --> 00:06:23,580 clicked on this to do item. So you can either add a onClick to the list item or to the div. 66 67 00:06:23,580 --> 00:06:25,050 It really doesn't actually matter. 67 68 00:06:25,410 --> 00:06:31,740 So I'm going to add it to the div just to keep this code on one page and I'm gonna get hold of the on 68 69 00:06:31,740 --> 00:06:32,970 Click. 69 70 00:06:32,970 --> 00:06:40,590 And when that happens I'm going to call a function. And the function is going to be called handleClick. 70 71 00:06:42,330 --> 00:06:50,350 And that's what I'm going to trigger over here as well when this div gets clicked. 71 72 00:06:50,350 --> 00:06:59,260 I want to set a boolean maybe to true or to false depending on whether if this text decoration should 72 73 00:06:59,260 --> 00:07:08,680 be applied. Let's say that I had a constant called isDone and this isDone property is either true or 73 74 00:07:08,680 --> 00:07:16,180 false depending on whether if the user clicked on this div. And to set this isDone property, I'm going 74 75 00:07:16,180 --> 00:07:24,730 to have a function called setIsDone and I'm of course going to need to use state to achieve this. 75 76 00:07:25,990 --> 00:07:32,380 Now the initial value of isDone is going to be false because all items should start out being not done 76 77 00:07:32,740 --> 00:07:34,120 with no line through. 77 78 00:07:34,690 --> 00:07:42,820 But then if the user clicks on this div, then I should be able to handle this click and call setIsDone. 78 79 00:07:43,230 --> 00:07:48,040 And I want to set it to the opposite of what it currently is. 79 80 00:07:48,040 --> 00:07:57,010 So I can use an arrow statement to get the previous value and then I can return the opposite of the 80 81 00:07:57,010 --> 00:07:58,530 previous value. 81 82 00:07:58,780 --> 00:08:06,100 You can of course use a bunch of IF statements If previous value is true then return false, else return 82 83 00:08:06,100 --> 00:08:06,850 true. 83 84 00:08:06,850 --> 00:08:13,120 But actually a much easier way of doing this which you probably already know is to simply return the 84 85 00:08:13,240 --> 00:08:17,240 opposite of previous value like so. 85 86 00:08:17,290 --> 00:08:22,960 So this way if previous value is true then this is going to equal false, if it equals false then it's 86 87 00:08:22,960 --> 00:08:26,140 going to equal again the opposite. 87 88 00:08:26,400 --> 00:08:34,050 So now that we're handling click and we have our click added to our div, all we have to do now is to 88 89 00:08:34,050 --> 00:08:40,150 use this isDone to conditionally render this textDecoration. 89 90 00:08:40,230 --> 00:08:49,080 I'm going to say that this textDecoration if isDone is true ? should be the line-through 90 91 00:08:49,620 --> 00:08:54,760 but else the textDecoration should be set to none. 91 92 00:08:54,930 --> 00:09:01,890 This way effectively when this isDone is true, we're going to apply line-through text decoration, 92 93 00:09:02,160 --> 00:09:09,630 when this is false we're going to change the textDecoration back to none even if this was already applied. 93 94 00:09:09,630 --> 00:09:11,900 Let's go ahead and check our app. 94 95 00:09:12,000 --> 00:09:20,730 So add a new item, click add. Click on it, it gets striked through. Click on it again the text decoration 95 96 00:09:20,760 --> 00:09:23,320 becomes none. 96 97 00:09:23,360 --> 00:09:30,850 So this is all very well and good and we've now got state being managed inside our ToDoItem. 97 98 00:09:31,040 --> 00:09:35,180 But notice how the state is kind of localized to this item. 98 99 00:09:35,180 --> 00:09:37,070 It's not going anywhere else. 99 100 00:09:37,220 --> 00:09:44,420 What if we wanted to change the state of a parent component? Let's say that when this div gets clicked 100 101 00:09:44,420 --> 00:09:47,930 on, instead of just striking out the text, 101 102 00:09:47,930 --> 00:09:58,040 what if we wanted to delete it from our items array? How do we reach up from our ToDoItem into its parent 102 103 00:09:58,100 --> 00:10:09,700 the app component and somehow change this items array? So first I'm going to delete that isDone component 103 104 00:10:10,180 --> 00:10:15,720 and then I'm going to delete everything that's inside handleClick. I'm also going to delete my inline 104 105 00:10:15,790 --> 00:10:19,680 style as well. And I'm going to delete the useState as well 105 106 00:10:20,140 --> 00:10:23,980 so we're now back to a very simple ToDoItem. 106 107 00:10:24,190 --> 00:10:26,730 Now we're ready to tackle the next stage. 107 108 00:10:26,830 --> 00:10:33,580 How do we manage to add an item and when we click on it instead of striking it through, we're changing 108 109 00:10:33,580 --> 00:10:34,780 its styling? 109 110 00:10:34,780 --> 00:10:39,530 I actually want to affect the entire array and this is the desired behavior. 110 111 00:10:39,550 --> 00:10:42,770 I want to click on it and it should delete from my array. 111 112 00:10:42,910 --> 00:10:54,570 So if I had multiple items, say buy milk, buy eggs, buy bacon and I decide to check off buy eggs, that should 112 113 00:10:54,570 --> 00:10:56,970 be the only one that's removed from my array. 113 114 00:10:58,050 --> 00:11:01,440 Let's see how we can tackle this. 114 115 00:11:01,710 --> 00:11:08,970 The first thing to realize is that when we pass over props to our child components, we can also pass 115 116 00:11:09,030 --> 00:11:14,130 over functions which gets called by our child component. 116 117 00:11:14,130 --> 00:11:22,500 For example, when we create each to do item in addition to the text property, we can add another property. 117 118 00:11:22,950 --> 00:11:24,990 So we could call it anything we want, 118 119 00:11:24,990 --> 00:11:35,240 so say onChecked maybe. And we can set this equal to a function inside our app component. 119 120 00:11:35,240 --> 00:11:42,740 So let's say that we wanted to create a function called deleteItem and this was the function that 120 121 00:11:42,740 --> 00:11:46,740 we would pass to our child ToDoItem. 121 122 00:11:46,760 --> 00:11:56,270 So we'll call it deleteItem and then inside our ToDoItem we'll now be able to trigger, instead of handle 122 123 00:11:56,270 --> 00:11:59,300 Click which lives inside the ToDoItem, 123 124 00:11:59,300 --> 00:12:08,410 we can now trigger props.onChecked. And this means that it'll be able to trigger deleteItem inside 124 125 00:12:08,470 --> 00:12:10,670 all app component right here. 125 126 00:12:10,720 --> 00:12:13,080 So let's go ahead and just log this event, 126 127 00:12:15,820 --> 00:12:16,390 like so. 127 128 00:12:17,050 --> 00:12:24,370 So now when I add a buy milk, click Add, and when I click on it you can see that in my console I'm getting 128 129 00:12:24,370 --> 00:12:26,570 this message being sent. 129 130 00:12:26,590 --> 00:12:35,360 So this entire function is being packaged up and sent over to the to-do item under the prop onChecked. 130 131 00:12:35,440 --> 00:12:40,790 And then that prop is only triggered when this div detects a click. 131 132 00:12:40,960 --> 00:12:50,240 And now I can address what should happen when that item wants to delete itself from the array. If I wanted 132 133 00:12:50,240 --> 00:12:57,260 to delete an item from my items array, I'm probably going to need to call setItems. 133 134 00:12:57,260 --> 00:13:05,300 And inside this set items, I'll need to get hold of the previous items and open up a set of curly braces 134 135 00:13:05,360 --> 00:13:07,810 for my arrow function. 135 136 00:13:08,090 --> 00:13:14,210 Now how can i delete the item that requested the deletion? 136 137 00:13:14,430 --> 00:13:22,920 Well one of the things I could do is when I call this onChecked, I could pass over something that identifies 137 138 00:13:23,010 --> 00:13:30,180 this particular ToDoItem from all of the other ones that gets rendered. And I can do that by adding 138 139 00:13:30,300 --> 00:13:31,860 an id. 139 140 00:13:31,950 --> 00:13:34,800 So inside my to do list item, 140 141 00:13:34,850 --> 00:13:41,400 firstly we need to remember that when we map through arrays and create components we should always have 141 142 00:13:41,460 --> 00:13:42,900 a key. 142 143 00:13:42,900 --> 00:13:51,840 And I'm going to set this key to the index of the ToDoItem from the items array. And this map function 143 144 00:13:51,960 --> 00:13:55,520 actually gives me a really easy way of accessing that. 144 145 00:13:55,530 --> 00:14:01,240 Notice how in this callback function the first item I provide is the value, 145 146 00:14:01,260 --> 00:14:05,650 so the value of each item from the array. 146 147 00:14:05,670 --> 00:14:08,900 So in this case its the do item that I've already tapped into. 147 148 00:14:09,420 --> 00:14:18,360 But if I add a comma and I add another variable name then I can tap into the index of this item in the 148 149 00:14:18,360 --> 00:14:19,370 items array. 149 150 00:14:19,440 --> 00:14:20,940 So let's try doing that. 150 151 00:14:21,210 --> 00:14:28,440 Remember from our lesson on arrays that if you only have one parameter, you can leave out the parentheses. 151 152 00:14:28,560 --> 00:14:34,140 But if you want to have more than one parameter then you'll need the parentheses and add a comma to 152 153 00:14:34,140 --> 00:14:35,880 separate each of those items. 153 154 00:14:36,510 --> 00:14:39,120 So the second one I'm going to call index. 154 155 00:14:39,120 --> 00:14:44,630 This is going to be the index of the current ToDoItem that's being looped through the items array 155 156 00:14:45,210 --> 00:14:49,220 and I'm going to use the index as the key. Now 156 157 00:14:49,250 --> 00:14:56,600 in an ideal world, React advises us to not use the index for the key and instead use some sort of unique 157 158 00:14:56,690 --> 00:14:58,820 identifying string. 158 159 00:14:58,880 --> 00:15:05,870 For example you could use a package such as uuid which basically just allows you to generate a u 159 160 00:15:05,890 --> 00:15:09,160 uid by installing it as a package. 160 161 00:15:09,170 --> 00:15:16,070 So super simple. But in our case we're going to leave it as the index because we want to use this index 161 162 00:15:16,070 --> 00:15:21,890 value and we want to use it to pass over to our ToDoItem as an id. 162 163 00:15:25,040 --> 00:15:30,830 So now that means our ToDoItem should be able to receive the id in the props. 163 164 00:15:30,830 --> 00:15:33,160 Let's see if that is indeed the case. 164 165 00:15:33,380 --> 00:15:39,470 So let's add a new item and then go to our components click on this item and you can see it's got the 165 166 00:15:39,470 --> 00:15:44,570 id being passed over as 0 because it's the first item in the array. 166 167 00:15:44,570 --> 00:15:48,210 This one has a id of one because it's the second item. 167 168 00:15:48,410 --> 00:15:54,560 They both get some text as the props and they also get this method onChecked which corresponds to the 168 169 00:15:54,560 --> 00:15:56,730 deleteItem function. 169 170 00:15:56,960 --> 00:16:04,220 So you might think that given that we have access to the id now inside this function, I could just 170 171 00:16:04,220 --> 00:16:13,640 pass it back over as props.id and that way my onChecked function will be able to receive the id 171 172 00:16:13,760 --> 00:16:18,440 right here and then I could probably just log it. 172 173 00:16:18,530 --> 00:16:22,160 Now I'm going to show you what actually happens instead. 173 174 00:16:22,160 --> 00:16:29,480 If I go ahead and keep the console open and I add a new item, you'll see that immediately this console 174 175 00:16:29,480 --> 00:16:33,480 log triggers and it prints out the id of the item. 175 176 00:16:33,620 --> 00:16:35,370 So what's going on here? 176 177 00:16:35,480 --> 00:16:41,350 Now remember that way back and we talked about JavaScript functions and passing around functions. 177 178 00:16:41,420 --> 00:16:47,360 We said that whenever you have a set of parentheses and something inside it, then you're going to be 178 179 00:16:47,360 --> 00:16:51,570 calling the function rather than passing the function. 179 180 00:16:51,770 --> 00:16:56,570 So we can't actually pass our props.id like this. 180 181 00:16:56,570 --> 00:17:01,920 This is just going to call it immediately the moment that this ToDoItem gets rendered. 181 182 00:17:02,030 --> 00:17:11,000 Instead what we can do in our onClick is to create a function and this function will only get called 182 183 00:17:11,360 --> 00:17:17,660 when the onClick gets triggered and it's only in this moment that we actually want to tap into props 183 184 00:17:18,080 --> 00:17:28,530 .onChecked and then passing in the props.id. This way when the ToDoItem gets rendered, 184 185 00:17:28,540 --> 00:17:34,990 this function is not going to be called until this div detects a click. 185 186 00:17:34,990 --> 00:17:41,800 Let me reiterate this. Previously when we click the Add button and rendered the ToDoItem component 186 187 00:17:42,100 --> 00:17:49,570 it triggered props.onChecked immediately. But now props.onChecked will only be called the moment 187 188 00:17:49,600 --> 00:17:52,400 the item is actually clicked. 188 189 00:17:52,400 --> 00:18:03,350 Now if I add an item click Add, notice that nothing gets printed until I click on this ToDoItem. Now 189 190 00:18:03,350 --> 00:18:10,090 that we know we can get hold of the id of the ToDoItem inside this delete function. 190 191 00:18:10,190 --> 00:18:18,590 Well now we can activate our setItems and we can use what we've learned before to change our items 191 192 00:18:18,770 --> 00:18:19,850 array. 192 193 00:18:20,030 --> 00:18:26,810 More specifically we're going to use the filter function that we learned before and filter through all 193 194 00:18:26,810 --> 00:18:37,070 of the previous items in our items array and get rid of the ones which match this id. So inside our 194 195 00:18:37,070 --> 00:18:38,280 setItems 195 196 00:18:38,510 --> 00:18:47,110 we're going to return a array and that array is going to be constructed from our previous items array. 196 197 00:18:47,300 --> 00:18:53,320 But it's going to be filtered so that we get rid of the item that we don't want, 197 198 00:18:53,450 --> 00:19:00,680 so the one that has this id that was passed over. Remember that the filter function again expects 198 199 00:19:00,890 --> 00:19:02,730 a function itself. 199 200 00:19:02,750 --> 00:19:11,000 Let's go ahead and add a arrow function and inside this filter function, we have access to two properties. 200 201 00:19:11,150 --> 00:19:16,350 The first one is the actual element that's being looped through in the array 201 202 00:19:17,000 --> 00:19:20,730 and the second one is the index of the current element. 202 203 00:19:21,020 --> 00:19:28,520 So we can tap in to each item as we're looping through previous items and we can also tap into the index 203 204 00:19:28,730 --> 00:19:31,110 of that item. 204 205 00:19:31,160 --> 00:19:38,720 Now we're going to go through our array of previous items, look through each item and get the index of 205 206 00:19:38,720 --> 00:19:48,260 each item and we're going to return an output, a final array, that is going to return all the items where 206 207 00:19:48,260 --> 00:19:53,510 the index is not equal to the id being passed over. 207 208 00:19:54,110 --> 00:19:58,670 So let's go ahead and hit save and check this out inside our new window. 208 209 00:19:58,670 --> 00:20:03,800 So I've got my React dev tool open here as well and I'm going to add a new item. 209 210 00:20:04,370 --> 00:20:12,050 So this went into the array with the index of 0, so it's the first item. And the id got passed over to 210 211 00:20:12,050 --> 00:20:15,290 the ToDoItem component as a prop. 211 212 00:20:15,290 --> 00:20:21,860 And in addition, there's another prop, onChecked, which passed over the deleteItem function that we were 212 213 00:20:21,860 --> 00:20:30,080 editing here. And I've set up the code such that when I click on this ToDoItem, it will trigger delete 213 214 00:20:30,110 --> 00:20:38,630 Item and it will pass over the id as the input. Then we get to receive that id here which remember 214 215 00:20:38,690 --> 00:20:44,070 equates to the index of the item that we're trying to delete. 215 216 00:20:44,270 --> 00:20:53,360 And then we call setItems to update our list of items and we filter it so that we only end up with 216 217 00:20:53,360 --> 00:20:56,900 the ones where the index doesn't match this id, 217 218 00:20:56,900 --> 00:21:00,770 so everything other than the one that's being clicked. 218 219 00:21:00,770 --> 00:21:04,180 So let's add a couple more. 219 220 00:21:04,640 --> 00:21:12,700 And if I go ahead and click on buy eggs, then the id is going to be 1, that's going to be passed to 220 221 00:21:12,710 --> 00:21:13,910 deleteItem. 221 222 00:21:14,060 --> 00:21:21,950 It's going to loop through my array of three items and filter so that we only end up with items where 222 223 00:21:21,950 --> 00:21:25,090 the index does not equal one. 223 224 00:21:25,100 --> 00:21:27,550 So that's this one and this one. 224 225 00:21:27,560 --> 00:21:31,300 So that means if I click here, you can see eggs disappears 225 226 00:21:31,430 --> 00:21:40,060 but we end up with still the remainder of our array that's been filtered using this rule. 226 227 00:21:40,160 --> 00:21:45,050 This really is getting into a lot of functional programming that you'll see a lot of 227 228 00:21:45,050 --> 00:21:54,020 in React where we're passing one function into another function inside another function inside another 228 229 00:21:54,020 --> 00:21:57,110 function inside another function. 229 230 00:21:57,650 --> 00:22:04,280 It does take some time to be able to wrap your head around this and I strongly encourage you to have 230 231 00:22:04,280 --> 00:22:11,210 a go at playing around with this code, trying to filter on some sort of different condition maybe changing 231 232 00:22:11,210 --> 00:22:15,980 the items so that instead of being an array, it's an array of objects. 232 233 00:22:15,980 --> 00:22:20,110 Just have a mess around with it until you get comfortable with it. 233 234 00:22:20,510 --> 00:22:26,270 And it always takes a lot of time to mess around with these things especially something as complex as 234 235 00:22:26,270 --> 00:22:33,200 this to feel comfortable. And the idea is that I'm not expecting you to remember how to do this. Just 235 236 00:22:33,260 --> 00:22:36,950 so that you understand what's going on, so you can look it up the next time.