From 79c7cfa5ab54cda336a234a71bda735e8e59e00b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Podlouck=C3=BD?= Date: Sun, 29 Oct 2023 20:07:10 +0100 Subject: [PATCH 1/3] =?UTF-8?q?P=C5=99eveden=C3=AD=20stavu=20a=20ud=C3=A1l?= =?UTF-8?q?osti=20do=20prvn=C3=AD=20lekce?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- daweb/react/entry.yml | 6 +- daweb/react/navrh/cv-dynamicke-stranky.md | 3 + daweb/react/navrh/cv-projekt.md | 3 + daweb/react/navrh/cv-router.md | 3 + daweb/react/navrh/cvdoma/filmovy-magazin.md | 8 ++ daweb/react/navrh/cvlekce/detsky-koutek.md | 47 +++++++ .../navrh/cvlekce/parametry/assets/centers.js | 58 ++++++++ .../react/navrh/cvlekce/parametry/exercise.md | 19 +++ daweb/react/navrh/entry.yml | 11 ++ daweb/react/navrh/faze-vyvoje.md | 20 +++ daweb/react/navrh/router.md | 123 ++++++++++++++++ daweb/react/navrh/spa.md | 132 ++++++++++++++++++ daweb/react/seznamy/entry.yml | 12 -- daweb/react/udalosti-stav/cv-stav.md | 3 - daweb/react/udalosti-stav/entry.yml | 11 -- daweb/react/udalosti-stav/udalosti.md | 41 ------ .../cv-projekt.md | 0 .../react/uvod-do-reactu/cv-prvni-aplikace.md | 4 - .../uvod-do-reactu/cv-react-komponenty.md | 4 - daweb/react/uvod-do-reactu/cv-react.md | 3 + .../react/uvod-do-reactu/cv-udalosti-stav.md | 4 + .../cv-udalosti.md | 0 .../cvdoma/chytry-dum/assets/ukazka.jpg | Bin .../cvdoma/chytry-dum/exercise.md | 0 .../cvdoma/xylofon.md | 0 .../cvlekce/seznamka/assets/layout.jpg | Bin 0 -> 143837 bytes .../cvlekce/seznamka/assets/photo.jpg | Bin 0 -> 44858 bytes .../cvlekce/seznamka/exercise.md | 15 ++ .../cvlekce/stav.md | 0 .../cvlekce/udalosti.md | 0 .../uvod-do-reactu/doporucene-postupy.md | 110 --------------- daweb/react/uvod-do-reactu/entry.yml | 12 +- .../react/uvod-do-reactu/komponenty-props.md | 71 ---------- daweb/react/uvod-do-reactu/obsah-stranky.md | 78 ----------- daweb/react/uvod-do-reactu/prvni-aplikace.md | 74 +++------- daweb/react/uvod-do-reactu/shrnuti.md | 7 + .../stav-pravidla.md | 6 +- .../{udalosti-stav => uvod-do-reactu}/stav.md | 25 ++++ daweb/react/uvod-do-reactu/udalosti.md | 43 ++++++ .../volitelne-ulozky.md | 0 40 files changed, 556 insertions(+), 400 deletions(-) create mode 100644 daweb/react/navrh/cv-dynamicke-stranky.md create mode 100644 daweb/react/navrh/cv-projekt.md create mode 100644 daweb/react/navrh/cv-router.md create mode 100644 daweb/react/navrh/cvdoma/filmovy-magazin.md create mode 100644 daweb/react/navrh/cvlekce/detsky-koutek.md create mode 100644 daweb/react/navrh/cvlekce/parametry/assets/centers.js create mode 100644 daweb/react/navrh/cvlekce/parametry/exercise.md create mode 100644 daweb/react/navrh/entry.yml create mode 100644 daweb/react/navrh/faze-vyvoje.md create mode 100644 daweb/react/navrh/router.md create mode 100644 daweb/react/navrh/spa.md delete mode 100644 daweb/react/seznamy/entry.yml delete mode 100644 daweb/react/udalosti-stav/cv-stav.md delete mode 100644 daweb/react/udalosti-stav/entry.yml delete mode 100644 daweb/react/udalosti-stav/udalosti.md rename daweb/react/{udalosti-stav => uvod-do-reactu}/cv-projekt.md (100%) delete mode 100644 daweb/react/uvod-do-reactu/cv-prvni-aplikace.md delete mode 100644 daweb/react/uvod-do-reactu/cv-react-komponenty.md create mode 100644 daweb/react/uvod-do-reactu/cv-react.md create mode 100644 daweb/react/uvod-do-reactu/cv-udalosti-stav.md rename daweb/react/{udalosti-stav => uvod-do-reactu}/cv-udalosti.md (100%) rename daweb/react/{udalosti-stav => uvod-do-reactu}/cvdoma/chytry-dum/assets/ukazka.jpg (100%) rename daweb/react/{udalosti-stav => uvod-do-reactu}/cvdoma/chytry-dum/exercise.md (100%) rename daweb/react/{udalosti-stav => uvod-do-reactu}/cvdoma/xylofon.md (100%) create mode 100644 daweb/react/uvod-do-reactu/cvlekce/seznamka/assets/layout.jpg create mode 100644 daweb/react/uvod-do-reactu/cvlekce/seznamka/assets/photo.jpg create mode 100644 daweb/react/uvod-do-reactu/cvlekce/seznamka/exercise.md rename daweb/react/{udalosti-stav => uvod-do-reactu}/cvlekce/stav.md (100%) rename daweb/react/{udalosti-stav => uvod-do-reactu}/cvlekce/udalosti.md (100%) delete mode 100644 daweb/react/uvod-do-reactu/doporucene-postupy.md delete mode 100644 daweb/react/uvod-do-reactu/komponenty-props.md delete mode 100644 daweb/react/uvod-do-reactu/obsah-stranky.md create mode 100644 daweb/react/uvod-do-reactu/shrnuti.md rename daweb/react/{udalosti-stav => uvod-do-reactu}/stav-pravidla.md (53%) rename daweb/react/{udalosti-stav => uvod-do-reactu}/stav.md (78%) create mode 100644 daweb/react/uvod-do-reactu/udalosti.md rename daweb/react/{udalosti-stav => uvod-do-reactu}/volitelne-ulozky.md (100%) diff --git a/daweb/react/entry.yml b/daweb/react/entry.yml index d88798eb..8fa11649 100644 --- a/daweb/react/entry.yml +++ b/daweb/react/entry.yml @@ -2,13 +2,11 @@ title: React lead: Díky Reactu budete schopni vytvářet profesionální webové aplikace mnohem rychleji než v čistém JavaScriptu. lessons: - uvod-do-reactu -# - podminene-zobrazeni -# - seznamy - - udalosti-stav - formulare-efekty - komunikace-dite-rodic - komunikace-sourozenci - react-router - leviexpress-1 - leviexpress-2 - - chyby-async-await + - navrh + - ui-knihovny diff --git a/daweb/react/navrh/cv-dynamicke-stranky.md b/daweb/react/navrh/cv-dynamicke-stranky.md new file mode 100644 index 00000000..6deeae6d --- /dev/null +++ b/daweb/react/navrh/cv-dynamicke-stranky.md @@ -0,0 +1,3 @@ +## Cvičení: Dynamické stránky + +::exc[cvlekce/parametry] diff --git a/daweb/react/navrh/cv-projekt.md b/daweb/react/navrh/cv-projekt.md new file mode 100644 index 00000000..b2dfe188 --- /dev/null +++ b/daweb/react/navrh/cv-projekt.md @@ -0,0 +1,3 @@ +## Cvičný projekt + +::exc[cvdoma/filmovy-magazin] diff --git a/daweb/react/navrh/cv-router.md b/daweb/react/navrh/cv-router.md new file mode 100644 index 00000000..1e444ede --- /dev/null +++ b/daweb/react/navrh/cv-router.md @@ -0,0 +1,3 @@ +## Cvičení: React Router + +::exc[cvlekce/detsky-koutek] diff --git a/daweb/react/navrh/cvdoma/filmovy-magazin.md b/daweb/react/navrh/cvdoma/filmovy-magazin.md new file mode 100644 index 00000000..99cfa0e4 --- /dev/null +++ b/daweb/react/navrh/cvdoma/filmovy-magazin.md @@ -0,0 +1,8 @@ +--- +title: Filmový magazín +demand: 3 +--- + +Cílem projektu je naprogramovat stránku internetového filmového magazínu. Naše aplikace bude mít menu, ve kterém půjde přepínat mezi několika stránkami. Na jedné stránce bude dále možné vybírat ze seznamu filmy a zobrazit si o nich podrobnosti. + +Známým postupem si vytvořte kopii [repozitáře projektu](https://github.com/Czechitas-podklady-WEB/projekt-filmovy-magazin). Podrobný popis úkolu včetně schéma celé aplikace najdete v popisu repozitáře. diff --git a/daweb/react/navrh/cvlekce/detsky-koutek.md b/daweb/react/navrh/cvlekce/detsky-koutek.md new file mode 100644 index 00000000..b9f64767 --- /dev/null +++ b/daweb/react/navrh/cvlekce/detsky-koutek.md @@ -0,0 +1,47 @@ +--- +title: Dětský koutek +demand: 3 +--- + +V tomto cvičení vytvoříte jednoduchou stránku pro dětský koutek. Pomocí knihovny React Router vytvoříte navigaci, která umožní zobrazit různé komponenty na základě cesty v URL. + +1. Vygenerujte si novou aplikaci pomocí příkazu + ```sh + npm init kodim-app@latest detsky-koutek + ``` +1. Nainstalujte si knihovnu React Router pomocí _npm_: + ```sh + npm install react-router-dom + ``` +1. Spusťte aplikaci příkazem `npm start` a zkontrolujte, že vám v prohlížeči správně běží. +1. Nebojte se v následujících krocích inspirovat dokumentací [React Routeru](https://reactrouter.com/en/main/start/overview)! +1. V hlavním souboru `index.jsx` založte objekt s routami. Zatím zobrazujte pouze hlavní komponentu `App` pod cestou `/`. Nezapomeňte použít `RouterProvider` ve funkci `render`. Vyzkoušejte, že takto vaše aplikace funguje. +1. V `src` adresáři vytvořte složku `pages` a uvnitř složky s komponentami pro jednotlivé stránky _Home_, _About_ a _Contact_. +1. Stránka _Home_ bude obsahovat nadpis a odstavec s textem: + + ``` + Dětský koutek + + Vítejte v našem dětském koutku! Jsme místo plné zábavy a dobrodružství pro všechny děti do 6ti let. Najdete u nás hry, aktivity, kvízy a mnoho dalšího, co zabaví vaše ratolesti a pomůže jim učit se nové věci. Vyberte si některou z našich poboček a začněte objevovat svět plný překvapení! + ``` + +1. Stránka _About_ bude obsahovat nadpis a odstavec s textem: + + ``` + O nás + + Jsme tým mladých nadšenců do vzdělávání a zábavy pro děti. Naše poslání je vytvářet podnětné a zábavné aktivity pro děti, které podporují jejich rozvoj a učení nových dovedností. Vytvořili jsme dětský koutek jako místo, kde se děti cítí v bezpečí, mohou objevovat a zároveň se něco nového naučit. Doufáme, že se k nám vydáte a budete s námi sdílet své zážitky a nápady na další aktivity! + ``` + +1. Stránka _Contact_ bude obsahovat nadpis a odstavec s textem: + + ``` + O nás + + Pokud máte jakékoliv otázky, nápady nebo nám chcete prostě jen napsat, zanechte nám zprávu přes náš kontaktní formulář a my se vám co nejdříve ozveme. Pokud preferujete jiný způsob komunikace, můžete nám také napsat e-mail na adresu info@detskykoutek.cz nebo nás kontaktovat přes naše sociální sítě. Děkujeme vám za vaši zpětnou vazbu a těšíme se na vaše zprávy! + ``` + +1. V souboru `index.jsx` si naimportujte všechny vytvořené stránky a přidejte je jako `children` vašeho routeru pod cesty `/`, `about` a `contact`. +1. V komponentě `App` vytvořte navigaci pomocí `Link` komponent a dejte do ní odkazy na všechny výše uvedené stránky. Použijte komponentu `Outlet` na vyznačení místa, kam se máji vkládat jednotlivé stránky. +1. Vyzkoušejte, že aplikace správně naviguje - mění adresu a obsah podle klikání na odkazy. +1. Pokud máte čas a chuť, přidejte na web zajímavější obsah dle libosti a nastylujte jednotlivé stránky i navigaci. diff --git a/daweb/react/navrh/cvlekce/parametry/assets/centers.js b/daweb/react/navrh/cvlekce/parametry/assets/centers.js new file mode 100644 index 00000000..9a8aa58b --- /dev/null +++ b/daweb/react/navrh/cvlekce/parametry/assets/centers.js @@ -0,0 +1,58 @@ +const centers = [ + { + id: 'hernicka-narodni', + name: 'Hernička v Národní', + address: 'Národní 28, 110 00 Praha 1', + capacity: 20, + open: { + mon: '8:00 - 18:00', + tue: '8:00 - 18:00', + wed: '8:00 - 18:00', + thu: '8:00 - 18:00', + fri: '8:00 - 18:00', + sat: '9:00 - 12:00', + sun: null, + }, + info: 'Nachází se v těsné blízkosti historického centra Prahy a má skvělou polohu pro rodiny které chtějí prozkoumat město a zároveň se postarat o své malé děti. Koutek má příjemné prostředí, kde se děti mohou hrát a učit se novým věcem. K dispozici jsou také kreativní workshopy, kde děti mohou tvořit a vyrábět své vlastní hračky.', + }, + { + id: 'vodickuv-koutek', + name: 'Vodičkův koutek', + address: 'Vodičkova 39, 110 00 Praha 1', + capacity: 15, + open: { + mon: '9:00 - 17:00', + tue: '9:00 - 17:00', + wed: '9:00 - 17:00', + thu: '9:00 - 17:00', + fri: '9:00 - 17:00', + sat: null, + sun: null, + }, + info: 'Tento koutek je ideálním místem pro rodiče, kteří se chtějí zastavit na nákup v centru Prahy, ale mají s sebou děti. Koutek nabízí profesionální péči o děti, takže se mohou rodiče soustředit na své nákupy a mít klid v duši, že jsou jejich děti v bezpečí a dobře se baví.', + }, + { + id: 'vaclavak', + name: 'Koutek Václavák', + address: 'Václavské nám. 816/49, 110 00 Praha 1', + capacity: 30, + open: { + mon: '7:30 - 18:00', + tue: '7:30 - 18:00', + wed: '7:30 - 18:00', + thu: '7:30 - 18:00', + fri: '7:30 - 18:00', + sat: null, + sun: null, + }, + info: 'Tento koutek je jedním z největších v Praze a nabízí širokou škálu aktivit pro děti, jako jsou kreativní workshopy, hudební lekce a taneční kurzy. Koutek má také velkou zahradu, kde se děti mohou hrát na čerstvém vzduchu a užít si slunečné dny. Pro rodiče je k dispozici relaxační zóna, kde se mohou odpočinout a relaxovat.', + }, +]; + +export const getAllCenters = () => { + return centers; +}; + +export const getCenterById = (id) => { + return centers.find((center) => center.id === id); +}; diff --git a/daweb/react/navrh/cvlekce/parametry/exercise.md b/daweb/react/navrh/cvlekce/parametry/exercise.md new file mode 100644 index 00000000..bb4a6d0e --- /dev/null +++ b/daweb/react/navrh/cvlekce/parametry/exercise.md @@ -0,0 +1,19 @@ +--- +title: Pobočky dětského koutku +demand: 4 +--- + +Budeme pokračovat v projektu dětského koutku. Přidáme možnost zobrazit seznam poboček a každou pobočku rozkliknout pro získání více informaci. + +1. Pokračujte v projektu z předchozího cvičení. +1. Nejprve do projektu přidejte stránku, která správně ošetří přístup na neexistující stránku, tedy chybu 404. +1. Dále přidejte do navigace stránku _Pobočky_ a vytvořte pro ni samostatnou komponentu `CentersPage`. Na této stránce budeme chtít zobrazit jednotlivé pobočky našeho dětského koutku (viz další bod). +1. Do složky `src` si stáhněte soubor [`centers.js`](assets/centers.js), který bude představovat databázi poboček. +1. Do souboru s komponentou pro seznam poboček si importuje funkci `getAllCenters`. Pomocí mapování zobrazte seznam odkazů na jednotlivé pobočky. Odkaz bude vždy cesta `/pobocky/id-pobocky`. Zatím nezobrazujte detail pobočky, pouze její název a adresu. Tento seznam bude sloužit jako navigace mezi jednotlivými pobočkami. +1. Vytvořte komponentu `CenterDetail` pro zobrazení detailu pobočky. Tato komponenta bude sídlit pod cestou `/pobocky/:id`. Pomocí `useParams` a funkce `getCenterById` získejte položku podle parametru `:id`. Zobrazte detail pobočky s otvíracími hodinami i popisem. +1. Komponentu `CenterDetail` zobrazte jako `` uvnitř komponenty `CentersPage`. +1. Nyní by měla stránka správně fungovat. Po kliknutí na pobočku se uživatel dostane na stránku s detailem každé pobočky. Zároveň na stránce uvidí hlavní navigaci i seznam ostatních poboček. + +#### Bonus + +1. Přidejte zajímavé featury z dokumentace. Například stylování odkazů podle toho, která stránka je zrovna aktivní. S tím nám pomůže komponenta [NavLink](https://reactrouter.com/en/6.10.0/start/tutorial#active-link-styling). diff --git a/daweb/react/navrh/entry.yml b/daweb/react/navrh/entry.yml new file mode 100644 index 00000000..7240dc58 --- /dev/null +++ b/daweb/react/navrh/entry.yml @@ -0,0 +1,11 @@ +title: React Router +lead: 'Pomocí routeru dokážeme v Reactu vyrobit vícestránkovou aplikaci.' +access: 'claim' +sections: + - spa + - router + - cv-router + - chyby + - dynamicky-obsah + - cv-dynamicke-stranky + - cv-projekt diff --git a/daweb/react/navrh/faze-vyvoje.md b/daweb/react/navrh/faze-vyvoje.md new file mode 100644 index 00000000..3ad9c6d8 --- /dev/null +++ b/daweb/react/navrh/faze-vyvoje.md @@ -0,0 +1,20 @@ +## Fáze vývoje webové aplikace + +V mnoha cvičeních a projektech v tomto kurzu už jste jistě zažili, že i tu úplně nejobyčejnější webovou aplikaci nikdo nezvládne napsat najednou, takříkajíc z voleje. Vždy je potřeba si práci nějak dopředu rozvrhnout a naplánovat si jednotlivé fáze. + +Při vývoji webových aplikaci většinou postupujeme podle následujícího schématu: + +1. **Návrh** – připravíme návrh aplikace, který může být v podobě wireframů, grafického návrhu, nebo jenom výčtu požadavků. V této fázi se také rozhodneme, jaké technologie budeme používat a jakým způsobem budeme aplikaci vyvíjet. Návrh vzniká na základě anlýzy požadavků zadavatele, což může být náš klient, nebo třeba jenom my sami. +1. **Grafický design** – připravíme grafický návrh. V této fázi se rozhodneme o barvách, typografii, velikosti elementů, UX atd. Výsledkem je grafický návrh, který může být vytvořen v nějakém grafickém editoru, nebo třeba jenom v HTML a CSS. +1. **Návrh architektury** – rozhodneme se, jakou bude naše aplikace mít strukturu, jaké komponenty budeme potřebovat, jaká data budeme ukládat a jakým způsobem je budeme zpracovávat. Výsledkem je návrh architektury aplikace, který může být vytvořen v nějakém nástroji k tomu určeném, nebo může být pro menší projekty jen v naší hlavě. +1. **Implementace** – naprogramujeme aplikaci podle návrhu. Výsledkem je funkční aplikace, která ještě nemusí být plně odladěná. +1. **Testování** – otestujeme aplikaci a odstraníme všechny chyby. Výsledkem je funkční aplikace, která je plně odladěná. + +V praxi se tyto fáze často prolínají a některé z nich se mohou opakovat. Například při tvorbě architektury můžeme zjistit, že náš původní návrh není úplně ideální a musíme se vrátit zpět. Nebo při implementaci můžeme zjistit, že náš původní návrh architektury nebyl úplně ideální a je potřeba ji upravit nebo úplně předělat. + +## Architektura aplikace + +V našem případě si při návrhu architektury budeme soustředit na následující body: + +1. **Struktura dat** – jaká data budeme potřebovat ukládat a spravovat pomocí našeho API. Výsledkem tohoto bodu mohou být například ukázkové JSON soubory s daty pro `jsonhost`. +1. **Struktura komponent** – jaké komponenty budeme potřebovat, jak budou získávat data a jak budou spolu komunikovat. Výsledkem tohoto bodu jednoduchý popis jednotlivých komponent ve formátu, který si za chvíli ukážeme. diff --git a/daweb/react/navrh/router.md b/daweb/react/navrh/router.md new file mode 100644 index 00000000..6eed14c4 --- /dev/null +++ b/daweb/react/navrh/router.md @@ -0,0 +1,123 @@ +## React Router + +Napsat navigaci mezi stránkami v čistém JavaScriptu jste si už vyzkoušeli v předchozím kurzu. Co se Reactu týká, máme situaci malinko jednodušší. Existuje totiž standardní knihovna pro routing, kterou používá většina reactových projektů na celém světě. Jmenuje [React Router](https://reactrouter.com/) a nainstalovat si ji můžete jako závislost přes _npm_ a následně z ní můžeme používat připravené komponenty přímo v našem kódu. + +### Instalace a používání knihovny + +Do existujícího projektu můžeme nainstalovat React Router knihovnu přest terminál pomocí _npm_. + +```sh +npm install react-router-dom +``` + +Nyní máme v projektu k dispozici celou škálu komponent, se kterými můzeme pracovat. Stačí si je správně naimportovat a použít jako kteroukoliv jinou komponentu. + +Vytvořme pro začátek kostru webové aplikace pro vedení účetnictví. + +```js +import React from 'react'; +import { createRoot } from 'react-dom/client'; +import { createBrowserRouter, RouterProvider, Link } from 'react-router-dom'; +import './style.css'; + +const App = () => { + return ( +
+

