Skip to content

Latest commit

 

History

History
192 lines (149 loc) · 6.2 KB

File metadata and controls

192 lines (149 loc) · 6.2 KB

Session Plan

Introduction to React

  • Vanilla JavaScript
    • interacts directly with the DOM
    • this is fairly easy to maintain for small apps and sites – and if it's just you developing it
  • React
    • can enable you to add a bunch of other people to help you and collaborate to move faster
    • can help you avoid repetition that's natural when interacting with the DOM a lot
    • can update the UI in a reactive way (hence the name) when your data changes
    • makes it possible to compose an application or website of small components that you can re-use
  • React's strengths:
    • Very suitable for working in teams and sharing those components (even publicly)
    • Great choice for design systems, i.e. making components once and using them for all your (future) applications, across different devices
    • There's a vast library of components already out there on npm and a big community of developers using it today
  • React's weaknesses:
    • May introduce too much overhead to small projects
    • It's an abstraction – can be misused and slow down your page
    • Need to learn JSX, hooks and other concepts

JSX Fundamentals

  • You always have to return JSX from a component for it to work
  • Returning JSX works like this
function MyComponent() {
  return <h1>Hello World</h1>;
}
  • JSX looks a bit like HTML, and you need to use HTML elements to build components
  • But JSX has some extra rules compared to plain HTML
  • For example, you always have to return a single root element, that's a fixed requirement
// ⚠️ THIS WON'T WORK
function MyBrokenComponent() {
  return (
    <h1>Hello World</h1>
  <h2>Hello Universe</h2>
)
}
  • You can use Fragments to address this issue
function MyComponent() {
  return (
    <React.Fragment>
      <h1>Hello World</h1>
      <h2>Hello Universe</h2>
    </React.Fragment>
  );
}

or

function MyComponent() {
  return (
    <>
      <h1>Hello World</h1>
      <h2>Hello Universe</h2>
    </>
  );
}
  • JSX is really a templating language, enabling you to use JavaScript while generating HTML (kind of)
  • You put JavaScript in {} curly braces
function MyComponent() {
  const firstName = "HackYour";
  return <h1>Hello {firstName + "Future"}</h1>;
}
  • This mechanism also allows you to "render" conditionally, showing different content based on conditions you define
  • Rendering is a fancy term for putting the HTML in the DOM that you describe in JSX, i.e. showing the component on the page
function MyComponent() {
  const isSunday = new Date().getDay() === 7;
  return (
    <>
      <h1>Hello!</h1>
      {isSunday ? <h1>What a nice Sunday!</h1> : null}
    </>
  );
}

Components & CSS imports

Thinking in components

  • What are components?
  • Breaking down UI into reusable components
  • Hierarchy and composition of components

Writing your first static component

  • Creating a Functional Component
  • Returning JSX
    • Single Root Element Requirement
    • Fragments
  • Using components inside components

Use {} to execute JS inside JSX

  • Embedding Expressions in JSX
  • Conditional Rendering

Setting attributes

  • Standard HTML attributes
  • className

Importing / exporting .jsx

  • default exports and named exports

Importing .css

  • Global styles vs. component-specific styles
  • CSS modules using Vite

Exercises

1. Setting up a new React project

  • Point your terminal at the folder where you manage your projects, e.g. cd ~/Sites
  • Scaffold a basic Vite React project by following the instructions in the Vite Guide
    • At the time of writing this, you can get started by running the following command npm create vite@latest hyf-frontend-react -- --template react, where hyf-frontend-react is the project/folder name that the tool will create
    • Confirm with y + Enter that npx may run the create tool
  • Open your IDE (probably VSCode) at the hyf-frontend-react folder (or alternative name you chose)
    • Run npm install in a terminal as requested above
    • Every time you start development, run npm run dev
  • Hints
    • Ctrl/Cmd + click on the URL displayed in your terminal, it watches your files and updates automatically in your browser
    • The file you likely want to edit to follow the next exercises is src/App.jsx
    • When you add components, create a src/components folder and add a file per component

2. Writing static components

  • Create a functional component called Greeting that returns an h1 element with the text "Hello, React!"
  • Create a functional component called Card that returns a article element with a nested h2 element and a p element. The h2 should display the text "Card Title", and the p should display the text "This is a card component"

3. Nesting components

  • Create a functional component called Cards that renders two instances of the Card components from the previous exercise, potentially inside a section element

4. Executing JavaScript in JSX

  • Create a functional component called Person containing two constants name and age. The component should display the text: {name} is an adult if the age is 18 or higher or {name} is a minor if the age is less than 18

5. Setting properties such as className and placeholder

  • Create a functional component called Button that renders a button element with a className prop set to btn primary
  • Create a functional component called DangerButton that renders a button element with a dangerous text and a className prop set to btn danger
  • Create a functional component called TextInput that renders a text input field with a placeholder value Type something here
  • Create a functional component called ProfileImage that renders an image of a person
  • Add all the components above to your app

6. Adding basic styling

  • Create a global CSS file that changes the color of all buttons to blue
  • Add component styles for the DangerButton which makes it large and red

(Bonus) Create a simple component structure

  • Design a basic layout with header, main content, and footer
  • Create separate components for each section