From 240058090305d09403a5c7a74979460977275d3d Mon Sep 17 00:00:00 2001 From: Heather Faerber Date: Mon, 10 Feb 2025 21:14:46 -0700 Subject: [PATCH 1/2] Refactor ideabox tutorial to use Vite instead of create-react-app because its no longer maintained --- .../images/lessons/ideabox/React-dev-tool.png | Bin 74628 -> 0 bytes .../lessons/ideabox/React-dev-tools.png | Bin 0 -> 26746 bytes module3/lessons/react_ideabox.md | 340 +++++++++--------- 3 files changed, 180 insertions(+), 160 deletions(-) delete mode 100644 assets/images/lessons/ideabox/React-dev-tool.png create mode 100644 assets/images/lessons/ideabox/React-dev-tools.png diff --git a/assets/images/lessons/ideabox/React-dev-tool.png b/assets/images/lessons/ideabox/React-dev-tool.png deleted file mode 100644 index 3ba25086b78276a3cf353a3716857c6871c237f5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 74628 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 diff --git a/assets/images/lessons/ideabox/React-dev-tools.png b/assets/images/lessons/ideabox/React-dev-tools.png new file mode 100644 index 0000000000000000000000000000000000000000..d2de1e85e1268c11aced8008a39bb4ef71c6dfac GIT binary patch literal 26746 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 bkTa}c6J0yRq7?Gq+uTu*QGHe-WfJsXPcIAt literal 0 HcmV?d00001 diff --git a/module3/lessons/react_ideabox.md b/module3/lessons/react_ideabox.md index 880c4c66..0c527834 100644 --- a/module3/lessons/react_ideabox.md +++ b/module3/lessons/react_ideabox.md @@ -35,67 +35,62 @@ How would you build this application using vanilla JS? What functions would need React has its own set of developer tools that are extremely helpful. [Install the dev tools Chrome extension](https://chromewebstore.google.com/detail/react-developer-tools/fmkadmapgofadopljbjfkapdkoienihi?hl=en). Now, anytime you're looking at a React app, you'll see a "Components" and "Profiler" tab in your dev tools! As you're working through this tutorial, pay attention to those tabs (especially the "Components" tab). -## Create React App +## Creating a new React app with Vite -For this lesson, we will be using [`create-react-app`](https://facebook.github.io/create-react-app/). This is a single command line that sets up a boilerplate React application for us. Out of the box, it comes with some handy scripts (such as `start` and `test`). +For this lesson, we will be using [Vite](https://vite.dev/guide/) to spin up a React application. [`create-react-app`](https://facebook.github.io/create-react-app/) used to be a good option but is no longer maintained. Many of the dependencies and configuration files will be obscured, since we won't need to worry about them. This is a fast way to set up a React application so we can concentrate on building out the app, instead of spending our time and energy on tooling. _Note_: A good intermission or post-graduation project is to learn how to configure React. Hand-rolling a React application will make you more familiar with how React works. -### Get started with Create React App +### Get started with Vite -To set up a new react application, simply open your terminal and run the command: +#### Prerequisites: +Vite requires Node.js version 18+ or 20+. Let's use nvm (node version manager) to install the latest version of Node.js. +Run: ```bash -$ npx create-react-app NAMEOFYOURAPP +nvm install 22 ``` +You can confirm you have Node version 22 by running `node -v`. +If you have trouble with the nvm command, ensure you have `nvm` installed by running `nvm -v`. -For this lesson, we'll be rebuilding a Mod 1 project in React! Let's run the following script: +To set up a new react application, run the command: ```bash -$ npx create-react-app ideabox +$ npm create vite@latest ideabox --template react ``` -You will see something like this start to run in your terminal: +You will see something like this run in your terminal: +Select `y` to proceed then select `React` and `JavaScript` ```bash -Creating a new React app in /Users/yourname/mod3/ideabox. +Need to install the following packages: + create-vite@latest +Ok to proceed? (y) y +npm WARN EBADENGINE Unsupported engine { +npm WARN EBADENGINE package: 'create-vite@6.2.0', +npm WARN EBADENGINE required: { node: '^18.0.0 || ^20.0.0 || >=22.0.0' }, +npm WARN EBADENGINE current: { node: 'v16.14.2', npm: '8.5.0' } +npm WARN EBADENGINE } +✔ Select a framework: › React +✔ Select a variant: › JavaScript -Installing packages. This might take a couple of minutes. -Installing react, react-dom, and react-scripts... +Scaffolding project in /Users/heatherf/Turing/se-modules/se3/react-prep/ideabox-vite... -⸨ ░░░░░░░░░░░░░░░░⸩ ⠸ fetchMetadata: sill resolveWithNewModule pify@4.0.1 chec... -``` - -When the script is finished running, you will see the following message in your terminal: - -```bash -Success! Created ideabox at /Users/yourname/Turing/TA/MOD3/m3curriculum/ideabox -Inside that directory, you can run several commands: - - npm start - Starts the development server. - - npm run build - Bundles the app into static files for production. - - npm test - Starts the test runner. +Done. Now run: - npm run eject - Removes this tool and copies build dependencies, configuration files - and scripts into the app directory. If you do this, you can’t go back! + cd ideabox-vite + npm install + npm run dev -We suggest that you begin by typing: +``` - cd ideabox - npm start +As the instructions say, let's change directories `cd` into our new ideabox application and install dependencies by running `npm install`. -Happy hacking! -``` +Open the repo in VS Code with `code .` -As the instructions say, let's change directories into our new ideabox application and run `npm start` to see our new boilerplate application! +Finally run `npm run dev` to see our new boilerplate application displayed at http://localhost:5173/
### Explore @@ -104,56 +99,51 @@ Take a few minutes and look around the boilerplate. Hint: start at the `src/` fo What happens if you: -* Change some of the HTML you see in the `App.js` file? +* Change some of the HTML you see in the `App.jsx` file? * Change some of the CSS you see in the `App.css` file? -You'll also notice an `index.js` file. What is going on in there? +You'll also notice an `main.jsx` file. What is going on in there? This is a great time to do some googling or ask chatGPT for help understanding. ```jsx -const root = ReactDOM.createRoot(document.getElementById('root')); -root.render( - +createRoot(document.getElementById('root')).render( + - -); + , +) ```
## Modular File Structure -We've talked about React being modular many times, but what does it look like to have our code and project files be modular? +React lets us keep our code modular, but what does it look like to have our code and project files be modular? -One small example is to keep a modular file structure. This means that any and all files related to a particular component live in the same directory! This is pretty common in React projects, so we recommend setting up your file structure like this each time you build a new project. Here's an example :) +One small example is to keep a modular file structure. Any and all files related to a particular component live in the same directory! We recommend setting up your file structure like the example below each time you build a new project. + +Take a moment now to create a `components` directory within your `src` directory. Create a directory for `App` within that `components` directory. Move the 2 `App` files into the `App` directory. We'll build directories and files for Form, Ideas, etc later. src 📁 - components 📁 - App 📁 - - App.js + - App.jsx - App.css - - App.test.js - Form 📁 - - Form.js - - Form.css - - Form.test.js - Ideas 📁 - - Ideas.js - - Ideas.css - - Ideas.test.js - Etc +Uh-oh! Changing the file structure will impact our imports. VS Code will offer to update App imports. But we'll still need to update the reactLogo import in App.jsx. That import would now be `import reactLogo from '../../assets/react.svg'` ## Ideabox -Let's get rid of all the boilerplate inside the `App.js` file. Yep. Just ERASE THAT CODE! +Let's get rid of all the boilerplate inside the `App.jsx` file. Yep. Just ERASE THAT CODE - including the imports! -You'll notice that as soon as we save our changes, the browser re-renders. Look into the terminal, and you'll see another build kick off. This is because `create-react-app` gives us hot-reloading. Any time we make a change, the browser will update to show our changes. +You'll notice that as soon as we save our changes, the browser re-renders. Look into the terminal, and you'll see another build kick off. This is because Vite gives us hot-reloading. Any time we make a change, the browser will update to show our changes. However, sometimes if we hit a significant error, **we may still have to refresh the page or re-run `npm run dev` to get things going again after implementing the fix.** -Look at the console in our dev tools now that we've deleted our `App.js` code, and you'll see an error that reads: +Look at the console in our dev tools now that we've deleted our `App.jsx` code, and you'll see an error that reads: -"Element type is invalid: expected a string (for built-in components) or a class/function (for composite components) but got: object. You likely forgot to export your component from the file it's defined in, or you might have mixed up default and named imports." +*"Uncaught SyntaxError: The requested module '/src/components/App/App.jsx?t=1739225023971' does not provide an export named 'default' (at main.jsx:4:8)"* -Back in our `index.js` file we're trying to render a React component: App. However, we're no longer exporting a valid React component! +Back in our `main.jsx` file we're trying to render a React component: App. However, we're no longer exporting a valid React component! While JavaScript error messages aren't always very clear or helpful, React error messages are much better at telling us what's going on. The often even include a link to the appropriate part of the React docs! @@ -175,7 +165,7 @@ Let's figure out what should be a component in our app. ![IdeaBox wireframe with component boxes](../../assets/images/lessons/ideabox/IdeaBox-wireframe.png) -### App.js +### App.jsx Because we want App to hold onto our list of ideas, let's think about how we're going to store that information. @@ -198,9 +188,8 @@ function App() { export default App; ``` -The above code is defining the App functional component in React. +The above code is defining the App functional component in React. App returns JSX code via the `return` keyword just like any ol' function. -Any additional JSX code or logic can be added to the component as needed, and the final JSX code is returned by the component's return statement just like any ol' function.
It's important to note that this code is using functional components, rather than class components and OOP. This allows us to manage our component in a more concise and streamlined way, without relying on class inheritance and traditional OOP principles.
@@ -232,23 +221,22 @@ What we're actually writing here is known as JSX. It's an abstraction that makes JSX is "JavaScript and XML" - it's a handy mashup language that allows us to write HTML with a bit of JavaScript injected in. You can read more on it [here](https://reactjs.org/docs/introducing-jsx.html) (and a bit more in depth [here](https://react.dev/learn/writing-markup-with-jsx)). It's not something you need to be an expert on, but you should know that it's being used in React. In the meantime, we'll see how JSX makes our lives easier throughout this lesson! -Okay. Now try to add a paragraph tag. What happened? +Okay. Now try to add a paragraph tag after your

tag. What happened? You should receive this error: ``` Failed to compile. -./src/App.js - Line 12: Parsing error: Adjacent JSX elements must be wrapped in an enclosing tag. Did you want a JSX fragment <>...? +...src/components/App/App.jsx: Adjacent JSX elements must be wrapped in an enclosing tag. Did you want a JSX fragment <>...? (6:4) + + 4 | return( + 5 |

IdeaBox

+> 6 |

Hi!

+ | ^ + 7 | ) + 8 | } - 12 | return( - 13 |

IdeaBox

-> 14 |

Hi!

- | ^ - 16 | ) - 17 | - 18 | ``` Let's figure out what this error is saying. "Adjacent JSX elements must be wrapped in an enclosing tag." @@ -263,6 +251,9 @@ Since this is our App component, let's wrap everything in a `
` tag! If you're just looking for an unflavored container for your elements (aka they are not semantically related to one another, and the best element to use would be a `
`), then instead, use a ``! You can read more about Fragments [here](https://react.dev/reference/react/Fragment). +We'll also import our App.css file. And give our
element a class of 'App' like so: + + ```jsx import { useState } from 'react'; import './App.css'; @@ -283,9 +274,9 @@ export default App; You'll notice that instead of "`class`", we're using a "`className`" attribute on our `
` element. Why do you think this is? -### App.js state +### App.jsx state -Okay. Let's come back to our App component and create state. +Okay. Let's come back to our App component and create state - our "source of truth" for the data the app will be using. ```jsx import { useState } from 'react' @@ -301,6 +292,8 @@ function App(){
) } + +export default App; ```
@@ -343,26 +336,25 @@ export default App; Open up your React Dev Tools (open your dev tools, then go to the Components tab). You can see that App now has state: -![App component state](../../assets/images/lessons/ideabox/React-dev-tool.png) +![App component state](../../assets/images/lessons/ideabox/React-dev-tools.png) Neat! **Consider the following...** -Okay. Let's pause for a second. `App.js` is a functional component, and we used useState to setup a state for our component. +Okay. Let's pause for a second. `App.jsx` is a functional component, and we used useState to setup a state for our component. ### State **State** holds data that represents the actual state of our application. State can be changed and mutated through user interactions. React Hooks is a feature that was introduced at the end of 2018. It allows functional components to access and manipulate state. In future lessons, we'll learn about other types of components as well. However, for now, it's essential to understand functional components and how React Hooks enable them to manage state in a more concise and streamlined way. - - -## Ideas.js + +## Ideas.jsx Next, let's focus on getting our two ideas to render! -We already said that we want to have a container for all of our idea Cards. So let's create that component! In your terminal, touch two new files: `$ touch src/Ideas.js src/Ideas.css`. +We already said that we want to have a container for all of our idea Cards. So let's create that component! In your VS Code, make an `Ideas` directory within the `components` directory and give it two new files: `Ideas.jsx` and `Ideas.css`.
### Note @@ -376,10 +368,10 @@ Will this Ideas component need to have state? What do you think? Since the Ideas component will just be rendering Card components, it will not need to have its own state. -let's create a function called Ideas that returns an h2 that reads "Ideas go here!" +Let's create a function called Ideas that returns an h2 that reads "Ideas go here!" ```jsx -// Ideas.js +// Ideas.jsx import './Ideas.css'; @@ -392,14 +384,14 @@ function Ideas(){ export default Ideas; ``` -Then, back in our `App.js`, we can import our shiny new Ideas component and add it to our render! +Then, back in our `App.jsx`, we can import our shiny new Ideas component and add it to our return so it will render! ```jsx -// App.js +// App.jsx -import './App.css'; -import Ideas from './Ideas'; import { useState } from 'react' +import './App.css'; +import Ideas from '../Ideas/Ideas' function App(){ const dummyIdeas = [ @@ -438,25 +430,24 @@ When we pass props down to a child component, it comes through as a simple JavaS Let's start with an example, just to keep things simple. For now, since our Ideas component just contains an h2, let's make that h2 say something different than "Ideas go here!" -In our App component, let's render the Ideas component by adding it to our return. +In our App component's return statement, let's get rid of our