Bookkeeper!

+ +
+ ); +}; + +const ExpensesPage = () => { + return ( +
+

Expenses

+

Here are your business expenses for the last month

+
+ ); +}; + +const InvoicesPage = () => { + return ( +
+

Invoices

+

Here are your issued invoices for the last month

+
+ ); +}; + +const router = createBrowserRouter([ + { + path: '/', + element: , + }, + { + path: '/expenses', + element: , + }, + { + path: '/invoices', + element: , + }, +]); + +createRoot(document.querySelector('#app')).render( + +); +``` + +Na začátku aplikace jsme vytvořili komponentu `App`, která se zobrazí jako hlavní stránka. Jednotlivé odkazy pak vedou na dvě podstránky `ExpensesPage` a `InvoicesPage`. + +### Komponenta `Link` + +Všimněte si, že pro navigaci mezi stránkami používáme místo obyčejného prvku `` komponentu `Link`. To je velmi důležité, protože kdybychom použili normální HTML odkazy, vždy bychom tím poslali požadavek na novou stránku na server. V SPA aplikacích však server posílá vždy jednu a tutéž stránku `index.html` jako odpověd na všechny cesty v URL. Soubor `index.html` už však dávno máme načtený, takže jej nepotřebujeme znovu. Dotaz na server je zbytečný a zbytečně by způsobil refresh stránky. My naopak chceme, aby se ze serveru nic nenačítalo a přepnutí stránky se stalo pouze na frontendu v režii React Routeru. + +### Routování části stránky + +Naše aplikace má nevýhodu v tom, že nám při přepnutí na jednotlivé stránky zmizí navigace. Weby často fungují tak, že při přepínání mezi stránkami se zachovává například hlavička a patička. Tohoto chování docílíme pomocí tazvaných _child routes_ a komponenty `Outlet`. + +Náš objekt s routami upravíme takto: + +```js +const router = createBrowserRouter([ + { + path: '/', + element: , + children: [ + { + path: 'expenses', + element: , + }, + { + path: 'invoices', + element: , + }, + ], + }, +]); +``` + +Vytvořili jsme tak dva potomky naší kořenové routy. Nyní musíme routeru říct, kde na stránce má naše potomky zobrazovat. To zařídíme pomoctí komponenty `Outlet`. + +```jsx +const App = () => { + return ( +
+

Bookkeeper!

+ + +
+ ); +}; +``` + +Nyní už naše aplikace bude mnohem hezčí a přehlednější. diff --git a/daweb/react/navrh/spa.md b/daweb/react/navrh/spa.md new file mode 100644 index 00000000..07d1923f --- /dev/null +++ b/daweb/react/navrh/spa.md @@ -0,0 +1,132 @@ +## Mapa komponent + +Zkušenjší programátoři si většinou umějí strukturu komponent představit v hlavě. My však v tomto kurzu takto daleko nejsme a proto si zde zavedeme způsob, jak strukturu komponent popsat pomocí jednoduchého textového formátu. Tento formát budeme nazývat _mapa komponent_ a budeme jej ukládat do textových souborů s příponou `.cmap`. + +Hlavní věc, kterou si při návrhu každý komponenty musíme rozmyslet je, odkud komponenta bude získávat data. V podstatě máme na výběr ze čtyř možností: + +1. **Žádná data** – komponenta žádná data nezískává a všechno, co zobrazuje, má uloženo rovnou uvnitř JSX. +1. **Data z props** – komponenta získává data od svého rodiče skrze _props_. +1. **Data z API** – komponenta si sama stahuje data z API pomocí `fetch`. +1. **Data od potomků** – komponenta získává data od svých potomků skrze callbacky. + +Ukažme si všechny tyto případy na jednoduchém příkladu aplikace pro správu úkolů. Tato aplikace sestává z komponent `Header`, `Score`, `TaskList` a `Task`. Komponenta `Header` zobrazuje hlavičku stránky, komponenta `Score` zobrazuje počet splněných úkolů, komponenta `TaskList` zobrazuje seznam úkolů a komponenta `Task` zobrazuje jednu položku v seznamu úkolů. + +### Komponenta bez dat + +Toto je nejjednodušší případ, kde všechno, co komponenta zobrazuje, má uloženo rovnou uvnitř JSX. Příkladem takové komponenty může být například komponenta `Header`, která zobrazuje hlavičku stránky. + +```jsx +const Header = () => { + return ( +
+

xerotodo

+

Vaše úkoly na jednom místě

+
+ ); +}; +``` + +Takovouto komponentu v naší mapě komponent napíšeme prostě takto: + +``` +Header +``` + +### Komponenta s daty z props + +Tento případ je také vcelku jednoduchý. Komponenta získává data od svého rodiče skrze _props_. Příkladem takové komponenty je komponenta `Task`, která zobrazuje jednu položku v seznamu úkolů. + +```jsx +const Task = ({ task }) => { + return ( +
  • + + {task.text} +
  • + ); +}; +``` + +Takovou komponentu v naší mapě komponent napíšeme takto: + +``` +Task + :props task +``` + +### Komponenta s daty z API + +Komponenta si sama stahuje data z API pomocí `fetch`. Příkladem takové komponenty `TaskList`, která zobrazuje seznam všech položek v seznamu úkolů. + +```jsx +const TaskList = () => { + const [tasks, setTasks] = useState([]); + + useEffect(() => { + const fetchTasks = async () => { + const response = await fetch('http://localhost:4000/api/tasks'); + const data = await response.json(); + setTasks(data); + }; + fetchTasks(); + }, []); + + return ( +
      + {tasks.map((task) => ( + + ))} +
    + ); +}; +``` + +Komponenta `TaskList` si stahuje data z API pomocí `fetch` a ukládá je do stavu. V mapě komponent tedy napíšeme: + +``` +TaskList + :api http://localhost:4000/api/tasks +``` + +### Komponenta s daty od potomků + +Komponenta získává data od svých potomků skrze callbacky. Příkladem takové komponenty je komponenta `Score`, která zobrazuje počet splněných úkolů. + +```jsx +const Score = () => { + const [done, setDone] = useState(0); + + const handleTaskDone = () => { + setDone(done + 1); + }; + + return ( +

    + Splněno úkolů: {done} + +

    + ); +}; +``` + +Tuto komponentu v mapě komponent napíšeme takto: + +``` +Score + :callback onTaskDone +``` + +Mapa komponent celé aplikace tedy bude vypadat náslendovně: + +``` +Header + +Score + :callback onTaskDone + +TaskList + :api http://localhost:4000/api/tasks + + Task + :props task +``` diff --git a/daweb/react/seznamy/entry.yml b/daweb/react/seznamy/entry.yml deleted file mode 100644 index 5c578c97..00000000 --- a/daweb/react/seznamy/entry.yml +++ /dev/null @@ -1,12 +0,0 @@ -title: Zobrazování seznamů -lead: 'Ukážeme si, jak v React komponentách zobrazovat seznamy.' -access: 'claim' -sections: - - opakovani-map - - cv-zkracovani-map - - seznamy-v-jsx - - slozitejsi-komponenty - - key-prop - - cv-seznamy - - ulozky-na-doma - - cv-projekt \ No newline at end of file diff --git a/daweb/react/udalosti-stav/cv-stav.md b/daweb/react/udalosti-stav/cv-stav.md deleted file mode 100644 index e749a1d7..00000000 --- a/daweb/react/udalosti-stav/cv-stav.md +++ /dev/null @@ -1,3 +0,0 @@ -## Cvičení: Stav - -::exc[cvlekce/stav] diff --git a/daweb/react/udalosti-stav/entry.yml b/daweb/react/udalosti-stav/entry.yml deleted file mode 100644 index 0c3ac520..00000000 --- a/daweb/react/udalosti-stav/entry.yml +++ /dev/null @@ -1,11 +0,0 @@ -title: Události, stav -lead: 'Přidáme do našich komponent stav, abychom mohli měnit obsah stránky podle interakce s uživatelem.' -access: 'claim' -sections: - - udalosti - - cv-udalosti - - stav - - stav-pravidla - - cv-stav - - volitelne-ulozky - - cv-projekt diff --git a/daweb/react/udalosti-stav/udalosti.md b/daweb/react/udalosti-stav/udalosti.md deleted file mode 100644 index 6e9d94a0..00000000 --- a/daweb/react/udalosti-stav/udalosti.md +++ /dev/null @@ -1,41 +0,0 @@ -Práce se stavem je hlavní téma celého React frameworku. Porozumění tomu, jak stav v Reactu funguje, je základem pro tvorbu interaktivních komponent. Porozumět stavovému mechanismu v Reactu může být ze začátku výzva, proto jsme si dali s touto kapitolou na čas a ke stavu se dostáváme až nyní, kdy už umíme pracovat s komponentami i JSX. - -## Události - -Základem veškeré interaktivity na webu jsou události. Do této chvíle jsme si již mnohokrát zkusili, jak na události reagovat v čistém JavaScriptu. V Reactu máme díky JSX život opět o kus snadnější, neboť již nemusíme používat ani `querySelector` ani `addEventListener`. Funkci pro reakci na událost nastavíme vždy danému JSX elementu přímo jako atribut. - -Takto například zobrazíme upozornění při kliknutí na tlačítko. - -```js -const App = () => { - const handleClick = () => { - alert('ahoj'); - }; - - return ( - - ); -}; -``` - -Náš kód funguje tak, že si uvnitř komponenty `App` nejdříve vyrobíme funkci `handleClick`, která bude reagovat na kliknutí na tlačítko. Tuto funkci pak vložíme do atributu `onClick`. Všechny atributy pro nám už známé události začínají předponou `on`. Pro další události tedy máme atributy jako `onKeyDown`, `onMouseEnter` apod. - -Podobně jako v čistém JavaScriptu mohou mít naše posluchače jeden parametr, který představuje událost, která právě nastala. Můžeme tak například používat vlastnost `target` podobně, jako jsme to dělali doposud. - -Takto například můžeme sledovat obsah textového políčka. - -```js -const App = () => { - const handleChange = (event) => { - console.log(event.target.value); - }; - - return ; -}; -``` - -### Přímá manipulace s obsahem stránky - -V Reactu se téměř nikdy nepoužívá přímá manipulace s obsahem stránky. Nepoužíváme tedy `querySelector` pro výběr elementů ani jim sami nenastavujeme vlastnosti jako `textContent`, `className` apod. Naše události jsou tedy zatím omezeny pouze na zobrazování vyskakovacích oken a vypisování do konzole. Jak správně měnit obsah stránky reactovým způsobem se naučíme v druhé části lekce. diff --git a/daweb/react/udalosti-stav/cv-projekt.md b/daweb/react/uvod-do-reactu/cv-projekt.md similarity index 100% rename from daweb/react/udalosti-stav/cv-projekt.md rename to daweb/react/uvod-do-reactu/cv-projekt.md diff --git a/daweb/react/uvod-do-reactu/cv-prvni-aplikace.md b/daweb/react/uvod-do-reactu/cv-prvni-aplikace.md deleted file mode 100644 index 1cbe88e4..00000000 --- a/daweb/react/uvod-do-reactu/cv-prvni-aplikace.md +++ /dev/null @@ -1,4 +0,0 @@ -## Cvičení: První React aplikace - -::exc[cvlekce/prvni-kroky] -::exc[cvlekce/plysaci] diff --git a/daweb/react/uvod-do-reactu/cv-react-komponenty.md b/daweb/react/uvod-do-reactu/cv-react-komponenty.md deleted file mode 100644 index 09001c6e..00000000 --- a/daweb/react/uvod-do-reactu/cv-react-komponenty.md +++ /dev/null @@ -1,4 +0,0 @@ -## Cvičení: React komponenty - -::exc[cvlekce/aplikace] -::exc[cvlekce/datumy] diff --git a/daweb/react/uvod-do-reactu/cv-react.md b/daweb/react/uvod-do-reactu/cv-react.md new file mode 100644 index 00000000..02aa76eb --- /dev/null +++ b/daweb/react/uvod-do-reactu/cv-react.md @@ -0,0 +1,3 @@ +## Cvičení: První React aplikace + +::exc[cvlekce/seznamka] diff --git a/daweb/react/uvod-do-reactu/cv-udalosti-stav.md b/daweb/react/uvod-do-reactu/cv-udalosti-stav.md new file mode 100644 index 00000000..ebace65e --- /dev/null +++ b/daweb/react/uvod-do-reactu/cv-udalosti-stav.md @@ -0,0 +1,4 @@ +## Cvičení: Události, stav + +::exc[cvlekce/udalosti] +::exc[cvlekce/stav] diff --git a/daweb/react/udalosti-stav/cv-udalosti.md b/daweb/react/uvod-do-reactu/cv-udalosti.md similarity index 100% rename from daweb/react/udalosti-stav/cv-udalosti.md rename to daweb/react/uvod-do-reactu/cv-udalosti.md diff --git a/daweb/react/udalosti-stav/cvdoma/chytry-dum/assets/ukazka.jpg b/daweb/react/uvod-do-reactu/cvdoma/chytry-dum/assets/ukazka.jpg similarity index 100% rename from daweb/react/udalosti-stav/cvdoma/chytry-dum/assets/ukazka.jpg rename to daweb/react/uvod-do-reactu/cvdoma/chytry-dum/assets/ukazka.jpg diff --git a/daweb/react/udalosti-stav/cvdoma/chytry-dum/exercise.md b/daweb/react/uvod-do-reactu/cvdoma/chytry-dum/exercise.md similarity index 100% rename from daweb/react/udalosti-stav/cvdoma/chytry-dum/exercise.md rename to daweb/react/uvod-do-reactu/cvdoma/chytry-dum/exercise.md diff --git a/daweb/react/udalosti-stav/cvdoma/xylofon.md b/daweb/react/uvod-do-reactu/cvdoma/xylofon.md similarity index 100% rename from daweb/react/udalosti-stav/cvdoma/xylofon.md rename to daweb/react/uvod-do-reactu/cvdoma/xylofon.md diff --git a/daweb/react/uvod-do-reactu/cvlekce/seznamka/assets/layout.jpg b/daweb/react/uvod-do-reactu/cvlekce/seznamka/assets/layout.jpg new file mode 100644 index 0000000000000000000000000000000000000000..0183a3feca7e1888a40b19ebe2c6db4d1f102b88 GIT binary patch literal 143837 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⪙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 - ); -}; - -const App = () => { - return ( - <> -
    -

    Shopping List

    -
    -
    - - - - -
    -
    Martin Podloucký
    - - ); -}; - -createRoot(document.querySelector('#app')).render(); -``` - -### Rozdělení komponent do složek - -Už při práci v čistém JavaScriptu jsme se učili rozdělovat komponenty do separátních složek. Tento postup budeme v Reactu přísně dodržovat a pro každou komponentu vždy vytvoříme složku obsahující její zdrojový JavaScript, styly i obrázky. - -Naší komponentu `ShoppingItem` tak vložíme do složky `ShoppingItem` se souborem `index.jsx`. Ten bude obsahovat kód naší komponenty. - -```js -import React from 'react'; - -const ShoppingItem = (props) => { - return ( -
    - {props.name} - {props.amount} -
    - ); -}; - -export default ShoppingItem; -``` - -Všimněte si, že zde neimportujeme funkci `render`. Tu použijeme pouze v hlavním `index.jsx` na zobrazení celé aplikace. V jednotlivých komponentách ji nepotřebujeme. Také dejte pozor na to, že komponentu exportujeme pomocí `export default`. To je speciální forma exportování pro případ, kdy z našeho souboru chceme exportovat pouze jednu funkci. - -Pokud bychom komponentu exportovali tak, jako dříve - -```js -export const ShoppingItem = (props) => { -``` - -importovali bychom ji pak takto - -```js -import { ShoppingItem } from './ShoppingItem'; -``` - -Pokud ji exportujeme pomocí `export default`, při importu vynecháme složené závorky. - -```js -import ShoppingItem from './ShoppingItem'; -``` - -Výsledný hlavní `index.jsx` celé aplikace pak bude vypadat takto. - -```js -import React from 'react'; -import { createRoot } from 'react-dom/client'; -import ShoppingItem from './ShoppingItem'; - -const App = () => { - return ( - <> -
    -

    Shopping List

    -
    -
    - - - - -
    -
    Martin Podloucký
    - - ); -}; - -createRoot(document.querySelector('#app')).render(); -``` diff --git a/daweb/react/uvod-do-reactu/entry.yml b/daweb/react/uvod-do-reactu/entry.yml index 72d71c12..18ca8243 100644 --- a/daweb/react/uvod-do-reactu/entry.yml +++ b/daweb/react/uvod-do-reactu/entry.yml @@ -2,9 +2,9 @@ title: Úvod do Reactu lead: Napíšeme si první aplikace v Reactu a představíme si hlavní principy tohoto moderního frameworku. sections: - prvni-aplikace - - obsah-stranky - - vkladani-hodnot - - cv-prvni-aplikace - - komponenty-props - - doporucene-postupy - - cv-react-komponenty \ No newline at end of file + - cv-react + - udalosti + - stav + - stav-pravidla + - cv-udalosti-stav + - shrnuti diff --git a/daweb/react/uvod-do-reactu/komponenty-props.md b/daweb/react/uvod-do-reactu/komponenty-props.md deleted file mode 100644 index 74881a52..00000000 --- a/daweb/react/uvod-do-reactu/komponenty-props.md +++ /dev/null @@ -1,71 +0,0 @@ -## React komponenty a props - -Velká výhoda, kterou nám JSX přináší, spočívá v tom, že můžeme naše komponenty psát podobně jako na začátku, kdy jsme z komponent vraceli řetězec obsahující HTML. Připomeňme si, jak kdysi dávno vypadala jednoduchá verze naší komponenty `ShoppingItem`. - -```js -const ShoppingItem = (props) => { - const { name, amount } = props; - - return ` -
    - ${name} - ${amount} -
    - `; -}; -``` - -V Reactu tutéž komponentu napíšeme tak, že místo řetězce bude vracet JSX element. - -```js -const ShoppingItem = (props) => { - const { name, amount } = props; - - return ( -
    - {name} - {amount} -
    - ); -}; -``` - -Všimněte si důležitých rozdílů: - -1. Nepoužíváme už zpětné apostrofy. Místo toho celé JSX uzavřeme do závorek, aby se nám kód hezky četl. -1. Pokud chceme dovnitř JSX zakomponovat obsah nějaké proměnné, místo `${promenna}` píšeme prostě `{promenna}`. Proti předchozímu zápisu nám tak zmizí znak dolaru. - -Ta nejhezčí věc na Reactu je však způsob, jakým naši komponentu zapojíme do zbytku stránky. Místo toho, abychom složitě používali `innerHTML` nebo `appendChild`, můžeme se tvářít, že naše komponenta je obyčejná HTML značka a `props` jí předat pomocí atributů. Použití komponenty `ShoppingItem` by pak mohlo vypadat takto. - -```js -import React from 'react'; -import { createRoot } from 'react-dom/client'; - -const ShoppingItem = (props) => { - const { name, amount } = props; - - return ( -
    - {name} - {amount} -
    - ); -}; - -createRoot(document.querySelector('#app')).render( - <> -
    -

    Shopping List

    -
    -
    - - - - -
    -
    Martin Podloucký
    - -); -``` - -React se za nás postará o veškerou špinavou práci, kdy hodnoty atributů zabalí do jednoho objektu, pošle jej funkci `ShoppingItem` a výsledek zapojí do naší stránky. diff --git a/daweb/react/uvod-do-reactu/obsah-stranky.md b/daweb/react/uvod-do-reactu/obsah-stranky.md deleted file mode 100644 index b6f55b08..00000000 --- a/daweb/react/uvod-do-reactu/obsah-stranky.md +++ /dev/null @@ -1,78 +0,0 @@ -## Obsah stránky v Reactu - -V tuto chvíli se dostáváme k základnímu principu při vytváření React aplikací. Celý obsah stránky je vždy vytvořen přímo v Reactu. V souboru `index.html` tak už vždy budeme mít pouze element `#app`, do kterého zapojíme obsah vytvořený Reactem. - -Samozřejmě budeme chtít, aby naše aplikace byla zajímavější než jen jeden nadpis. Můžeme tedy zkusit napsat například toto. - -```js -import React from 'react'; -import { createRoot } from 'react-dom/client'; - -createRoot(document.querySelector('#app')).render( -
    -

    React Starter

    -
    -
    -

    Moje první React stránka

    -
    -
    Martin Podloucký
    -); -``` - -Potíž je v tom, že tento kód nám nebude fungovat. Do funkce `render` můžeme poslat pouze jeden JSX element, my se však pokoušíme vytvořit tři najednou. Můžeme to zachránit tak, že náš obsah obalíme do jednoho velkého `divu`. - -```js -createRoot(document.querySelector('#app')).render( -
    -
    -

    React Starter

    -
    -
    -

    Moje první React stránka

    -
    -
    Martin Podloucký
    -
    -); -``` - -Tento postup však s sebou nese nevýhody. Na stránce se nám objeví zbytečný `div`, který může působit problémy při stylování. React proto nabízí speciální JSX element, kterému se říká _fragment_. Tento element vypadá jako prázdná značka, která se na výsledné stránce neobjeví. Slouží pouze k zabalení více elementů do jednoho celku. Výsledná aplikace tedy bude vypadat takto. - -```js -import React from 'react'; -import { createRoot } from 'react-dom/client'; - -createRoot(document.querySelector('#app')).render( - <> -
    -

    React Starter

    -
    -
    -

    Moje první React stránka

    -
    -
    Martin Podloucký
    - -); -``` - -Ještě bychom si obsah stránky mohli uložit do proměnné, aby nám volání funkce `render` nezabíralo tolik prostoru. - -```js -import React from 'react'; -import { createRoot } from 'react-dom/client'; - -const appContent = ( - <> -
    -

    React Starter

    -
    -
    -

    Moje první React stránka

    -
    -
    Martin Podloucký
    - -); - -createRoot(document.querySelector('#app')).render(appContent); -``` - -Všimněte si šikovně použitých kulatých závorek při vytváření proměnné :var[appContent], které nám umožní mít kód hezky čitelný. diff --git a/daweb/react/uvod-do-reactu/prvni-aplikace.md b/daweb/react/uvod-do-reactu/prvni-aplikace.md index 9a526e74..01acc945 100644 --- a/daweb/react/uvod-do-reactu/prvni-aplikace.md +++ b/daweb/react/uvod-do-reactu/prvni-aplikace.md @@ -1,73 +1,39 @@ -Do této chvíle jsem naše aplikace psali v "čistém" (anglicky se též říká "vanilla") JavaScriptu. Postupy, které jsme se dosud naučili, jsou zcela legitimní samy o sobě a můžeme takto psát i větší aplikace. U aplikací, které jsou velmi interaktivní a často mění obsah stránky, však narazíme na různé problémy. +# První React aplikace -- Budeme muset náš kód zodpovědně strukturovat do komponent. Protože všechny komponenty se píší velmi podobně, budeme mít spoustu kódu, který píšeme pořád dokola. -- Zařídit správnou komunikaci mezi velkým množstvím komponent začne být čím dál těžší. -- Při velkém množství komponent je poměrně těžké zajistit dobrý výkon aplikace. +Do této chvíle jsem naše aplikace psali v "čistém" (anglicky se též říká "vanilla") JavaScriptu obohaceném o JSX šablony. Tímto jsme získali velkou průpravu k tomu, konečně si ukázat React, který je na JSX založen. Postupy, které jsme se dosud naučili, jsou zcela legitimní samy o sobě a můžeme takto psát i větší aplikace. U aplikací, které jsou velmi interaktivní a často mění obsah stránky, však narazíme na zásadní problém: -Na tyto problémy tvrdě narazili vývojáři Facebooku, a proto vytvořili framework s názvem [React](https://reactjs.org/), který měl tyto problémy pomoci odstranit. Podobných frameworků existuje vícero. Mezi nejznámější vedle Reactu patří [Angular](https://angular.io/) a [Vue](https://vuejs.org/). Tato trojice je nejpoužívanějšími frameworky pro vývoj webů. V současné době je React stále s přehledem nejpopulárnější a také nejžádanější na trhu práce. +Při změně obsahu stránky je třeba celou stránku znovu načíst, což je pomalé a našikovné. Hlavně u větších stránek se spoustou komponent to může být velmi pomalá operace. Ideálně bychom tedy chtěli překreslit pouze ty části stránky, které se změnily. Například překreslit pouze jednu komponentu nebo pouze její část. -## První React aplikace +Na tento problém kdysi tvrdě narazili vývojáři Facebooku, a proto vytvořili framework s názvem [React](https://reactjs.org/). Podobných reaktivních frameworků existuje vícero. Mezi nejznámější vedle Reactu patří [Angular](https://angular.io/) a [Vue](https://vuejs.org/), ale svoji popularitu si získávají i další, například [Svelte](https://svelte.dev/) nebo [Solid](https://www.solidjs.com/). V současné době je však React stále s přehledem nejpopulárnější a také nejžádanější na trhu práce. -Ať už je to šikovná náhoda nebo dokonale promyšlený plán, velkou část reactových principů už jste v tomto kurzu používali, aniž byste o tom věděli. K vytvoření našeho prvního React projektu tak stačí pouze malinko upravit konfiguraci Webpacku a naučit se psát náš kód reactovým způsobem. +## Založení React projektu -Základní Webpack projekt nastavený pro práci v Reactu si můžete vygenerovat pomocí `npm init kodim-app@latest`. +Ať už je to šikovná náhoda nebo dokonale promyšlený plán, velkou část reactových principů už jste v tomto kurzu používali, aniž byste o tom věděli. K vytvoření prvního React projektu tak stačí pouze malinko upravit konfiguraci Vite a naučit se psát náš kód reactovým způsobem. -```sh -$ npm init kodim-app@latest my-app -``` - -Pozor na to, že tontokrát v příkazu chybí slovíčko `vanilla`. React projekt se používá stejným způsobem, jakým jsme u Webpack projektů zvyklí. Všimněte si však, že místo `index.js` zde máme soubor `index.jsx`. Příponu `.jsx` budeme používat u souborů, které obsahují reactový kód. Co tato přípona znamená, si povíme v následující části. - -### JavaScript XML - -Do této chvíle jsme viděli dva způsoby, jak v JavaScriptu vytvořit obsah stránky. Jedna z možností byla vytvořit řetězec obsahující HTML a ten pak vložit do stránky pomocí `innerHTML`. - -```js -const obsah = '

    Moje stránka

    '; - -const appElm = document.querySelector('#app'); -appElm.innerHTML = obsah; -``` - -Toto řešení je relativně přímočaré, ale má nevýhody v tom, že je těžké udělat obsah interaktivní. Naučili jsme se proto druhý způsob, kdy místo řetězce vytvoříme DOM element. - -```js -const obsah = document.createElement('h1'); -obsah.classList.add('title'); -obsah.textContent = 'Moje stránka'; +Základní Vite projekt nastavený pro práci v Reactu si můžete vygenerovat pomocí -const appElm = document.querySelector('#app'); -appElm.appendChild(obsah); +```bash +npm init kodim-app@latest my-app react ``` -Toto řešení už je praktičtější, kód je však delší a méně přehledný. Zde proto s velkou fanfárou a na alegorickém voze přijíždí React se třetím způsobem, jak vytvářet obsah stránky. +Pozor na to, že tontokrát v příkazu máme místo slova `jsx` slovo `react`. Vite/React projekt se používá stejným způsobem, jakým jsme byli zvyklí u Vite/JSX projektů. Všimněte si však, že tento projekt má malinko jinou strukturu. -```js -const obsah =

    Moje stránka

    ; -``` +### Reactová aplikace a stránky -V tuto chvíli do proměnné :var[obsah] přímo bez obalení uvozovkami ukládáme něco, co vypadá podezřele jako HTML. Není to však přesně HTML, nýbrž takzvané _JSX (JavaScript XML)_. Zápis JSX je velmi podobný jazyku HTML, jsou zde však drobné rozdíly. Například místo atributu `class` se v JSX používá atribut `className`. +Aplikace v Reactu použivají jiný způsob stránkování než jsme byli dosud zvyklí. Do této chvíle jsme používaly takzvaý "multi-page" nebo "server-side" přístup, kdy každá stránka byla samostatný HTML soubor se svým vlastním JavaScriptem. Reactové aplikace však používají takzvaný "single-page" nebo-li "client-side" přístup, kdy máme pouze jeden HTML soubor a všechny stránky jsou komponenty, které se načítají pomocí JavaScriptu/Reactu. -JSX elementy jsou reactová obdoba DOM elementů, které jsme používali ve vanilla JavaScriptu. Jde o zcela nový typ hodnoty, a proto je můžeme stejně jako ostatní hodnoty ukládat do proměnných, předávat funkcím, vracet z funkcí, vkládat do polí i objektů a tak dále. +Tento způsob stránkování si hlouběji probereme v pozdějích lekcích. Nyní nám stačí vědět, že Reactové aplikace mají pouze jeden hlavní HTML soubor `index.html` a jeden hlavní JavaScript soubor `index.jsx`. Ve složce `pages` pak máme pouze jednotlivé komponenty, které se později budou načítat na různých URL adresách. -### Reactová aplikace - -Pokud chceme náš JSX element vložit na stránku, musíme nejdříve v kódu založit reactovou aplikaci. To se dělá pomocí funkce `createRoot`. Této funkci předáme DOM element, uvnitř kterého se bude aplikace vykreslovat. Většinou to bývá `div`, kterému nastavíme `id` na `app`. +V hlavním souboru `index.jsx` máme pouze volání funkce `render` podobně, jako jsme byli dřívě zvyklí, jen místo `render` z balíčku `@czechitas/render` používáme funkci `createRoot` z balíčku `react-dom/client`. Hlavní soubor `index.jsx` tak vypadá takto. ```js import { createRoot } from 'react-dom/client'; +import { HomePage } from './pages/HomePage'; +import './global.css'; -const appRoot = createRoot(document.querySelector('#app')); +createRoot( + document.querySelector('#app'), +).render(); ``` -Na objektu, který nám vrátí funkce `createRoot`, pak zavoláme funkci `render`, které už předáme JSX, které chceme vložit na stránku. - -Aby nám React správně fungoval, musíme ještě na začátku každého souboru s příponou `.jsx` importovat balíček `react`. Celý soubor `index.jsx` tak bude vypadat takto. - -```js -import React from 'react'; -import { createRoot } from 'react-dom/client'; - -const appRoot = createRoot(document.querySelector('#app')); -appRoot.render(

    Moje stránka

    ); -``` +Na objektu, který nám vrátí funkce `createRoot`, pak zavoláme funkci `render`, které už předáme JSX, které chceme vložit na stránku. V souboru `index.html` pak máme pouze prázdný element `
    `, do kterého se vloží náš obsah. diff --git a/daweb/react/uvod-do-reactu/shrnuti.md b/daweb/react/uvod-do-reactu/shrnuti.md new file mode 100644 index 00000000..5e5201ae --- /dev/null +++ b/daweb/react/uvod-do-reactu/shrnuti.md @@ -0,0 +1,7 @@ +## Shrnutí + +Po této lekci byste měli vědět a znát + +- jak založit nový React projekt pomocí `kodim-app`, +- jak v Reactu používat události, +- jak v Reactu používat jedoduchý stav. diff --git a/daweb/react/udalosti-stav/stav-pravidla.md b/daweb/react/uvod-do-reactu/stav-pravidla.md similarity index 53% rename from daweb/react/udalosti-stav/stav-pravidla.md rename to daweb/react/uvod-do-reactu/stav-pravidla.md index d0535b05..95023e80 100644 --- a/daweb/react/udalosti-stav/stav-pravidla.md +++ b/daweb/react/uvod-do-reactu/stav-pravidla.md @@ -1,11 +1,13 @@ ## Pravidla pro práci se stavem -Funkci `useState` můžeme použít v komponentě vícekrát pro několik různých stavových proměnných. Platí však pravidlo, že se při každém renderu musí volat ve stejném pořadí, aby si React mohl vše interně správně propojit. Nemůžeme je tedy použít například uvnitř podmínky `if`. Proměnnou pro stav si můžete pojmenovat libovolně. Je však zvykem, že funkce pro změnu stavu se pojmenovává s prefixem `set` a názvem stavu s prvním velkým písmenem podle pravidel camelCase. Například pro stavovou proměnnou `jeVesely` by se funkce pro změnu pojmenovala `setJeVesely`, pro `teplota` pak `setTeplota` apod. +Funkci `useState` můžeme použít v komponentě vícekrát pro několik různých stavových proměnných. Platí však pravidlo, že se při každém renderu musí volat ve stejném pořadí, aby si React mohl vše interně správně propojit. Nemůžeme je tedy použít například uvnitř podmínky `if`. + +Proměnnou pro stav si můžete pojmenovat libovolně. Je však zvykem, že funkce pro změnu stavu se pojmenovává s prefixem `set` a názvem stavu s prvním velkým písmenem podle pravidel camelCase. Například pro stavovou proměnnou `jeVesely` by se funkce pro změnu pojmenovala `setJeVesely`, pro `teplota` pak `setTeplota` apod. ```js import React, { useState } from 'react'; -const App = () => { +const HomePage = () => { const [pocet, setPocet] = useState(0); return ( diff --git a/daweb/react/udalosti-stav/stav.md b/daweb/react/uvod-do-reactu/stav.md similarity index 78% rename from daweb/react/udalosti-stav/stav.md rename to daweb/react/uvod-do-reactu/stav.md index a6bc8a70..4e654b18 100644 --- a/daweb/react/udalosti-stav/stav.md +++ b/daweb/react/uvod-do-reactu/stav.md @@ -51,3 +51,28 @@ setTankLevel('almost empty'); ``` Tím spustíme přerenderování komponenty s novým stavem, kde v `tankLevel` bude uloženo `'almost emmpty'`. + +### Stav a události + +Nejčastěji měníme stav komponenty v reakci na nějakou událost. Například v komponentě `Auto` můžeme mít tlačítko, které při kliknutí sníží stav nádrže, což sice není příliš realistické, ale pro ilustraci nám to zatím bude stačit. + +```js +import React, { useState } from 'react'; + +const Auto = () => { + const [tankLevel, setTankLevel] = useState('full'); + + const handleClick = () => { + setTankLevel('almost empty'); + }; + + return ( +
    + Tank level: {tankLevel} + +
    + ); +}; +``` + +Po zavolání `setTankLevel` se komponenta takzvaně _překreslí_, též se říká _přerenderuje_. To znamená, že se znovu vykreslí na stránce, tentokrát s novou hodnotu stavu. Takto můžeme zařídit, že se obnoví jen ta část stránky, která se opravdu změnila a nemusíme ji celou znovu načítat, jak jsme byli zvyklí v čistém JavaScriptu s JSX. diff --git a/daweb/react/uvod-do-reactu/udalosti.md b/daweb/react/uvod-do-reactu/udalosti.md new file mode 100644 index 00000000..c7d1f36c --- /dev/null +++ b/daweb/react/uvod-do-reactu/udalosti.md @@ -0,0 +1,43 @@ +## Události + +Základem veškeré interaktivity na webu jsou události. Do této chvíle jsme si již mnohokrát zkusili, jak na události reagovat v čistém JavaScriptu pomocí `addEventListener`. V Reactu máme však život o kus snadnější, neboť funkci pro reakci na událost nastavíme vždy danému JSX elementu přímo jako atribut. + +Takto například zobrazíme upozornění při kliknutí na tlačítko. + +```js +const HomePage = () => { + const handleClick = () => { + alert('ahoj'); + }; + + return ( + + ); +}; +``` + +Náš kód funguje tak, že si posluchač `handleClick` vyrobíme rovnou uvnitř komponenty `HomePage`. Nemusíme už tak používat žádný `querySelector`, abychom se dostali k prvku, na který chceme událost pověsit. Tento posluchač pak vložíme do atributu `onClick`. Všechny atributy pro nám už známé události začínají předponou `on`. Pro další události tedy máme atributy jako `onKeyDown`, `onMouseEnter` apod. + +Podobně jako v čistém JavaScriptu mohou mít naše posluchače jeden parametr, který představuje událost, která právě nastala. Můžeme tak například používat vlastnost `target` podobně, jako jsme to dělali doposud. + +Takto například můžeme sledovat obsah textového políčka. + +```js +const HomePage = () => { + const handleChange = (event) => { + console.log(event.target.value); + }; + + return ; +}; +``` + +### Přímá manipulace s obsahem stránky + +V kurzu JavaScript 1 jsme obsah stránky měnili pomocí funkce `querySelector` a nastavování vlastností jako `textContent`, `className` apod. Později, v kurzu JavaScript 2 jsme přešli na JSX a obsah stránky jsmě změnili tak, že jsem ji celou načetli znova. + +V Reactu se až na velké výjimky nepoužívá žádný ze zmíněných přístupů. K aktualizaci stránky se využije technika, kdy se aktualizuje pouze obsah komponenty, které se nějak změnila data. Všechny ostatní komponenty zůstávají nedotčené. Toto umožňuje opravdu rychlou odezvu stránky a je to hlavní a nejdůležitější myšlenka Reactu, kvůli které vlastně celý React vzniknul. + +Abychom tento způsobn aktualizace mohli používat, budeme potřebovat pochopit nový pojem jménem _stav_. diff --git a/daweb/react/udalosti-stav/volitelne-ulozky.md b/daweb/react/uvod-do-reactu/volitelne-ulozky.md similarity index 100% rename from daweb/react/udalosti-stav/volitelne-ulozky.md rename to daweb/react/uvod-do-reactu/volitelne-ulozky.md From 2c0f2d5daf24c13df41307dfd78d23eb23beb4e0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Podlouck=C3=BD?= Date: Wed, 1 Nov 2023 11:07:27 +0100 Subject: [PATCH 2/3] =?UTF-8?q?Dopln=C4=9Bn=C3=AD=20cvi=C4=8Den=C3=AD=20na?= =?UTF-8?q?=20doma?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- daweb/react/uvod-do-reactu/cvdoma/stav.md | 18 ++++++++++++++++++ .../cvlekce/seznamka/exercise.md | 2 +- daweb/react/uvod-do-reactu/cvlekce/stav.md | 8 +++++--- daweb/react/uvod-do-reactu/cvlekce/udalosti.md | 8 +++++--- daweb/react/uvod-do-reactu/entry.yml | 1 + daweb/react/uvod-do-reactu/ulozky-na-doma.md | 4 ++++ 6 files changed, 34 insertions(+), 7 deletions(-) create mode 100644 daweb/react/uvod-do-reactu/cvdoma/stav.md create mode 100644 daweb/react/uvod-do-reactu/ulozky-na-doma.md diff --git a/daweb/react/uvod-do-reactu/cvdoma/stav.md b/daweb/react/uvod-do-reactu/cvdoma/stav.md new file mode 100644 index 00000000..9303cf36 --- /dev/null +++ b/daweb/react/uvod-do-reactu/cvdoma/stav.md @@ -0,0 +1,18 @@ +--- +title: Procvičování událostí a stavu +demand: 3 +solutionAccess: lock +lead: Pořádně si procvičte práci s událostmi a stavem v Reactu. +--- + +1. Vytvořte si repozitář ze šablony [ulozky-prvni-react](https://github.com/Czechitas-podklady-WEB/ulozky-prvni-react). +1. Otevřete příkazovou řádku ve složce s podklady. +1. Nainstalujte závislosti pomocí `npm install`. +1. Spusťte vývojový server přes `npm run dev`. +1. Postupně projděte soubory `src/Uloha1/index.jsx`, `src/Uloha2/index.jsx`, `…` a vypracujte zadání v komentářích. + + diff --git a/daweb/react/uvod-do-reactu/cvlekce/seznamka/exercise.md b/daweb/react/uvod-do-reactu/cvlekce/seznamka/exercise.md index 81ef1413..dfeb5e4e 100644 --- a/daweb/react/uvod-do-reactu/cvlekce/seznamka/exercise.md +++ b/daweb/react/uvod-do-reactu/cvlekce/seznamka/exercise.md @@ -5,7 +5,7 @@ demand: 2 solutionAccess: lock --- -1. Založte si nový projekt pomocí `npx kodim-app@latest seznamka react`. +1. Založte si nový projekt pomocí `npm init kodim-app@latest seznamka react`. 1. Spusťte vývojový server pomocí `npm run dev`. 1. Prohlédněte si strukturu projektu, všimněte si, kde je hlavní `index.jsx` a kde je komponenta `HomePage`. 1. V komponentě `HomePage` vytvořte obsah představující profil uživatele na seznamce. Můžete se inspirovat následujícím designem: diff --git a/daweb/react/uvod-do-reactu/cvlekce/stav.md b/daweb/react/uvod-do-reactu/cvlekce/stav.md index 5ded2fa2..db33e488 100644 --- a/daweb/react/uvod-do-reactu/cvlekce/stav.md +++ b/daweb/react/uvod-do-reactu/cvlekce/stav.md @@ -1,16 +1,18 @@ --- title: Stav demand: 4 +solutionAccess: lock +lead: Vyzkoušejte si práci se stavem v Reactu. --- 1. Vytvořte si repozitář ze šablony [cviceni-react-stav](https://github.com/Czechitas-podklady-WEB/cviceni-react-stav). 1. Otevřete příkazovou řádku ve složce s podklady. 1. Nainstalujte závislosti pomocí `npm install`. -1. Spusťte vývojový server přes `npm start`. +1. Spusťte vývojový server přes `npm run dev`. 1. Postupně projděte soubory `src/Uloha1/index.jsx`, `src/Uloha2/index.jsx`, `…` a vypracujte zadání v komentářích. -:::solution + diff --git a/daweb/react/uvod-do-reactu/cvlekce/udalosti.md b/daweb/react/uvod-do-reactu/cvlekce/udalosti.md index 83649935..7658f088 100644 --- a/daweb/react/uvod-do-reactu/cvlekce/udalosti.md +++ b/daweb/react/uvod-do-reactu/cvlekce/udalosti.md @@ -1,16 +1,18 @@ --- title: Události demand: 3 +lead: Vyzkoušejte si práci s událostmi v Reactu. +solutionAccess: lock --- 1. Vytvořte si repozitář ze šablony [cviceni-react-udalosti](https://github.com/Czechitas-podklady-WEB/cviceni-react-udalosti). 1. Otevřete příkazovou řádku ve složce s podklady. 1. Nainstalujte závislosti pomocí `npm install`. -1. Spusťte vývojový server přes `npm start`. +1. Spusťte vývojový server přes `npm run dev`. 1. Postupně projděte soubory `src/Uloha1/index.jsx`, `src/Uloha2/index.jsx`, `…` a vypracujte zadání v komentářích. -:::solution + diff --git a/daweb/react/uvod-do-reactu/entry.yml b/daweb/react/uvod-do-reactu/entry.yml index 18ca8243..4365047e 100644 --- a/daweb/react/uvod-do-reactu/entry.yml +++ b/daweb/react/uvod-do-reactu/entry.yml @@ -7,4 +7,5 @@ sections: - stav - stav-pravidla - cv-udalosti-stav + - ulozky-na-doma - shrnuti diff --git a/daweb/react/uvod-do-reactu/ulozky-na-doma.md b/daweb/react/uvod-do-reactu/ulozky-na-doma.md new file mode 100644 index 00000000..7da65e49 --- /dev/null +++ b/daweb/react/uvod-do-reactu/ulozky-na-doma.md @@ -0,0 +1,4 @@ +## Doporučené úložky na doma + +::exc[cvdoma/stav] + From c0a4ebe0e57a41dc448519c2bbb4d4abe1c906dd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Podlouck=C3=BD?= Date: Wed, 1 Nov 2023 11:09:02 +0100 Subject: [PATCH 3/3] QA fixes --- .../react/uvod-do-reactu/cvlekce/seznamka/exercise.md | 4 ++-- daweb/react/uvod-do-reactu/prvni-aplikace.md | 10 ++++------ daweb/react/uvod-do-reactu/udalosti.md | 2 +- daweb/react/uvod-do-reactu/ulozky-na-doma.md | 1 - 4 files changed, 7 insertions(+), 10 deletions(-) diff --git a/daweb/react/uvod-do-reactu/cvlekce/seznamka/exercise.md b/daweb/react/uvod-do-reactu/cvlekce/seznamka/exercise.md index dfeb5e4e..aef4fabb 100644 --- a/daweb/react/uvod-do-reactu/cvlekce/seznamka/exercise.md +++ b/daweb/react/uvod-do-reactu/cvlekce/seznamka/exercise.md @@ -9,7 +9,7 @@ solutionAccess: lock 1. Spusťte vývojový server pomocí `npm run dev`. 1. Prohlédněte si strukturu projektu, všimněte si, kde je hlavní `index.jsx` a kde je komponenta `HomePage`. 1. V komponentě `HomePage` vytvořte obsah představující profil uživatele na seznamce. Můžete se inspirovat následujícím designem: - + ::fig{src=assets/layout.jpg} - + Pokud layout chcete dodržet přesně, stáhněte si [profilový obrázek](assets/photo.jpg). Můžete však návrh vzít pouze jako inspiraci a výsledný vzhled zvolit podle svého uvážení tak, abyste si zvykli na práci s novou strukturou projektu. Můžete také projekt použít jako cvičení na tvorbu komponent, pokud si ještě nejste v tomto dokonale jistí. diff --git a/daweb/react/uvod-do-reactu/prvni-aplikace.md b/daweb/react/uvod-do-reactu/prvni-aplikace.md index 01acc945..37553f5d 100644 --- a/daweb/react/uvod-do-reactu/prvni-aplikace.md +++ b/daweb/react/uvod-do-reactu/prvni-aplikace.md @@ -2,7 +2,7 @@ Do této chvíle jsem naše aplikace psali v "čistém" (anglicky se též říká "vanilla") JavaScriptu obohaceném o JSX šablony. Tímto jsme získali velkou průpravu k tomu, konečně si ukázat React, který je na JSX založen. Postupy, které jsme se dosud naučili, jsou zcela legitimní samy o sobě a můžeme takto psát i větší aplikace. U aplikací, které jsou velmi interaktivní a často mění obsah stránky, však narazíme na zásadní problém: -Při změně obsahu stránky je třeba celou stránku znovu načíst, což je pomalé a našikovné. Hlavně u větších stránek se spoustou komponent to může být velmi pomalá operace. Ideálně bychom tedy chtěli překreslit pouze ty části stránky, které se změnily. Například překreslit pouze jednu komponentu nebo pouze její část. +Při změně obsahu stránky je třeba celou stránku znovu načíst, což je pomalé a našikovné. Hlavně u větších stránek se spoustou komponent to může být velmi pomalá operace. Ideálně bychom tedy chtěli překreslit pouze ty části stránky, které se změnily. Například překreslit pouze jednu komponentu nebo pouze její část. Na tento problém kdysi tvrdě narazili vývojáři Facebooku, a proto vytvořili framework s názvem [React](https://reactjs.org/). Podobných reaktivních frameworků existuje vícero. Mezi nejznámější vedle Reactu patří [Angular](https://angular.io/) a [Vue](https://vuejs.org/), ale svoji popularitu si získávají i další, například [Svelte](https://svelte.dev/) nebo [Solid](https://www.solidjs.com/). V současné době je však React stále s přehledem nejpopulárnější a také nejžádanější na trhu práce. @@ -10,7 +10,7 @@ Na tento problém kdysi tvrdě narazili vývojáři Facebooku, a proto vytvořil Ať už je to šikovná náhoda nebo dokonale promyšlený plán, velkou část reactových principů už jste v tomto kurzu používali, aniž byste o tom věděli. K vytvoření prvního React projektu tak stačí pouze malinko upravit konfiguraci Vite a naučit se psát náš kód reactovým způsobem. -Základní Vite projekt nastavený pro práci v Reactu si můžete vygenerovat pomocí +Základní Vite projekt nastavený pro práci v Reactu si můžete vygenerovat pomocí ```bash npm init kodim-app@latest my-app react @@ -20,7 +20,7 @@ Pozor na to, že tontokrát v příkazu máme místo slova `jsx` slovo `react`. ### Reactová aplikace a stránky -Aplikace v Reactu použivají jiný způsob stránkování než jsme byli dosud zvyklí. Do této chvíle jsme používaly takzvaý "multi-page" nebo "server-side" přístup, kdy každá stránka byla samostatný HTML soubor se svým vlastním JavaScriptem. Reactové aplikace však používají takzvaný "single-page" nebo-li "client-side" přístup, kdy máme pouze jeden HTML soubor a všechny stránky jsou komponenty, které se načítají pomocí JavaScriptu/Reactu. +Aplikace v Reactu použivají jiný způsob stránkování než jsme byli dosud zvyklí. Do této chvíle jsme používaly takzvaý "multi-page" nebo "server-side" přístup, kdy každá stránka byla samostatný HTML soubor se svým vlastním JavaScriptem. Reactové aplikace však používají takzvaný "single-page" nebo-li "client-side" přístup, kdy máme pouze jeden HTML soubor a všechny stránky jsou komponenty, které se načítají pomocí JavaScriptu/Reactu. Tento způsob stránkování si hlouběji probereme v pozdějích lekcích. Nyní nám stačí vědět, že Reactové aplikace mají pouze jeden hlavní HTML soubor `index.html` a jeden hlavní JavaScript soubor `index.jsx`. Ve složce `pages` pak máme pouze jednotlivé komponenty, které se později budou načítat na různých URL adresách. @@ -31,9 +31,7 @@ import { createRoot } from 'react-dom/client'; import { HomePage } from './pages/HomePage'; import './global.css'; -createRoot( - document.querySelector('#app'), -).render(); +createRoot(document.querySelector('#app')).render(); ``` Na objektu, který nám vrátí funkce `createRoot`, pak zavoláme funkci `render`, které už předáme JSX, které chceme vložit na stránku. V souboru `index.html` pak máme pouze prázdný element `
    `, do kterého se vloží náš obsah. diff --git a/daweb/react/uvod-do-reactu/udalosti.md b/daweb/react/uvod-do-reactu/udalosti.md index c7d1f36c..23d9d300 100644 --- a/daweb/react/uvod-do-reactu/udalosti.md +++ b/daweb/react/uvod-do-reactu/udalosti.md @@ -36,7 +36,7 @@ const HomePage = () => { ### Přímá manipulace s obsahem stránky -V kurzu JavaScript 1 jsme obsah stránky měnili pomocí funkce `querySelector` a nastavování vlastností jako `textContent`, `className` apod. Později, v kurzu JavaScript 2 jsme přešli na JSX a obsah stránky jsmě změnili tak, že jsem ji celou načetli znova. +V kurzu JavaScript 1 jsme obsah stránky měnili pomocí funkce `querySelector` a nastavování vlastností jako `textContent`, `className` apod. Později, v kurzu JavaScript 2 jsme přešli na JSX a obsah stránky jsmě změnili tak, že jsem ji celou načetli znova. V Reactu se až na velké výjimky nepoužívá žádný ze zmíněných přístupů. K aktualizaci stránky se využije technika, kdy se aktualizuje pouze obsah komponenty, které se nějak změnila data. Všechny ostatní komponenty zůstávají nedotčené. Toto umožňuje opravdu rychlou odezvu stránky a je to hlavní a nejdůležitější myšlenka Reactu, kvůli které vlastně celý React vzniknul. diff --git a/daweb/react/uvod-do-reactu/ulozky-na-doma.md b/daweb/react/uvod-do-reactu/ulozky-na-doma.md index 7da65e49..db0f7edc 100644 --- a/daweb/react/uvod-do-reactu/ulozky-na-doma.md +++ b/daweb/react/uvod-do-reactu/ulozky-na-doma.md @@ -1,4 +1,3 @@ ## Doporučené úložky na doma ::exc[cvdoma/stav] -

    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 literal 0 HcmV?d00001 diff --git a/daweb/react/uvod-do-reactu/cvlekce/seznamka/exercise.md b/daweb/react/uvod-do-reactu/cvlekce/seznamka/exercise.md new file mode 100644 index 00000000..81ef1413 --- /dev/null +++ b/daweb/react/uvod-do-reactu/cvlekce/seznamka/exercise.md @@ -0,0 +1,15 @@ +--- +title: Seznamka +lead: Vytvořte stránku s profilem uživatele na seznamce. +demand: 2 +solutionAccess: lock +--- + +1. Založte si nový projekt pomocí `npx kodim-app@latest seznamka react`. +1. Spusťte vývojový server pomocí `npm run dev`. +1. Prohlédněte si strukturu projektu, všimněte si, kde je hlavní `index.jsx` a kde je komponenta `HomePage`. +1. V komponentě `HomePage` vytvořte obsah představující profil uživatele na seznamce. Můžete se inspirovat následujícím designem: + + ::fig{src=assets/layout.jpg} + + Pokud layout chcete dodržet přesně, stáhněte si [profilový obrázek](assets/photo.jpg). Můžete však návrh vzít pouze jako inspiraci a výsledný vzhled zvolit podle svého uvážení tak, abyste si zvykli na práci s novou strukturou projektu. Můžete také projekt použít jako cvičení na tvorbu komponent, pokud si ještě nejste v tomto dokonale jistí. diff --git a/daweb/react/udalosti-stav/cvlekce/stav.md b/daweb/react/uvod-do-reactu/cvlekce/stav.md similarity index 100% rename from daweb/react/udalosti-stav/cvlekce/stav.md rename to daweb/react/uvod-do-reactu/cvlekce/stav.md diff --git a/daweb/react/udalosti-stav/cvlekce/udalosti.md b/daweb/react/uvod-do-reactu/cvlekce/udalosti.md similarity index 100% rename from daweb/react/udalosti-stav/cvlekce/udalosti.md rename to daweb/react/uvod-do-reactu/cvlekce/udalosti.md diff --git a/daweb/react/uvod-do-reactu/doporucene-postupy.md b/daweb/react/uvod-do-reactu/doporucene-postupy.md deleted file mode 100644 index 5e7f2bba..00000000 --- a/daweb/react/uvod-do-reactu/doporucene-postupy.md +++ /dev/null @@ -1,110 +0,0 @@ -## Doporučené postupy - -Framework React vznikl ve společnosti Facebook mezi roky 2011 až 2013. Má tedy za sebou již mnoho let používání a za tu dobu se ustálily určité doporučené postupy, jak psát React aplikace. Některé z nich zmíníme již takto na začátku, abychom co nejdříve působili jako profesionálové. - -### Hlavní komponenta - -V Reactu není příliš zvykem psát do funkce `render` příliš obsáhlý kód. Většinou postupujeme tak, že celá naše aplikace je jedna velká komponenta, která pak skládá dohromady další námi napsané komponenty. Této komponentě většinou dáváme název `App`. Kód nákupního seznamu by pak vypadal takto. - -```js -import React from 'react'; -import { createRoot } from 'react-dom/client'; - -const ShoppingItem = (props) => { - const { name, amount } = props; - - return ( -