0 1 00:00:00,080 --> 00:00:00,840 All right guys. 1 2 00:00:00,870 --> 00:00:08,310 So since the last time we worked on our keeper app, we've learned a lot of new concepts such as props 2 3 00:00:08,670 --> 00:00:13,830 and mapping components and looping and React devtools, 3 4 00:00:13,830 --> 00:00:16,410 arrow functions, map filter reduce. 4 5 00:00:16,410 --> 00:00:22,340 So let's go ahead and see if we can apply some of those things to improve our keeper app. 5 6 00:00:22,350 --> 00:00:29,160 This is the keeper app part 2 and you can go ahead and get hold of the starting code sandbox by going 6 7 00:00:29,160 --> 00:00:35,340 to the course resources. If you want to work on your local copy, then go ahead and download a copy of 7 8 00:00:35,340 --> 00:00:43,730 it and then run npm install as well as npm start in order to run it on a local server. 8 9 00:00:43,860 --> 00:00:51,610 But if you're working on it in code sandbox like I am, then go ahead and just fork your own copy. The 9 10 00:00:51,610 --> 00:00:54,760 goal of this challenge is very simple. 10 11 00:00:54,760 --> 00:01:02,350 All we want to do is to render all of the notes that currently live inside our notes.js as an 11 12 00:01:02,350 --> 00:01:09,690 array called notes, into our keeper app as separate note components. 12 13 00:01:09,700 --> 00:01:15,070 This is gonna use a lot of the thing that you learned in the previous lessons especially props and 13 14 00:01:15,070 --> 00:01:16,510 mapping. 14 15 00:01:16,570 --> 00:01:23,740 So this is what the finished app should look like and when you go into the notes.js file, if 15 16 00:01:23,740 --> 00:01:29,170 you add a new entry you should see it pop up dynamically like this. 16 17 00:01:29,170 --> 00:01:35,320 And this is all possible because you're going to be mapping through this array. Go ahead and pause the 17 18 00:01:35,320 --> 00:01:38,360 video and try to give this challenge a go. 18 19 00:01:38,380 --> 00:01:42,390 And once you're done, head back over here and we'll walk through the solution together. 19 20 00:01:47,920 --> 00:01:48,390 All right. 20 21 00:01:48,390 --> 00:01:54,130 So first let's head into our components folder and take a look at our App.js. 21 22 00:01:54,480 --> 00:02:00,720 Here we've got the note component being rendered and we're only asking for one of these components to 22 23 00:02:00,720 --> 00:02:02,030 be rendered. 23 24 00:02:02,190 --> 00:02:05,560 Now at the moment, this component is completely hardcoded. 24 25 00:02:05,670 --> 00:02:10,380 It has a set phrase for the h1 and a set phrase for the paragraph. 25 26 00:02:10,380 --> 00:02:17,760 Now that won't do if we want to use our custom notes from our notes.js. So first let's go into 26 27 00:02:17,760 --> 00:02:20,850 our App.js and pass it some custom props. 27 28 00:02:21,210 --> 00:02:26,070 So the kind of things that we probably want to customize is the title of the note and the content of 28 29 00:02:26,070 --> 00:02:26,550 the note. 29 30 00:02:26,610 --> 00:02:32,590 So let's just create a prop called title and a prop called content. 30 31 00:02:32,600 --> 00:02:42,120 Now I'm just gonna go and move this existing title and existing content over as the values of those 31 32 00:02:42,180 --> 00:02:42,920 props, 32 33 00:02:44,240 --> 00:02:45,190 like so. 33 34 00:02:45,710 --> 00:02:52,880 And this way when I go ahead and look inside my React dev tools inside my note component, I'll be able 34 35 00:02:52,880 --> 00:02:59,180 to see that I've got two props being passed over to the note component which I can then pick up inside 35 36 00:02:59,180 --> 00:02:59,840 my note 36 37 00:02:59,870 --> 00:03:08,810 .js. So inside my note function which is being called effectively from my App.js, I can receive 37 38 00:03:08,900 --> 00:03:16,460 some properties and this object props is going to contain both of these properties, title and content. 38 39 00:03:17,000 --> 00:03:25,250 So I can now insert it into my