tag and pass some data as a prop when rendering our Ideas component. ```jsx -// App.js +// App.jsx // ... return(

IdeaBox

-

Hi!

) - +// .... ``` -Now, let's adjust our Ideas component. +Now, let's adjust our Ideas component so it can receive and use that data coming in as props. ```jsx -// Ideas.js +// Ideas.jsx function Ideas(props){ @@ -468,7 +459,7 @@ function Ideas(props){ What are those curly brackets doing? In JSX, whenever we're writing something that is JavaScript (aka "not HTML"), we have to wrap it in curly brackets. In this case, "name" acts like a variable. It's not a string that reads "name" - it's a placeholder that represents the value of the property (in this case, "Travis")! Because it's a variable, we have to surround it in curly brackets to tell the JSX to treat the contents like JavaScript. -In your browser, you should see "Hello, Travis!" In `App.js`, add another Ideas component to the `App.js` `return()` , but pass in a different name. What do you see in the browser? Try creating new props to use! +In your browser, you should see "Hello, Travis!" In `App.jsx`, add another Ideas component to the `App.jsx` `return()` , but pass in a different name. What do you see in the browser? Try creating new props to use! Okay, so just WHAT exactly is going on here? @@ -479,7 +470,7 @@ If, in the `return` of our App component, we called the property "potato" instea We can even destructure the props object, because it's just a regular object! ```jsx -// Ideas.js +// Ideas.jsx function Ideas(props){ const { name } = props; @@ -495,7 +486,7 @@ In _this_ example, destructuring is a bit over-engineered, yes. However, we'll s And here's YET ANOTHER super-fancy way to destructure: ```jsx -// Ideas.js +// Ideas.jsx function Ideas({ name }){ return ( @@ -504,7 +495,7 @@ function Ideas({ name }){ } ``` -We can destructure props ON THE WAY IN. Whoa! It's accomplishing the same thing as destructuring on a separate line, like in the previous example. +We can destructure props ON THE WAY IN. Whoa! It's accomplishing the same thing as destructuring on a separate line, like in the previous example. Be aware of destructuring but don't stress it at this time.
@@ -519,10 +510,10 @@ All right. We don't actually want to render an h2 in our Ideas component. We wan Let's create a Card component to use. -Create your files: `$ touch src/Card.js src/Card.css` +Create a `Card` directory and put a `Card.jsx` and `Card.css` file in it. ```jsx -// Card.js +// Card.jsx import './Card.css'; @@ -541,10 +532,10 @@ export default Card; Then, in your Ideas component, let's just try to get these hooked up properly. ```jsx -// Ideas.js +// Ideas.jsx -import Card from './Card'; +import Card from '../Card/Card'; import './Ideas.css'; function Ideas(props){ @@ -594,7 +585,7 @@ Okay! Hopefully your app looks like this: All right, friends. Let's get to passing some PROPS! Let's go all the way back to our App component and pass our list of ideas to the Ideas container component, so that it can then create Card components out of each individual idea. ```jsx -// App.js +// App.jsx return( @@ -612,7 +603,9 @@ Go look at the Ideas component in your React dev tools in the browser. You shoul We now want to iterate through our array and create a Card component, passing it the information it needs to display the proper information! ```js -// Ideas.js +// Ideas.jsx +import Card from '../Card/Card'; +import './Ideas.css'; function Ideas({ ideas }){ @@ -633,6 +626,9 @@ function Ideas({ ideas }){
) } + +export default Ideas; + ``` Okay - we've made a few changes! You'll notice that we're now destructuring the props _as we pass them in_! W H A T. I know. Then, we're mapping over the ideas array and creating a new array of Card components, each with props of `title` and `name`. The `key` property is something that React requires when using `map()` to create elements. In this case, I'm just using the unique id that each idea has. @@ -640,7 +636,8 @@ Okay - we've made a few changes! You'll notice that we're now destructuring the If you look in your React dev tools, you'll see that both Card components now has props of "title" and "description"! Go ahead a change Card so we display that information. ```js -// Card.js +// Card.jsx +import './Card.css'; function Card({ title, description, id }){ return ( @@ -651,6 +648,9 @@ function Card({ title, description, id }){ ) } + +export default Card; + ``` I created a button to delete the Card, but we'll get to that later. For now, let's celebrate, because we just got this sucker to display some ideas!! @@ -674,7 +674,7 @@ Conditional rendering is exactly what it sounds like: telling a component to ren Currently our App looks like this: ```jsx -// App.js +// App.jsx function App () { const [ideas,setIdeas] = useState([]) @@ -689,19 +689,21 @@ function App () { ``` +We want to add conditional logic that essentially says, *if there aren't any ideas to display, display an

