LEKCJA 04 - REACT (p) - router, create-react-app

LEKCJA 04 - REACT (p) - router, create-react-app
ukryj menu
SPEC
aktualizacja: 2021-09-28 10:00:58

UWAGA: przed wykonaniem dzisiejszych przykładów, proszę każdą osobę o ukończenie ćwiczenia 3 i 4 z lekcji poprzedniej (checkboxy i radios)


1. create-react-app - generator gotowej aplikacji Reacta

utwórz na pulpicie folder na aplikację

w tym folderze uruchom z konsoli


npx create-react-app testapp001kopiuj

po kilku minutach w podfolderze testapp001 widać gotowy do pracy projekt

UWAGA: po utworzeniu projektu proszę o spakowanie i wykonanie jego kopii na pulpicie, na wypadek braku internetu na kolejnych zajęciach.
UWAGA2: przy tym sposobie instalacji wszelkie zmiany w plikach katalogu /src są od razu updatowane na stronie


teraz

cd testapp001 kopiuj

uruchamiamy

npm startkopiuj

projekt uruchamia się przy pomocy zainstalowanego lokalnego serwera deweloperskiego


istotna dla dalszej pracy struktura powstałego projektu:

{appDir}
|__ src              
|    |__ App.js      
|    |__ App.css
|    |__ index.js    // wejście do aplikacji, tu można zmieniać App na App01, App02 etc
|    |__ index.css
|__ package.jsonkopiuj


po uruchomieniu npm run build (wersja produkcyjna) gotowa, skompilowana aplikacja tworzy się w podkatalogu /build

2. dodatek do VSCode - szybkie tworzenie plików klas

zainstaluj

https://marketplace.visualstudio.com/items?itemName=xabikos.ReactSnippetskopiuj

teraz po utworzeniu pliku klasy np Home napisz skrót rcc i naciśnij enter, tworzy się cała klasa komponentu

3. testowa aplikacja, bez routingu