inside a set of curly braces and I can inject that as props. 39 40 00:03:25,310 --> 00:03:35,330 title and do the same with my content, so props.content. And these two properties should in fact work 40 41 00:03:35,390 --> 00:03:39,360 when I pick up my note because I'm using the right names of the properties. 41 42 00:03:39,680 --> 00:03:46,190 And frequently you get mismatches in terms of typos when you're trying to access a property and you 42 43 00:03:46,190 --> 00:03:54,590 miss out on the content or you get typos when you are passing a prop over in terms of the key and you 43 44 00:03:54,590 --> 00:03:55,920 get missing content. 44 45 00:03:56,090 --> 00:04:02,870 But with our React dev tools and being able to view the props, it should help us debug any issues on that 45 46 00:04:02,870 --> 00:04:05,230 front. All right. 46 47 00:04:05,260 --> 00:04:12,700 So now that we've got our note rendering some custom content using props, we can now think about how we 47 48 00:04:12,700 --> 00:04:18,910 can render multiple notes because our notes.js has lots of different notes with different titles 48 49 00:04:19,000 --> 00:04:20,740 and different content. 49 50 00:04:20,740 --> 00:04:28,030 One way is we could create lots of these note components but of course now that we know all about the 50 51 00:04:28,090 --> 00:04:38,110 mapping strategy, then the easiest way is to use the map function. In order to map through the array of 51 52 00:04:38,110 --> 00:04:42,800 notes, we first have to export it from this file where it lives. 52 53 00:04:42,820 --> 00:04:52,330 So export default notes. And then let's go ahead and catch it over and in our App.js. So let's import 53 54 00:04:52,360 --> 00:04:57,600 notes from ../notes. 54 55 00:04:57,820 --> 00:04:58,060 All right. 55 56 00:04:58,090 --> 00:05:07,420 So now that we've got access to this array called notes and we can log it to see its value which is just 56 57 00:05:07,420 --> 00:05:15,760 currently four objects with different titles and content, given that we've got this array we can then 57 58 00:05:15,790 --> 00:05:24,910 go into our app and replace this single note with a whole bunch of notes generated from a map function. 58 59 00:05:24,970 --> 00:05:32,260 So let's go ahead and tap into the notes array that we just got hold of, called the map function and inside 59 60 00:05:32,260 --> 00:05:39,730 the map function we're going to pass it a function that is going to create notes. 60 61 00:05:39,900 --> 00:05:49,110 So this createNotes needs to get a single note item passed into it and once it does though it's going 61 62 00:05:49,110 --> 00:05:56,700 to return a note component that is going to have some props being sent over. 62 63 00:05:56,700 --> 00:06:00,830 Remember the props that we defined previously were title and content 63 64 00:06:00,900 --> 00:06:09,450 so let's add a title prop and let's add a content prop. So the title is going to be based on the note 64 65 00:06:09,480 --> 00:06:11,850 item that gets passed over to this function, 65 66 00:06:11,880 --> 00:06:19,920 so it's gonna be noteItem.title and let's just check inside our notes.js that indeed that 66 67 00:06:19,920 --> 00:06:22,980 those are the names of the properties, title and content. 67 68 00:06:23,550 --> 00:06:32,720 So noteItem.title and noteItem.content. And of course because this is Javascript code it needs 68 69 00:06:32,720 --> 00:06:36,300 to be wrapped inside a set of curly braces to be valid 69 70 00:06:36,360 --> 00:06:37,320 JSX. 70 71 00:06:38,000 --> 00:06:44,750 Now that we've got this function createNotes that takes a single note item and renders a custom note 71 72 00:06:44,780 --> 00:06:45,520 component 72 73 00:06:45,710 --> 00:06:49,820 we can pass that createNote function into our map. 73 74 00:06:49,850 --> 00:06:56,450 So now if we wrap this whole line inside a set of curly braces, then it should be able to render our 74 75 00:06:56,450 --> 00:07:04,190 notes with different titles and different content using the data that we've got inside on notes. 75 76 00:07:04,220 --> 00:07:06,310 js. 76 77 00:07:06,410 --> 00:07:12,140 Now there's a couple of things to remember though. Remember that whenever we want to map or loop through 77 78 00:07:12,620 --> 00:07:22,190 a array in order to create dynamic React components such as these notes, we always have to add a key 78 79 00:07:22,190 --> 00:07:27,980 prop and that key proper has to be unique amongst all of the same components. 79 80 00:07:28,160 --> 00:07:33,870 So there can't be no note component that has the same key. Luckily inside on note. 80 81 00:07:33,890 --> 00:07:44,680 js, we've also got a key property defined so we can just set this as the noteItem.key. This way 81 82 00:07:44,740 --> 00:07:50,890 we clear any of the errors that are in our console and we're making React happy with the job that we're 82 83 00:07:50,890 --> 00:07:52,920 doing now. 83 84 00:07:52,920 --> 00:07:56,730 The next thing to note is we learned about arrow functions 84 85 00:07:56,730 --> 00:07:57,030 right? 85 86 00:07:57,060 --> 00:08:01,060 So we can vastly simplify and cut down on our code 86 87 00:08:01,230 --> 00:08:04,150 and in fact I would argue it would make easier to read. 87 88 00:08:04,200 --> 00:08:05,610 So let's go ahead and do that. 88 89 00:08:05,730 --> 00:08:12,900 So first I'm going to move this function from the outside into the inside of my map function. So everything 89 90 00:08:12,900 --> 00:08:14,140 still works the same 90 91 00:08:14,220 --> 00:08:21,600 but now it's just being defined inside another function and at the position where it's being used. 91 92 00:08:21,720 --> 00:08:27,290 Next I'm going to turn this into an anonymous function by deleting the name of the function, 92 93 00:08:27,390 --> 00:08:35,220 so everything still works. And then I'm going to simplify things even further by turning this into an 93 94 00:08:35,250 --> 00:08:37,230 ES6 arrow function. 94 95 00:08:37,320 --> 00:08:44,610 So I'm going to delete the function keyword, add a fat arrow between the input and the body of the statement 95 96 00:08:45,240 --> 00:08:53,100 and then because I've only got a single item being returned which gets treated effectively as a single 96 97 00:08:53,100 --> 00:09:01,410 line of code I can actually also delete my return keyword as well as the curly braces that enclose the 97 98 00:09:01,410 --> 00:09:11,610 entire block of code. And instead I can simply just tag this on at the end as a single line of code like 98 99 00:09:11,610 --> 00:09:13,160 so. 99 100 00:09:13,170 --> 00:09:21,360 So now everything still works exactly the same as before but we're using our arrow function in order 100 101 00:09:21,360 --> 00:09:26,250 to pass a function that maps through our array of notes 101 102 00:09:26,400 --> 00:09:32,880 and for each of the notes inside the array, it's going to carry out this functionality which is to create 102 103 00:09:32,880 --> 00:09:35,820 a new note using the properties from that note 103 104 00:09:35,850 --> 00:09:39,720 Item. Did you manage to complete the challenge? 104 105 00:09:39,720 --> 00:09:46,710 If not, be sure to review some of the previous lessons that we covered including props as well as mapping 105 106 00:09:46,710 --> 00:09:53,890 components. So in the coming lessons we're going to level up our skills in React development even more 106 107 00:09:54,190 --> 00:09:58,330 so that we can add more functionality to our keeper app. 107 108 00:09:58,330 --> 00:10:06,490 Things such as how to handle user inputs, how to dynamically add new notes from the user input, how to 108 109 00:10:06,490 --> 00:10:13,900 deal with forms, how to delete notes and much much more. So once you're done reviewing the code here and 109 110 00:10:13,960 --> 00:10:19,000 completing the challenge on your side, then head over to the next lesson and we're going to learn about 110 111 00:10:19,060 --> 00:10:23,490 conditional rendering. So for all of that and more, I'll see you there.