inviting users to add some ideas.* +
### In plain JS, what could this conditional look like? ```javascript -if (!data.length) { +if (!ideas.length) { // return an h2 saying to add some ideas } ```
-We can use curly braces to inject JS into our JSX. However, we need whatever is inside of our curlies to _evaluate_ to the HTML we want rendered, so we'll use some syntax like this: +We can use curly braces to inject JS into our JSX. However, we need whatever is inside of our curlies to _evaluate_ to the HTML we want rendered, so we'll use React's conditional rendering syntax like this: ```jsx -// App.js +// App.jsx return (
@@ -722,11 +724,11 @@ What does the operator return? The code above says that, if the expression on the left side of the `&&` is true, return the expression on the right side. So if there are no ideas in state, return our h2! -## Form.js +## Form.jsx Let's move on to our Form component. We're going to create what is known as a controlled form. -Create the Form component files: `$ touch src/Form.js src/Form.css` +Create the Form directory and the `Form.jsx` and `Form.css` files. ```css /* Form.css */ @@ -747,7 +749,7 @@ input, button { Our Form will start like this: ```jsx -// Form.js +// Form.jsx import { useState } from 'react'; import './Form.css'; @@ -781,25 +783,26 @@ export default Form; ``` Now that we have our Form files started, we can connect our Form to our App component so it will render. -First, import the Form in App.js. +First, import the Form in App.jsx. ```jsx -import Form from './Form'; +import Form from '../Form/Form'; ``` Then, render the Form in App's return. ```jsx - return( -
+ return ( +

IdeaBox

+ {!ideas.length &&

No ideas yet -- add some!

}
- ) + ) ``` But we also need to write some functions. Let's go back to our Form and make sure that when we type into our inputs, they update the Form's state. ```jsx -// Form.js +// Form.jsx return ( @@ -825,20 +828,23 @@ But we also need to write some functions. Let's go back to our Form and make sur ``` -What is this `setTitle` business? It's a function created using useState hook to manage the state of the title. The useState hook returns an array with two elements. The current state value in this case an empty string and a function to update the state in this case `setTitle`. +What is this `setTitle` business? +It's a function created using useState hook to manage the state of the title. +The useState hook returns an array with two elements. The current state value in this case an empty string and a function to update the state in this case `setTitle`. + OK let's go back to `setTitle` and what is happening in the `onChange`. So when the `onChange` event listener is triggered by the user typing something into the input field, the `setTitle` function is called with the new value of the input as an argument. This updates the state of the title variable with the new value, causing a re-render of the component with the updated state. - Take a look at your React dev tools - is the state updating as you type into the inputs? -When we click the submit button, what do we want to happen? We want to create an object out of the new idea and add it to the list of ideas that App is holding onto in state. How do we access App's state from inside our Form component? +When we click the submit button, what do we want to happen? +We want to create an object out of the new idea and add it to the list of ideas that App is holding onto in state. How do we access App's state from inside our Form component? ### Passing functions -In App, we're going to have to create a function that updates App's state: +In App, we're going to have to create an `addIdea` function that updates App's state. Then we'll pass that function into our Form as a prop. ```jsx -// App.js +// App.jsx function addIdea (newIdea) { setIdeas([...ideas, newIdea]) @@ -847,6 +853,7 @@ In App, we're going to have to create a function that updates App's state: return(