Uwaga: w uruchomionej aplikacji muszą działać style css (App.css, Button.css
tak jak na skrinach 00
oraz kliknięcie w butony


dla przetestowania działania mechanizmów create-react-app, wstaw poniższe pliki do katalogu src

plik src/App.js

import React from 'react';

import Button from './Button';
import "./App.css";

class App extends React.Component {
  render() {
    return (
      ...     
    );
  }
}
export default App;kopiuj


plik src/App.css

tu dodaj odpowiednie style do komponentu App

plik src/Button.js

import React from 'react';
import './Button.css';

class Button extends React.Component {
  render() {
    return (
      ...     
    );
  }
}

export default Button;kopiuj


plik src/Button.css

dodaj odpowiednie style do komponentu Button, oraz alert po kliknięciu



4. ćwiczenie 01: React router - simple

pracujemy w aplikacji create-react-app

jest to ćwiczenie bazowe, kolejne opiera się na jego podstawie
proszę aby było w miarę podobne do skrina

routing React-a, działa deklaratywnie, ze składnią podobną do html-a

instalujemy w swojej aplikacji router reacta


npm install react-router --save-dev
npm install react-router-dom -save-devkopiuj


wszystkie pliki klas tworzymy w katalogu /src

plik src/App01.js

import React from "react";
import { BrowserRouter as Router, Route, Link, Switch } from "react-router-dom";kopiuj


import potrzebnych klas Home, About, Product i odpowiednich stylów z pliku App01.css

import Home from './Home';
import "./App01.css"kopiuj


return z klasy App

<Router>
 
   <Link to="/">Home</Link>
   <Link to="/about">About</Link>

   <Switch>
      <Route exact path="/" component={Home} />
      <Route exact path="/about" component={About} />
   </Switch>
               
</Router>kopiuj


element <Switch> działa jak switch w js - szuka pierwszego elementu który pasuje do url-a, resztę pomija
dlatego ważna jest kolejność Route w Switch




klasy Home, About, Product utwórz w osobnych plikach Home.js, About.js, Product.js, jak Button poprzednio

class Home extends React.Component {
  render() {
    return (
      ...     
    );
  }
}kopiuj


w index.js uruchamiamy całość aplikacji

import React from "react";
import ReactDOM from "react-dom";
import App from './App01'; // startowy komponent App01

ReactDOM.render(
   <App />,
   document.getElementById('root')
);kopiuj





5. kolejność matching urls

przy różnych parametrach w url-u istotna jest kolejność ich dopasowania w switchu,
najpierw odczytywany jest szczegółowy adres, potem bardziej ogólne,
obsługa adresu / powinna być zawsze na końcu ponieważ jest on częścią każdego adresu

router w klasie Parent


<Router>

   <Link to="/">Home</Link>
   <Link to="/details">Details</Link>
   <Link to="/details/1">Details/1</Link>
   <Link to="/details/2">Details/2</Link>


   <Switch>
      <Route path="/details/:id" component={Details} />
      <Route path="/details" component={Details} />
      <Route path="/" component={Home} />
   </Switch>

</Router>kopiuj


dla testów zamień kolejność Route z id i bez


6. ćwiczenie 02 - przesyłanie i odczyt parametrów w/z url-u

w pliku App02.js utwórz klasę App tak samo jak w poprzednim ćwiczeniu

ćwiczenie dla adresów typu:


localhost:3000/1
localhost:3000/2
localhost:3000/3kopiuj


router w klasie Parent

<Router>

   <Link to="/1">param = 1</Link>
   <Link to="/2">param = 2</Link>
   <Link to="/3">param = 3</Link>

   <Switch>
      <Route path="/:id" component={Child} />
   </Switch>

</Router>kopiuj


w przypadku klasy odczytujemy parametr jak poniżej (return klasy Child)

return (
   <h1>
      Child Page - params: {this.props.match.params.id}
   </h1>
)kopiuj





7. ćwiczenie 03 - dynamiczne generowanie linków

w pliku App03.js utwórz klasę App tak samo jak poprzednio

przy starcie aplikacji, w komponencie Links wygeneruj 50 linków
po kliknięciu każdego, prześlij parametr z linka do komponentu Child



8. ćwiczenie 04 - dynamiczne generowanie buttonów

w pliku App04.js utwórz klasę App tak samo jak poprzednio

przy starcie aplikacji, w komponencie Buttons wygeneruj tyle buttonów ile w adresie np localhost:3000/23
po kliknięciu każdego, wyświetl alert z odpowiednią liczbą


9. ćwiczenie 05 - dynamiczne generowanie divów


w pliku App05.js utwórz klasę App tak samo jak poprzednio

przy starcie aplikacji, w komponencie App wygeneruj tyle linków ile w tablicy: [7, 3, 5, 6, 10, 20, 2, 1, 11]
każdy lik kieruje do komponentu Divs, w którym generuje się odpowiednia liczba komponentów Div
po kliknięciu każdego Diva, liczba w nim zawarta powiększa się o jeden



10. ćwiczenie 06: React router - students panel

posługując się danymi json:

http://admins.spec.pl.hostingasp.pl/Stefa%C5%84czyk_Dariusz/temp/students.rarkopiuj

wykonaj aplikację jak na skrinach 07a, 07b, 07c

- załadowanie danych json z pliku students.json:

import students from "./students.json"kopiuj

klasy projektu:

App03,
Students,
Examskopiuj


wykonanie:

do utworzonych linków trzy razy podlinkuj obiekt klasy Students, od razu przekazując mu wybrane, przefiltrowane dane (all, men, women)

przykład przekazania props do klas linkowanych w Route:


<Route component={()=><Students anyprop={[1,2,3]} />} />kopiuj

lub

<Route render={()=><Students anyprop={[1,2]} />} />kopiuj

lub

<Route>
   <Students anyprop={[1,2,3,4,5]} />
<Route />kopiuj


Uwaga: w tym ćwiczeniu nie ma żadnych elementów routingu poza all, men, women
Całość zadania wewnątrz komponentu Students jest generowana przez Buttony a nie Link-i



11. podłączenie obrazka w klasie

import person from './person.png'

<img src={person} alt="person" />kopiuj



12. Łączenie stringów i zmiennych (template literals - przykłady)


a)

let xxx = 10
let yyy = 20
console.log(`{xxx=${xxx},yyy=${yyy},iloczyn=${xxx*yyy}}`)kopiuj


b)

console.log(`#${routes[0].path}`)kopiuj