IdeaBox

+ {!ideas.length &&

No ideas yet -- add some!

}
@@ -854,52 +861,64 @@ In App, we're going to have to create a function that updates App's state: ``` -This is a callback function that takes a new idea object as an argument, and adds it to the existing ideas array by creating a new array using the spread operator ... to copy the existing ideas array and adding the new idea to the end of it. +This is a callback function that takes a new idea object as an argument, and adds it to the existing ideas array by creating a new array using the **spread operator** ... to copy the existing ideas array and adding the new idea to the end of it. This updated array is then set as the new state of `ideas` using `setIdeas` function which is the state updater function created by useState hook. This is good, because we're passing it down as a prop to the Form component! Now, in the Form component, let's make use of the `addIdea` function we passed as a prop. To access `addIdea` we'll need to declare 'props' as a parameter in our functional Form component then use dot notation to access `props.addIdea`. Or, we could use destructuring to allow us to directly reference `addIdea` without having to use dot notation. +We're also creating a submitIdeas function in the Form component that will format the newIdea to be passed into the invocation of the addIdea prop. The submitIdeas function will be invoked on the Form's button click. + ```jsx -// Form.js +// Form.jsx +import { useState } from 'react'; +import './Form.css'; + +function Form({addIdea}){ + const [title, setTitle] = useState(""); + const [description, setDescription] = useState(""); function submitIdeas(event) { - event.preventDefault() - const newIdea = { - id: Date.now(), - title, - description - } - addIdea(newIdea) - clearInput() + event.preventDefault() + const newIdea = { + id: Date.now(), + title, + description + } + addIdea(newIdea) + clearInput() } function clearInput(){ - setTitle("") - setDescription("") + setTitle("") + setDescription("") } - - return ( - - setTitle(event.target.value)} - /> - - setDescription(event.target.value)} - /> - - - - ) + + return ( +
+ setTitle(event.target.value)} + /> + + setDescription(event.target.value)} + /> + + +
+ ) +} + +export default Form; + ``` ### Deleting a Card @@ -909,11 +928,11 @@ Now that you know how to use a function and props to allow a different component First, write the App function to delete an idea from state and pass it to the Ideas component: ```jsx -// App.js +// App.jsx import './App.css'; -import Form from './Form'; -import Ideas from './Ideas'; +import Ideas from '../Ideas/Ideas'; +import Form from '../Form/Form'; import { useState } from 'react' function App(){ @@ -936,7 +955,7 @@ function App(){ return(

IdeaBox

-

Hi!

+ {!ideas.length &&

No ideas yet -- add some!

}
@@ -951,7 +970,8 @@ Second, pass the `deleteIdea` function to each Card that the Ideas component cre ```jsx import './Ideas.css'; -import Card from "./Card" +import Card from '../Card/Card'; + function Ideas({ ideas, deleteIdea }){ const ideaCards = ideas.map(idea => { From 1d7564f4765dd96efb5fb7d75f5e306ddc51f93f Mon Sep 17 00:00:00 2001 From: Heather Faerber Date: Fri, 14 Feb 2025 14:32:45 -0700 Subject: [PATCH 2/2] Add updates from Abduls review --- module3/lessons/react_ideabox.md | 33 +++++++++++++++++--------------- 1 file changed, 18 insertions(+), 15 deletions(-) diff --git a/module3/lessons/react_ideabox.md b/module3/lessons/react_ideabox.md index 0c527834..96ac391c 100644 --- a/module3/lessons/react_ideabox.md +++ b/module3/lessons/react_ideabox.md @@ -80,7 +80,7 @@ Scaffolding project in /Users/heatherf/Turing/se-modules/se3/react-prep/ideabox- Done. Now run: - cd ideabox-vite + cd ideabox npm install npm run dev @@ -120,7 +120,7 @@ React lets us keep our code modular, but what does it look like to have our code One small example is to keep a modular file structure. Any and all files related to a particular component live in the same directory! We recommend setting up your file structure like the example below each time you build a new project. -Take a moment now to create a `components` directory within your `src` directory. Create a directory for `App` within that `components` directory. Move the 2 `App` files into the `App` directory. We'll build directories and files for Form, Ideas, etc later. +Take a moment now to create a `components` directory within your `src` directory. Create a directory for `App` within that `components` directory. Move the 2 `App` files into the `App` directory. Create a directory for Form, Ideas and Card - we'll add files to them later. src 📁 - components 📁 @@ -129,7 +129,7 @@ src 📁 - App.css - Form 📁 - Ideas 📁 - - Etc + - Card 📁 Uh-oh! Changing the file structure will impact our imports. VS Code will offer to update App imports. But we'll still need to update the reactLogo import in App.jsx. That import would now be `import reactLogo from '../../assets/react.svg'` @@ -137,7 +137,7 @@ Uh-oh! Changing the file structure will impact our imports. VS Code will offer Let's get rid of all the boilerplate inside the `App.jsx` file. Yep. Just ERASE THAT CODE - including the imports! -You'll notice that as soon as we save our changes, the browser re-renders. Look into the terminal, and you'll see another build kick off. This is because Vite gives us hot-reloading. Any time we make a change, the browser will update to show our changes. However, sometimes if we hit a significant error, **we may still have to refresh the page or re-run `npm run dev` to get things going again after implementing the fix.** +You'll notice that as soon as we save our changes, the browser re-renders. Look into the terminal, and you'll see another build kick off. This is because Vite gives us hot-reloading. Any time we make a change, the browser will update to show our changes. However, sometimes if we hit a significant error, **we may still have to refresh the page or re-run `npm run dev` to get things going again after implementing the fix.** You may need to refresh your browser after deleting the code in App in order to see the error outlined below. Look at the console in our dev tools now that we've deleted our `App.jsx` code, and you'll see an error that reads: @@ -221,7 +221,7 @@ What we're actually writing here is known as JSX. It's an abstraction that makes JSX is "JavaScript and XML" - it's a handy mashup language that allows us to write HTML with a bit of JavaScript injected in. You can read more on it [here](https://reactjs.org/docs/introducing-jsx.html) (and a bit more in depth [here](https://react.dev/learn/writing-markup-with-jsx)). It's not something you need to be an expert on, but you should know that it's being used in React. In the meantime, we'll see how JSX makes our lives easier throughout this lesson! -Okay. Now try to add a paragraph tag after your

tag. What happened? +Okay. Now try to add a paragraph tag after your `

` tag. What happened? You should receive this error: @@ -287,9 +287,9 @@ function App(){ return (
-

IdeaBox

-

Hi!

-
+

IdeaBox

+

Hi!

+
) } @@ -354,7 +354,7 @@ React Hooks is a feature that was introduced at the end of 2018. It allows funct Next, let's focus on getting our two ideas to render! -We already said that we want to have a container for all of our idea Cards. So let's create that component! In your VS Code, make an `Ideas` directory within the `components` directory and give it two new files: `Ideas.jsx` and `Ideas.css`. +We already said that we want to have a container for all of our idea Cards. So let's create that component! In your VS Code, within the `src/components/Ideas` directory, create two new files: `Ideas.jsx` and `Ideas.css`.
### Note @@ -465,7 +465,7 @@ Okay, so just WHAT exactly is going on here? **props** is the name of an object that contains key-value pairs. From our above example, the key is "name", and the value is "Travis". So, in our Ideas component, we can access the value by writing `props.name` (which gives us a string of "Travis"). This is the same dot notation we learned in Mods 1 and 2 to access data stored in objects. -If, in the `return` of our App component, we called the property "potato" instead of "name", we would have to access it by (inside the Ideas component) writing `props.potato`. +If, in the `return` of our App component, we called the property "potato" instead of "name", we would have to access it by (inside the Ideas component) writing `props.potato`. This is the same dot notation we learned in Mod 2 to access data stored in objects. We can even destructure the props object, because it's just a regular object! @@ -510,7 +510,7 @@ All right. We don't actually want to render an h2 in our Ideas component. We wan Let's create a Card component to use. -Create a `Card` directory and put a `Card.jsx` and `Card.css` file in it. +In the `Card` directory we created earlier, create the `Card.jsx` and `Card.css` files. ```jsx // Card.jsx @@ -662,7 +662,8 @@ Before me move on, lets tighten up the UX here a bit.
### Explore -* Try assigning an empty array to the state of our App data . +* What if we didn't have any dummyIdeas to start? + * In your useState line of code, replace the dummyIdeas with an empty array so that our ideas state starts as an empty array. * What happens? Why? * What would make for a better user experience?
@@ -689,7 +690,7 @@ function App () { ``` -We want to add conditional logic that essentially says, *if there aren't any ideas to display, display an

inviting users to add some ideas.* +We want to add conditional logic that essentially says, *if there aren't any ideas to display, display an `

` inviting users to add some ideas.*
### In plain JS, what could this conditional look like? @@ -722,13 +723,15 @@ We can use curly braces to inject JS into our JSX. However, we need whatever is What does the operator return?
-The code above says that, if the expression on the left side of the `&&` is true, return the expression on the right side. So if there are no ideas in state, return our h2! +The code above says that, if the expression on the left side of the `&&` is true, return the expression on the right side. So if there are no ideas in state, return (aka render) our h2! + +Go ahead and pass your dummyIdeas back into your useState hook. Later, when we set up the ability to delete ideas, we should see our `

` anytime there are no ideas in the ideas array in state. ## Form.jsx Let's move on to our Form component. We're going to create what is known as a controlled form. -Create the Form directory and the `Form.jsx` and `Form.css` files. +In the Form directory we created earlier, create the `Form.jsx` and `Form.css` files. ```css /* Form.css */